Verschil tussen Float en Double - Welke moet ik gebruiken? Verschil tussen
(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 combinatie1s 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.
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.
# 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;
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.
# 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.