Verschil tussen Float en Double - Welke moet ik gebruiken? Verschil tussen

Anonim

(Opmerking: dit artikel veronderstelt dat lezers op de hoogte zijn van de basisprincipes van informatica)

Veel programmeurs / studenten van nieuwe programmeurs / studenten die zijn ingeschreven in de informatica, stellen de veelgestelde vragen die relevant zijn voor het specifieke vakgebied binnen de informatica die zij bestuderen. De meeste beginnerscursussen beginnen met de onderwerpen van het getalsysteem dat wordt gebruikt in de moderne computers, waaronder het binaire , decimale , octale en hexadecimale < systeem. Dit zijn de computernummerindelingen die de interne representaties zijn van numerieke waarden in computers (of rekenmachines en alle andere soorten digitale computers). Deze waarden worden opgeslagen als "groepering van bits".

Zoals we weten, vertegenwoordigen computers gegevens in sets van binaire cijfers (bijv. In de combinatie

1s en 0s , zoals 1111 staat voor 15 in decimaal systeem), is het zinvol om te leren over de verschillende getalnotaties die worden gebruikt om een ​​dynamisch bereik van waarden te vertegenwoordigen, omdat ze de basisblokken vormen voor de berekening / nummerverwerking in elke vorm van operatie. Zodra het getallensysteem in het klaslokaal is gedefinieerd (vaak slecht), komen leerlingen in de verleiding om naar de verschillende getalnotaties binnen hetzelfde type (d.w.z. drijvende-kommaberekeningen ) te gaan die een bepaalde precisie en aantalbereiken hebben. Ze worden dus gedwongen om de nuances tussen bepaalde typen te leren. Twee van de meest gebruikte gegevenstypen zijn Float en Double , en terwijl ze op dezelfde behoeften zijn gericht (dat wil zeggen floating-point aritmetiek ), zijn er vrij enig verschil in hun interne representatie en algeheel effect op de berekening in het programma. Het is jammer dat veel programmeurs de nuances tussen platte en dubbele gegevenstypen missen en uiteindelijk misbruiken op plaatsen waar ze in de eerste plaats niet zouden moeten worden gebruikt. Uiteindelijk resulteert dit in misrekeningen in andere delen van het programma.

In dit artikel ga ik je het verschil vertellen tussen float en double met de codevoorbeelden in de C-programmeertaal. Laten we beginnen!

Float versus Double … Wat is de deal?

Zweven en dubbel zijn de gegevensrepresentaties die worden gebruikt voor rekenkundige bewerkingen met drijvende komma, denk aan de kommagetallen die u in de wiskundeklasse berekent, zoals

20. 123 , 16. 23 , 10. 2 , enz., Het zijn geen hele getallen (bijv. 2 , 5 , 15 , enz.), Dus zij vereisen de overweging van breuken in het binaire bestand. Als de resulterende decimale getallen (dat wil zeggen 20. 123 , 16. 23 , enz.) kan niet gemakkelijk worden weergegeven met een normaal binair formaat (dat wil zeggen, Integer). Het belangrijkste verschil tussen Float en Double is dat de eerste de floating-pointgegevens met één precisie (32-bits) is, terwijl de laatste een gegevenstype met een drijvende-kommagegevens met dubbele precisie (64-bits) is. Dubbel wordt "dubbel" genoemd omdat het in feite een dubbele precisie-versie van Float is. Als u een enorm bedrag aan het berekenen bent (denk aan de duizenden 0's in het getal), dan zijn de onnauwkeurigheden kleiner in de Double en verliest u niet veel precisie.

Het is beter om uit te werken met behulp van de codevoorbeelden. Het volgende is de bewerking op Float en Double via de wiskundige functies in C-taal:

# include

int main () {

float num1 = 1. f / 82;

float num2 = 0;

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

num2 + = num1;

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

dubbel num3 = 1. 0/82;

dubbel num4 = 0;

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

num4 + = num3;

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

getchar ();

}

Het drukt het volgende af:

9. 000.031

8. 99999999999983

Hier kunt u zien dat het kleine verschil in de precisie van Float en Double een geheel ander antwoord geeft, hoewel Double nauwkeuriger lijkt te zijn dan Float.

Hierna volgt het voorbeeld van de functie sqrt () in C:

# include

# include

int main () {

float num1 = sqrt (2382719676512365. 1230112312312312);

dubbel num2 = sqrt (2382719676512365. 1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Geeft de volgende uitvoer:

48813108. 000000

48.813.109. 678778

Hier kunt u zien dat het antwoord in Double een betere precisie heeft.

Al met al is het beter om Double te gebruiken voor drijvende-kommaberekeningen, omdat verschillende standaard wiskundige functies in C werken op Double en moderne computers extreem snel en efficiënt zijn voor dubbele drijvende-kommaberekeningen. Dit leidt tot minder noodzaak om Float te gebruiken, tenzij u veel drijvende-kommagetallen moet gebruiken (denk aan grote arrays met duizenden nullen in de cijfers) of u werkt op een systeem dat geen dubbele precisie drijvende komma, zoals veel GPU's, low-powered apparaten en bepaalde platforms (ARM Cortex-M2, Cortex-M4, etc.) ondersteunen nog geen Double, dan zou u Float moeten gebruiken. Bovendien is een ding om te onthouden dat bepaalde GPU's / CPU's beter / efficiënter werken in Float-verwerking, zoals in de berekening van vectoren / matrix, dus moet je misschien in de hardwarespecificatiehandleiding / documentatie kijken om beter te bepalen welke je moet gebruiken voor een bepaalde machine.

Er is zelden een reden om Float in plaats van Double te gebruiken in de code die is gericht op moderne computers. De extra precisie in Double vermindert, maar neemt niet weg, de kans op afrondingsfouten of andere onnauwkeurigheden die problemen kunnen veroorzaken in andere delen van het programma. Veel wiskundige functies of operatoren converteren en retourneren dubbel, dus u hoeft de getallen niet terug te zetten naar Float, omdat hierdoor de precisie kan afnemen.Voor een gedetailleerde analyse van Floating-point aritmetica, raad ik u ten zeerste aan om dit geweldige artikel te lezen (// docs.oracle.com / cd / E19957-01 / 806-3568 / ncg_goldberg. Html).

Samenvatting

Dus … kort samengevat:

Plaatsen waar u Float zou moeten gebruiken:

Als u hardware richt waarbij de precisie met één precisie sneller is dan met de dubbele precisie.

  • Uw toepassing maakt veel gebruik van drijvende-kommaberekeningen, zoals duizenden getallen met duizenden nullen.
  • U doet een zeer lage optimalisatie. U gebruikt bijvoorbeeld speciale CPU-instructies (d.w.z. SSE, SSE2, AVX, enz.) Die tegelijkertijd werken op meerdere nummers / arrays / vectoren.
Conclusie

In dit artikel heb ik het verschil tussen Float en Double aangegeven en welke op specifieke plaatsen moet worden gebruikt. Het is aantoonbaar beter om Double op de meeste plaatsen blind te gebruiken, vooral als je op moderne computers gericht bent, aangezien de kans op lage efficiëntie als gevolg van het gebruik van dubbele drijvende-kommaberekeningen hoogst onwaarschijnlijk is. Als je nog vragen hebt, kun je dit stellen in het commentaar hieronder!