Großer Unterschied.
Wie der Name schon sagt, double
hat a die doppelte Genauigkeit von [1] . Im Allgemeinen hat a eine Genauigkeit von 15 Dezimalstellen, während a 7 hat.float
double
float
So wird die Anzahl der Ziffern berechnet:
double
hat 52 Mantissenbits + 1 verstecktes Bit: log (2 53 ) ÷ log (10) = 15,95 Stellen
float
hat 23 Mantissenbits + 1 verstecktes Bit: log (2 24 ) ÷ log (10) = 7,22 Stellen
Dieser Präzisionsverlust könnte dazu führen, dass sich größere Wiederholungsfehler ansammeln, wenn wiederholte Berechnungen durchgeführt werden, z
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
Auch der Maximalwert von float ist ungefähr 3e38
, aber double ist ungefähr 1.7e308
, so dass die Verwendung von float
"unendlich" (dh eine spezielle Gleitkommazahl) viel einfacher getroffen werden kann als double
für etwas Einfaches, z. B. die Berechnung der Fakultät von 60.
Während des Testens enthalten möglicherweise einige Testfälle diese großen Zahlen, die dazu führen können, dass Ihre Programme fehlschlagen, wenn Sie Floats verwenden.
Natürlich ist manchmal sogar double
nicht genau genug, daher haben wir manchmal long double
[1] (das obige Beispiel gibt 9.00000000000000000066 auf dem Mac an), aber alle Gleitkommatypen leiden unter Rundungsfehlern , wenn also Präzision sehr wichtig ist (z. B. Geld) Verarbeitung) sollten Sie int
oder eine Bruchklasse verwenden.
Verwenden Sie außerdem nicht +=
viele Gleitkommazahlen, da sich die Fehler schnell ansammeln. Wenn Sie Python verwenden, verwenden Sie fsum
. Versuchen Sie andernfalls, den Kahan-Summationsalgorithmus zu implementieren .
[1]: Die C- und C ++ Standards spezifizieren nicht die Darstellung float
, double
und long double
. Es ist möglich, dass alle drei als IEEE-Doppelgenauigkeit implementiert sind. Für die meisten Architekturen (gcc, MSVC; x86, x64, ARM) float
handelt es sich jedoch tatsächlich um eine IEEE-Gleitkommazahl mit einfacher Genauigkeit (binary32) und double
um eine IEEE-Gleitkommazahl mit doppelter Genauigkeit (binary64).