Verschil tussen Float en Double - Welke moet ik gebruiken?

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

Veel newbie programmeurs / studenten die zijn ingeschreven in Computer Science vragen de veelgestelde vragen die relevant zijn voor het specifieke gebied binnen de informatica die ze bestuderen. De meeste beginnerscursussen beginnen met de onderwerpen van het getalsysteem dat wordt gebruikt in de moderne computers, waaronder de binair, decimale, octaal en hexadecimaal systeem. Dit zijn de computernummerindelingen die de interne representaties zijn van numerieke waarden in computers (of rekenmachines en andere soorten digitale computers). Deze waarden worden opgeslagen als "groepering van bits".

Zoals we weten, vertegenwoordigen computers gegevens in sets van binaire cijfers (d.w.z. in de combinatie van 1s en 0s, zoals, 1111 vertegenwoordigt 15 in het decimale systeem), is het zinvol om te leren over de verschillende getalnotaties die worden gebruikt om een ​​dynamisch bereik van waarden weer te geven, omdat ze de basisblokken vormen van de berekening / nummerverwerking in elke soort bewerking. Als het getallensysteem in de klas is gedefinieerd (vaak slecht), komen studenten in de verleiding om naar de verschillende getalnotaties binnen hetzelfde type te gaan (d.w.z.., drijvende-kommaberekeningen) met een bepaalde precisie en aantalbereiken. Ze worden dus gedwongen om de nuances tussen bepaalde typen te leren. Twee van de meest gebruikte gegevenstypen zijn Vlotter en Dubbele, en terwijl ze zich op dezelfde behoeften richten (d.w.z.., drijvende-kommaberekeningen), er is nogal wat verschil in hun interne weergave en algehele 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 vs Double ... Wat is de deal??

Float en Double zijn de gegevensrepresentatie 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, etc. zijn het geen hele getallen (d.w.z.., 2, 5, 15, etc.), dus ze vereisen de overweging van breuken in het binaire bestand. Als de resulterende decimale getallen (d.w.z.., 20,123, 16.23, enz.) kan niet gemakkelijk worden weergegeven met een normaal binair formaat (d.w.z. geheel getal). 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 je 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 verlies je 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 die worden aangeboden in C-taal:

#include

int main ()

float num1 = 1.f / 82;

floaten num2 = 0;

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

num2 + = num1;

printf ("% .7g \ n", num2);

dubbele num3 = 1,0 / 82;

dubbele num4 = 0;

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

num4 + = num3;

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

getchar ();

Het drukt het volgende af:

9.000031

8,99999999999983

Hier kun je zien dat het kleine verschil in de precisie van Float en Double een 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);

dubbele num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f \ n", num1);

printf ("% f \ n", num2);

getchar ();

Het geeft de volgende output:

48813108.000000

48813109.678778

Hier kun je 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 je moet mogelijk in de hardwarespecificatiehandleiding / documentatie kijken om beter te beslissen 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 op moderne computers is gericht. 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 aritmetiek, raad ik u ten zeerste aan dit geweldige artikel te lezen (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Samenvatting

Dus ... in een notendop:

Plaatsen waar je Float zou moeten gebruiken:

  • Als u hardware aan het richten bent waarbij de enkele precisie sneller is dan de dubbele precisie.
  • Uw applicatie maakt veel gebruik van drijvende-kommaberekeningen, zoals duizenden getallen met duizenden nullen.
  • Je doet een zeer lage optimalisatie. U gebruikt bijvoorbeeld speciale CPU-instructies (bijv. 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 vragen hebt, kun je je dit stellen in het gedeelte 'Opmerkingen' hieronder!