Forskjellen mellom flyt og dobbel - Hvilken skal jeg bruke?

(Merk: Denne artikkelen forutsetter at leserne vet om grunnleggende innen datavitenskap)

Mange nybegynnerprogrammer / studenter som er med på Computer Science, stiller de vanlige spørsmålene som er relevante for det aktuelle feltet innen datavitenskap som de studerer. De fleste nybegynner kurs starter med temaene til nummersystemet som brukes i moderne datamaskiner, inkludert binær, desimal, oktal og heksadesimale system. Dette er datamaskinnummerformatene som er interne representasjoner av numeriske verdier i datamaskiner (eller kalkulatorer og andre typer digitale datamaskiner). Disse verdiene lagres som "gruppering av biter".

Som vi vet, representerer datamaskiner data i sett med binære siffer (dvs. i kombinasjonen av 1s og 0s, som for eksempel, 1111 representerer 15 i desimalt system), er det fornuftig å lære om de forskjellige tallformatene som brukes til å representere et dynamisk verdierområde, fordi de utgjør de grunnleggende blokkene i beregningen / tallbehandlingen i enhver form for operasjon. Når tallsystemet er definert i klasserommet (ofte dårlig), blir studentene fristet til å bevege seg på de forskjellige tallformatene i samme type (dvs.., flytende punkt aritmetisk) som har bestemt presisjon og nummer rekkevidde. Dermed er de tvunget til å lære nyanser mellom bestemte typer. To av de mest brukte datatyper er Flyte og Dobbelt, og mens de retter seg mot de samme behovene (dvs.., flytende punkt aritmetisk), det er en viss forskjell i deres interne representasjon og den samlede effekten på beregningen i programmet. Det er uheldig at mange programmerere savner nyansene mellom Flat og Double datatyper, og til slutt misbruker dem på steder der de ikke skal brukes i utgangspunktet. Til slutt resulterer i feilberegninger i andre deler av programmet.

I denne artikkelen skal jeg fortelle deg forskjellen mellom flyte og doble med kodeeksemplene i C-programmeringsspråket. La oss komme i gang!

Float vs Double ... Hva er avtalen?

Float og Double er data representasjonen som brukes til flytende punkt aritmetiske operasjoner, tenk på desimaltallene du beregner i matematikklassen, for eksempel, 20,123, 16.23, 10.2, etc., de er ikke hele tall (dvs.., 2, 5, 15, etc.), slik at de krever overveielse av fraksjoner i binæret. Som de resulterende desimaltallene (dvs.., 20,123, 16.23, etc.) kan ikke lett representeres med et normalt binært format (dvs. integer). Hovedforskjellen mellom Float og Double er at den førstnevnte er 32-biters flytpunktdata, mens den sistnevnte er en dobbeltverdig (64-bit) flytende datatype. Dobbel kalles "dobbelt" fordi det er i utgangspunktet en dobbel-presisjon versjon av Float. Hvis du beregner en stor mengde (tenk på tusenvis av 0 i tallet), vil unøyaktighetene bli mindre i Double, og du vil ikke miste mye presisjon.

Det er bedre å utdype ved hjelp av kodeeksemplene. Følgende er operasjonen på Float og Double gjennom mattefunksjonene som er oppgitt i C-språk:

#inkludere

int main ()

float num1 = 1.f / 82;

float num2 = 0;

for (int i = 0; i < 738; ++i)

num2 + = num1;

printf ("% .7g \ n", num2);

dobbelt num3 = 1,0 / 82;

dobbelt num4 = 0;

for (int i = 0; i < 738; ++i)

num4 + = num3;

printf ("%. 15g \ n", num4);

getchar ();

Den skriver ut følgende:

9.000031

8,99999999999983

Her kan du se at den lille forskjellen i nøyaktigheten til Float og Double gir et helt annet svar, selv om Double synes å være mer nøyaktig enn Float.

Følgende er eksemplet på sqrt () -funksjonen i C:

#inkludere

#inkludere

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

dobbelt num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f \ n", num1);

printf ("% f \ n", num2);

getchar ();

Den gir følgende utgang:

48813108.000000

48813109.678778

Her kan du se at svaret i Double har en bedre presisjon.

Alt i alt er det bedre å bruke Double for floating point aritmetikk, da flere standard mattefunksjoner i C opererer på Doble og moderne datamaskiner er ekstremt raske og effektive for doble flytende punktberegninger. Dette fører til å redusere behovet for å bruke Float, med mindre du trenger å operere på mange flytende punktnumre (tenk på store arrayer med tusenvis av 0 i tallene) eller du opererer på et system som ikke støtter dobbelttall presisjonsflytpunkt, så mange GPUer, lavdrevne enheter og visse plattformer (ARM Cortex-M2, Cortex-M4, etc.) støtter ikke Double ennå, så bør du bruke Float. I tillegg er det en ting å huske på at visse GPUer / CPUer fungerer bedre / effektivt i Float-behandling, som i beregningen av vektorer / matrisen, slik at du kanskje trenger å se i manualen / dokumentasjonen for maskinvarespesifikasjon for å bedre bestemme hvilken du skal bruke for en bestemt maskin.

Det er sjelden en grunn til å bruke Float i stedet for Double i koden som målretter mot moderne datamaskiner. Den ekstra presisjonen i Double reduserer, men eliminerer ikke muligheten for avrundingsfeil eller annen presisjon som kan forårsake problemer i andre deler av programmet. Mange matematiske funksjoner eller operatører konverterer og returnerer Dobbel, slik at du ikke trenger å kaste tallene tilbake til Float, da det kan miste presisjonen. For en detaljert analyse av flytende punkt aritmetikk anbefaler jeg deg sterkt å lese denne fantastiske artikkelen (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Sammendrag

Så ... i et nøtteskall:

Steder der du skal bruke Float:

  • Hvis du målretter mot maskinvare der enkel-presisjon er raskere enn dobbel-presisjonen.
  • Din søknad gjør stor bruk av flytende punkt aritmetikk, som tusenvis av tall med tusenvis av 0-tall.
  • Du gjør svært lavt nivå optimalisering. For eksempel bruker du spesielle CPU-instruksjoner (dvs. SSE, SSE2, AVX, etc.) som opererer på flere tall / arrays / vektorer av gangen.

Konklusjon

I denne artikkelen har jeg merket forskjellen mellom Float og Double, og hvilken skal brukes på bestemte steder. Det er vel verdt å bruke Double på de fleste steder blindt, spesielt hvis du målretter mot moderne datamaskiner, da sjansene for lav effektivitet på grunn av bruk av dobbelt flytende punkt aritmetikk er svært lite sannsynlig. Hvis du har spørsmål, kan du spørre i kommentarseksjonen nedenfor!