Was ist der Unterschied zwischen Float und Double?

Was ist der Unterschied zwischen Float und Double?


Ich habe über den Unterschied zwischen doppelter und einfacher Genauigkeit gelesen. In den meisten Fällen jedoch float und double scheinen austauschbar zu sein, d. h. die Verwendung des einen oder anderen scheint die Ergebnisse nicht zu beeinflussen. Ist dies wirklich der Fall? Wann sind Floats und Doubles austauschbar? Was sind die Unterschiede zwischen ihnen?


Antworten:


Riesiger Unterschied.


Wie der Name schon sagt, ein double hat die doppelte Genauigkeit von float [1] . Im Allgemeinen ein double hat eine Genauigkeit von 15 Dezimalstellen, während float hat 7.


So wird die Anzahl der Ziffern berechnet:



Dieser Genauigkeitsverlust kann dazu führen, dass sich bei wiederholten Berechnungen größere Abschneidefehler ansammeln, z. B.


float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g\n", b); // prints 9.000023

während


double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g\n", b); // prints 8.99999999999996

Außerdem beträgt der maximale Wert von Float etwa 3e38 , aber Double ist etwa 1.7e308 , also mit float viel einfacher als double "unendlich" (d. h. eine spezielle Fließkommazahl) treffen kann für etwas einfaches, z. Berechnung der Fakultät von 60.


Während des Testens enthalten einige Testfälle möglicherweise diese riesigen Zahlen, die dazu führen können, dass Ihre Programme fehlschlagen, wenn Sie Gleitkommazahlen verwenden.



Natürlich manchmal sogar double ist nicht genau genug, daher haben wir manchmal long double [1] (das obige Beispiel ergibt 9,000000000000000066 auf dem Mac), aber alle Fließkommatypen leiden unter Rundungsfehlern , wenn also Genauigkeit sehr wichtig ist (z. B. Geldverarbeitung), sollten Sie int verwenden oder eine Bruchklasse.



Verwenden Sie außerdem nicht += viele Fließkommazahlen zu summieren, da sich die Fehler schnell anhäufen. Wenn Sie Python verwenden, verwenden Sie fsum . Versuchen Sie andernfalls, den Kahan-Summierungsalgorithmus zu implementieren.



[1]:Die C- und C++-Standards spezifizieren nicht die Darstellung von float , double und long double . Es ist möglich, dass alle drei als IEEE-Double-Precision implementiert sind. Dennoch gilt für die meisten Architekturen (gcc, MSVC; x86, x64, ARM) float ist in der Tat eine IEEE-Gleitkommazahl mit einfacher Genauigkeit (binary32) und double ist eine IEEE-Gleitkommazahl mit doppelter Genauigkeit (binary64).