c++ - tabelle - unterschied float double java




Was ist der Unterschied zwischen Float und Double? (8)

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


Die Größe der Zahlen in den Float-Point-Berechnungen ist nicht die wichtigste Sache. Es ist die Berechnung, die durchgeführt wird, die relevant ist.

Wenn Sie eine Berechnung durchführen und das Ergebnis eine irrationale Zahl oder eine wiederkehrende Dezimalzahl ist, kommt es zu Rundungsfehlern, wenn diese Zahl in die von Ihnen verwendete Datenstruktur mit endlicher Größe gequetscht wird. Da Double doppelt so groß ist wie Float, ist der Rundungsfehler viel kleiner.

Die Tests verwenden möglicherweise speziell Zahlen, die diese Art von Fehlern verursachen, und testen daher, ob Sie den richtigen Typ in Ihrem Code verwendet haben.


Die integrierten Vergleichsoperationen unterscheiden sich, wenn Sie zum Beispiel 2 Zahlen mit Gleitkommazahlen vergleichen. Der Unterschied im Datentyp (float oder double) kann zu unterschiedlichen Ergebnissen führen.


Großer Unterschied.

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

So wird die Anzahl der Ziffern berechnet:

double hat 52 Mantissen-Bits + 1 verstecktes Bit: log (2 53 ) ÷ log (10) = 15,95 Ziffern

float hat 23 Mantissen-Bits + 1 verstecktes Bit: log (2 24 ) ÷ log (10) = 7,22 Ziffern

Dieser Präzisionsverlust könnte dazu führen, dass Trunkierungsfehler viel leichter aufschwimmen, 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

Der maximale Wert von float ist etwa 3e38 , aber double ist etwa 1.7e308 , daher kann die Verwendung von float viel einfacher als " double " auf "unendlich" (dh eine spezielle Gleitkommazahl) 1.7e308 , z. B. die Berechnung der Fakultät von 60 .

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

Natürlich ist manchmal sogar das double nicht genau genug, daher haben wir manchmal long double [1] (das obige Beispiel gibt 9.000000000000000066 auf Mac an), aber alle Gleitkommatypen leiden unter Rundungsfehlern , wenn also die Präzision sehr wichtig ist (zB Geldverarbeitung) sollten Sie int oder eine Bruchklasse verwenden.

Verwenden Sie außerdem nicht += um viele Fließkommazahlen zu addieren, da sich die Fehler schnell ansammeln. Wenn Sie Python verwenden, verwenden Sie fsum . Versuchen Sie andernfalls, den Kahan-Summenalgorithmus 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-Doppelpräzision implementiert sind. Für die meisten Architekturen (gcc, MSVC; x86, x64, ARM) ist float jedoch tatsächlich eine IEEE-Gleitkommazahl mit einfacher Genauigkeit (binary32) und double eine IEEE-Gleitkommazahl mit doppelter Genauigkeit (binary64).


Hier ist, was die Standards C99 (ISO-IEC 9899 6.2.5 §10) oder C ++ 2003 (ISO-IEC 14882-2003 3.1.9 §8) sagen:

Es gibt drei Gleitkommatypen: float , double und long double . Der Typ double stellt mindestens so viel Genauigkeit wie float bereit, und der Typ long double liefert mindestens so viel Präzision wie double . Die Menge der Werte vom Typ float ist eine Teilmenge der Menge der Werte vom Typ double ; Die Menge der Werte des Typs double ist eine Teilmenge der Menge der Werte des Typs long double .

Der C ++ Standard fügt hinzu:

Die Wertdarstellung von Gleitkommatypen ist implementierungsdefiniert.

Ich würde vorschlagen, einen Blick auf das exzellente Wissen zu werfen, das jeder Informatiker über Fließkomma-Arithmetik wissen sollte , der den IEEE-Gleitkomma-Standard in der Tiefe abdeckt. Sie erfahren etwas über die Darstellungsdetails und erkennen, dass es einen Kompromiss zwischen Größe und Präzision gibt. Die Genauigkeit der Gleitkommadarstellung nimmt mit abnehmender Größe zu, daher sind Gleitkommazahlen zwischen -1 und 1 diejenigen mit der größten Genauigkeit.


Im Gegensatz zu einem int (ganze Zahl) haben ein float einen Dezimalpunkt und ein double . Aber der Unterschied zwischen den beiden ist, dass ein double doppelt so detailliert ist wie ein float , was bedeutet, dass es doppelt so viele Zahlen nach dem Komma haben kann.



Wenn Sie Gleitkommazahlen verwenden, können Sie nicht darauf vertrauen, dass Ihre lokalen Tests genau mit den Tests übereinstimmen, die auf der Serverseite durchgeführt werden. Die Umgebung und der Compiler sind wahrscheinlich auf Ihrem lokalen System unterschiedlich und die letzten Tests werden ausgeführt. Ich habe dieses Problem schon oft in einigen TopCoder Wettbewerben gesehen, besonders wenn man versucht zwei Gleitkommazahlen zu vergleichen.


  • Ein Double ist 64 und Single Precision (Float) ist 32 Bit.
  • Das Double hat eine größere Mantisse (die Integer-Bits der reellen Zahl).
  • Alle Ungenauigkeiten werden im Doppel kleiner sein.






precision