Welches ist die erste Ganzzahl, die ein IEEE 754 Float nicht genau darstellen kann?

Zur Verdeutlichung, wenn ich eine Sprache verwende, die IEE 754 Floats implementiert, erkläre ich:

float f0 = 0.f; float f1 = 1.f; 

… und drucke sie dann wieder aus, ich bekomme 0,0000 und 1,0000 – genau.

Aber IEEE 754 ist nicht in der Lage, alle Zahlen entlang der realen Linie darzustellen. Nahe bei Null sind die “Lücken” klein; Wenn Sie weiter weg kommen, werden die Lücken größer.

Also, meine Frage ist: für eine IEEE 754 float, die die erste (am nächsten zu Null) Ganzzahl ist, die nicht genau dargestellt werden kann? Ich bin nur wirklich mit 32-Bit-Floats beschäftigt, obwohl ich interessiert sein werde, die Antwort für 64-Bit zu hören, wenn jemand es gibt!

Ich dachte, dies wäre so einfach wie die Berechnung von 2 Bits_von_Mantisse und das Addieren von 1, wobei Bits_von_Mantisse ist, wie viele Bits der Standard aufdeckt . Ich tat dies für 32-Bit-Floats auf meinem Rechner (MSVC ++, Win64), und es schien in Ordnung, obwohl.

2 Mantissenbits + 1 + 1

Das +1 im Exponenten (Mantissenbits + 1) ist, weil, wenn die Mantisse abcdef... enthält abcdef... die Zahl, die es darstellt, tatsächlich 1.abcdef... × 2^e , was ein zusätzliches implizites Bit der Genauigkeit liefert.

Für den float ist es 16.777.217 (2 24 + 1).
Für das double sind es 9.007.199.254.740.993 (2 53 + 1).

 >>> 9007199254740993.0 9007199254740992 

Der größte Wert, der durch eine n- Bit-Ganzzahl dargestellt werden kann, ist 2 n -1. Wie oben erwähnt, hat ein float 24 Bits der Genauigkeit in der Signifikanz, was implizieren würde, dass 2 24 nicht passen würde.

Jedoch .

Potenzen von 2 im Bereich 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.