Forskellen mellem Float og Double - Hvilken skal jeg bruge?

(Bemærk: Denne artikel antager, at læsere kender det grundlæggende inden for datalogi)

Mange nybegynder-programmører / studerende, der er indskrevet i datalogi, stiller de ofte stillede spørgsmål, der er relevante for det bestemte felt inden for det datalogi, de studerer. De fleste begynderkurser starter med emnerne i det nummersystem, der bruges i de moderne computere, inklusive binær, decimal, oktal og hexadecimal system. Dette er computernummerformaterne, der er de interne repræsentationer af numeriske værdier i computere (eller regnemaskiner og enhver anden slags digitale computere). Disse værdier gemmes som "gruppering af bits".

Som vi ved, repræsenterer computere data i sæt binære cifre (dvs. i kombinationen af 1s og 0'er, såsom, 1111 Repræsenterer 15 i decimal system) giver det mening at undervise om de forskellige talformater, der bruges til at repræsentere et dynamisk interval af værdier, fordi de udgør de grundlæggende blokke i beregningen / talbehandlingen i enhver form for operation. Når talesystemet er defineret i klasseværelset (ofte dårligt), fristes de studerende til at gå over i de forskellige nummeformater inden for samme type (dvs.., flydende aritmetik) der har et bestemt præcisions- og talinterval. Således tvinges de til at lære nuancerne mellem visse typer. To af de mest anvendte datatyper er Flyde og Dobbelt, og mens de målretter mod de samme behov (dvs.., flydende aritmetik), er der en ganske forskel i deres interne repræsentation og den samlede effekt på beregningen i programmet. Det er uheldigt, at mange programmerere går glip af nuancerne mellem flad- og dobbeltdatatyper og ender med at misbruge dem på steder, hvor de ikke skal bruges i første omgang. I sidste ende resulterer det i forkerte beregninger i andre dele af programmet.

I denne artikel vil jeg fortælle dig forskellen mellem float og dobbelt med kodeeksemplerne i programmeringssprog C. Lad os komme igang!

Float vs Double ... Hvad er der??

Float og Double er datarepræsentationen, der bruges til flydende aritmetiske operationer, tænk på de decimaler, du beregner i matematikklassen, f.eks., 20,123, 16.23, 10.2, osv., de er ikke hele tal (dvs.., 2, 5, 15, osv.), så de kræver overvejelse af fraktioner i det binære. Som det resulterende decimaltal (dvs.., 20,123, 16.23, osv.) kan ikke let repræsenteres med et normalt binært format (dvs. heltal). Den største forskel mellem Float og Double er, at førstnævnte er den enkelt præcision (32-bit) flydepunktdata, mens den sidstnævnte er dobbelt præcision (64-bit) flydepunkt datatype. Double kaldes “dobbelt”, fordi det dybest set er en dobbelt præcisionsversion af Float. Hvis du beregner et enormt beløb (tænk på de tusinder af 0'er i antallet), vil unøjagtighederne være mindre i dobbeltværdien, og du mister ikke meget præcision.

Det er bedre at uddybe ved hjælp af kodeeksemplerne. Følgende er handlingen på Float og Double gennem de matematiske funktioner, der leveres på C-sprog:

#omfatte

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 ();

Det udskriver følgende:

9.000031

8,99999999999983

Her kan du se, at den lille forskel i præcision af Float og Double giver et helt andet svar, omend Double synes at være mere nøjagtigt end Float.

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

#omfatte

#omfatte

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

dobbelt num2 = sqrt (2382719676512365.1230112312312312);

printf (“% f \ n”, num1);

printf (“% f \ n”, num2);

getchar ();

Det giver følgende output:

48813108.000000

48813109.678778

Her kan du se, at svaret i Double har en bedre præcision.

Alt i alt er det bedre at bruge Double til flydende aritmetik, da adskillige standard matematikfunktioner i C fungerer på dobbelt og moderne computere er ekstremt hurtige og effektive til dobbelt flydepunktberegninger. Dette fører til at reducere behovet for at bruge Float, medmindre du har brug for at operere på en masse flydende numre (tænk på store matriser med tusinder af 0'er i antallet), eller du opererer på et system, der ikke understøtter dobbelt- præcision flydende punkt, da mange GPU'er, lavt drevne enheder og visse platforme (ARM Cortex-M2, Cortex-M4 osv.) ikke understøtter dobbelt endnu, så skal du bruge Float. Derudover er en ting at huske, at visse GPU'er / CPU'er fungerer bedre / effektivt i Float-behandling, ligesom i beregningen af ​​vektorer / matrix, så du skal muligvis se i hardwarespecifikationsmanualen / dokumentationen for bedre at bestemme, hvilken du skal bruge til en bestemt maskine.

Der er sjældent en grund til at bruge Float i stedet for Double i koden, der er målrettet mod moderne computere. Den ekstra præcision i Double reducerer, men fjerner ikke chancen for afrundingsfejl eller anden upræcision, der kan forårsage problemer i andre dele af programmet. Mange matematiske funktioner eller operatører konverterer og returnerer Double, så du behøver ikke at caste numrene tilbage til Float, da det kan miste præcisionen. For en detaljeret analyse af flydende aritmetik anbefaler jeg dig meget at læse denne fantastiske artikel (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Resumé

Så… i et nøddeskal:

Steder, hvor du skal bruge Float:

  • Hvis du målretter mod hardware, hvor enkeltpræcision er hurtigere end dobbeltpræcisionen.
  • Din applikation bruger kraftigt flydende aritmetik, ligesom tusinder af numre med tusinder af 0'er.
  • Du laver meget lavt niveau optimering. For eksempel bruger du specielle CPU-instruktioner (dvs. SSE, SSE2, AVX osv.), Der fungerer på flere tal / arrays / vektorer ad gangen.

Konklusion

I denne artikel har jeg fremhævet forskellen mellem Float og Double, og hvilken der skal bruges på bestemte steder. Det er vel, at det er bedre at bruge Double de fleste steder blindt, især hvis du er målrettet mod moderne computere, da chancerne for lav effektivitet på grund af brugen af ​​dobbelt flydende aritmetik er meget usandsynlige. Hvis du har spørgsmål, kan du stille i kommentarafsnittet nedenfor!