Wenn ich aus Gründen der Klarheit eine Sprache verwende, die IEE 754-Floats implementiert, erkläre ich:
float f0 = 0.f;
float f1 = 1.f;
... und dann wieder ausdrucken, bekomme ich 0,0000 und 1,0000 - genau.
IEEE 754 ist jedoch nicht in der Lage, alle Zahlen entlang der realen Linie darzustellen. Nahe Null sind die "Lücken" klein; Je weiter Sie entfernt sind, desto größer werden die Lücken.
Meine Frage lautet also: Für einen IEEE 754-Float, welche ist die erste Ganzzahl (am nächsten bei Null), die nicht genau dargestellt werden kann? Ich bin im Moment nur wirklich mit 32-Bit-Floats beschäftigt, obwohl ich interessiert sein würde, die Antwort für 64-Bit zu hören, wenn jemand sie gibt!
Ich dachte, dies wäre so einfach wie das Berechnen von 2 Bits von Mantissa und das Hinzufügen von 1, wobei Bits von Mantissa die Anzahl der Bits sind, die der Standard verfügbar macht. Ich habe dies für 32-Bit-Floats auf meinem Computer (MSVC ++, Win64) getan, und es schien jedoch in Ordnung zu sein.
quelle
Antworten:
2 Mantissenbits + 1 + 1
Die +1 im Exponenten (Mantissenbits + 1) ist, weil, wenn die Mantisse
abcdef...
die Zahl enthält, die sie darstellt, tatsächlich ist1.abcdef... × 2^e
, ein zusätzliches implizites Bit an Genauigkeit bereitgestellt wird.Daher ist die erste Ganzzahl, die nicht genau dargestellt werden kann und gerundet wird, folgende:
Für
float
16.777.217 (2 24 + 1).Für
double
9.007.199.254.740.993 (2 53 + 1).quelle
float
und auf 16.777.217 gesetzt. Aber als ich es damit druckte,cout
ergab sich 16.777.216. Ich benutzeC++
. Warum kann ich nicht 16.777.217 bekommen?(1 << std::numeric_limits<float>::digits) + 1
und in C ,(1 << FLT_MANT_DIG) + 1
. Ersteres ist schön, weil es Teil einer Vorlage sein kann. Fügen Sie nicht +1 hinzu, wenn Sie nur die größte darstellbare Ganzzahl möchten.Der größte Wert, der durch eine n- Bit-Ganzzahl dargestellt werden kann, ist 2 n -1. Wie oben erwähnt, hat a eine
float
Genauigkeit von 24 Bit im Signifikanten, was zu bedeuten scheint, dass 2 24 nicht passen würden.Allerdings .
Potenzen von 2 innerhalb des Bereichs des Exponenten sind genau als 1,0 × 2 n darstellbar , so dass 2 24 passen kann und folglich die erste nicht darstellbare ganze Zahl für
float
2 24 + 1 ist. Wie oben beschrieben. Nochmal.quelle