Großer Unterschied.
Wie der Name schon sagt, doublehat a die doppelte Genauigkeit von [1] . Im Allgemeinen hat a eine Genauigkeit von 15 Dezimalstellen, während a 7 hat.floatdoublefloat
So wird die Anzahl der Ziffern berechnet:
doublehat 52 Mantissenbits + 1 verstecktes Bit: log (2 53 ) ÷ log (10) = 15,95 Stellen
floathat 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 doublefü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 doublenicht 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 intoder 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, doubleund 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).