Forskjell mellom flyt og dobbelt - hvilken skal jeg bruke?

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

Mange nybegynnerprogrammer / studenter som er registrert i datalogi, stiller de vanlige spørsmålene som er relevante for det aktuelle feltet innen datavitenskap som de studerer. De fleste nybegynnerbaner begynner med emnene til nummersystemet som brukes i moderne datamaskiner, inkludert binær , desimal , oktal og hexadecimal < 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 sifre (dvs. i kombinasjonen av

1s og 0s , som 1111 representerer 15 i desimalanlegg), 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 nummersystemet er definert i klasserommet (ofte dårlig), blir studentene fristet til å bevege seg på de forskjellige tallformatene i samme type (f.eks. flytende aritmetikk ) som har bestemt presisjon og talområde. Dermed er de tvunget til å lære nyanser mellom bestemte typer. To av de mest brukte datatyper er Float og Double , og mens de retter seg mot de samme behovene (dvs. flytende aritmetikk ), er det ganske noe forskjell i sin 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.) fraksjoner i binæret. Som de resulterende desimaltallene (f.eks., 20. 123 , 16. 23 , etc.) kan ikke enkelt representeres med et normalt binært format (f.eks. 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 regner med en stor mengde (tenk på tusenvis av 0 i nummeret), 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 matematikkfunksjonene som er angitt i C-språk:

#include

int main () {

float num1 = 1. f / 82;

float num2 = 0;

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

num2 + = num1;

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

dobbelt num3 = 1. 0/82;

double num4 = 0;

for (inti = 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 svake 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:

#include

#include

int main () {

float num1 = sqrt (2382719676512365. 1230112312312312 );

double 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 bedre presisjon.

Alt i alt er det bedre å bruke Double for floating point arithmetic, 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 enkelte GPUer / CPUer fungerer bedre / effektivt i Float-behandling, som i beregningen av vektorer / matrisen, slik at du kanskje trenger å se i manualen / dokumentasjonen for maskinvarespesifikasjonen 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 ( // 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 hvor enkeltpresisjon er raskere enn dobbeltsikkerheten.

  • Din søknad gjør stor bruk av flytende punktaritikk, som tusenvis av tall med tusenvis av 0-tall.
  • Du gjør svært lavt nivå optimalisering. For eksempel bruker du spesielle CPU-instruksjoner (f.eks. 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 som 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!