Forskjell mellom flyt og dobbelt - hvilken skal jeg bruke? Forskjellen mellom
(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 av1s 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.
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.
#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;
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.
#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.