Forskel mellem flyde og dobbelt - hvilken skal jeg bruge? Forskel mellem
(Bemærk: Denne artikel forudsætter at læserne kender til grundlæggende videnskaber inden for datalogi)
Mange nybegyndere programmerende / studerende, der er indskrevet i datalogi, spørg de ofte stillede spørgsmål, der er relevante for det pågældende felt inden for computervidenskab, som de studerer. De fleste begynderkurser starter med emnerne i det talesystem, der bruges i de moderne computere, herunder binær , decimal , octal og hexadecimal < system. Disse er computernummerformaterne, som er de interne repræsentationer af numeriske værdier i computere (eller regnemaskiner og enhver anden form for digitale computere). Disse værdier gemmes som "gruppering af bits".
Som vi ved, repræsenterer computere data i sæt med binære cifre (dvs. i kombinationen1s og 0s , såsom 1111 repræsenterer 15 i decimalsystemet), giver det mening at lære om de forskellige talformater, der bruges til at repræsentere et dynamisk værdisortiment, 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), er eleverne fristet til at bevæge sig på de forskellige talformater inden for samme type (f.eks. flydende aritmetisk ), der har visse præcisions- og talinterval. Således er de tvunget til at lære nuancerne mellem bestemte typer. To af de mest anvendte datatyper er Float og Double , og mens de er målrettet mod samme behov (dvs. flytende aritmetisk ), er der ret en vis forskel i deres interne repræsentation og den samlede effekt på beregningen i programmet. Det er uheldigt, at mange programmører savner nuancerne mellem flad og dobbelt datatyper og ender med at misbruge dem på steder, hvor de ikke skal bruges i første omgang. I sidste ende resulterer der i fejlberegninger i andre dele af programmet.
Float vs Double … Hvad er aftalen?
Float og Double er den datarepræsentation, der bruges til de flydende aritmetiske operationer, tænk på de decimaltal, som du beregner i matematikklassen, som f.eks.
20. 123 , 16. 23 , 10. 2 , osv., De er ikke hele tal (dvs. 2 , 5 , 15 osv.) fraktioner i binæret. Som de resulterende decimaltal (f.eks., 20, 123 , 16, 23 osv.) kan ikke let repræsenteres med et normalt binært format (f.eks. Integer). Den væsentligste forskel mellem Float og Double er, at den tidligere er floppy point-data med en enkelt præcision (32 bit), mens sidstnævnte er en dobbelt præcision (64-bit) floating point datatype. Dobbelt kaldes "dobbelt", fordi det er dybest set en dobbelt præcisions version af Float. Hvis du beregner en enorm mængde (tænk på tusindvis af 0'er i nummeret), så vil unøjagtighederne være mindre i Double, og du vil ikke miste meget præcision.
#include
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;
for (int i = 0; i <738; ++ i)
num4 + = num3;
printf ("%. 15g n", num4);
getchar ();
}
Den udskriver følgende:
9. 000.031
8. 99999999999983
Her kan du se, at den svage forskel i præcisionen af Float og Double giver et helt andet svar, omend Double synes at være mere præcis end Float.
#include
#include
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
48.813.109. 678778
Her kan du se, at svaret i Double har en bedre præcision.
Alt i alt er det bedre at bruge Double for floating point arithmetic, da flere standard matematiske funktioner i C opererer på Dobbelt og moderne computere er ekstremt hurtige og effektive til Double Floating Point beregninger. Dette fører til at reducere behovet for at bruge Float, medmindre du skal bruge mange flytende punktnumre (tænk på store arrayer med tusindvis af 0'er i tallene) eller du arbejder på et system, der ikke understøtter dobbelt- præcis flydende punkt, så mange GPU'er, lavdrevne enheder og visse platforme (ARM Cortex-M2, Cortex-M4 osv.) understøtter ikke Double endnu, så skal du bruge Float. Derudover er en ting at huske på, at visse GPU'er / CPU'er fungerer bedre / effektivt i Float-behandling, ligesom i beregningen af vektorer / matrix, så du skal muligvis se i manualen / dokumentationen til hardwarespecifikationen for bedre at kunne bestemme hvilken en du skal bruge til en bestemt maskine.
Der er sjældent en grund til at bruge Float i stedet for Double i koden rettet mod moderne computere. Den ekstra præcision i Double reducerer, men eliminerer ikke muligheden 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 kaste numrene tilbage til Float, da det kan tabe præcisionen.For en detaljeret analyse af Floating-point aritmetik anbefaler jeg stærkt dig at læse denne fantastiske artikel (// docs. Oracle. Com / cd / E19957-01 / 806-3568 / ncg_goldberg. Html).
Sammenfatning
Så … i en nøddeskal:
Steder, hvor du skal bruge Float:
Hvis du målretter mod hardware, hvor enkelt præcision er hurtigere end dobbelt præcision.
- Din ansøgning gør meget brug af flydende aritmetik, som tusindvis af tal med tusindvis af 0'er.
- Du laver meget lavt niveau optimering. For eksempel bruger du specielle CPU-instruktioner (f.eks. SSE, SSE2, AVX osv.), Der opererer på flere tal / arrays / vektorer ad gangen.