IEEE-754-Float-Visualisierer
Sehen Sie genau, wie eine Dezimalzahl als IEEE-754-Float gespeichert wird – Vorzeichenbit, Exponentenbits und Mantissenbits – und warum Zahlen wie 0,1 nicht exakt gespeichert werden.
🔒 Wird vollständig in Ihrem Browser verarbeitet – nichts, was Sie hier eingeben, wird jemals hochgeladen.
Ergebnis
Jede Gleitkommazahl, die ein Computer speichert — eine JavaScript-Number, ein C-Float, ein Python-Float — ist nach IEEE 754 gleich kodiert: ein Vorzeichenbit, ein Block mit Exponentenbits und ein Block mit Mantissen- (Bruch-) Bits. Einfache Genauigkeit (32 Bit) nutzt 1 Vorzeichenbit, 8 Exponentenbits und 23 Mantissenbits; doppelte Genauigkeit (64 Bit), das Format hinter fast jedem Standard-Zahlentyp einer Sprache, nutzt 1 Vorzeichenbit, 11 Exponentenbits und 52 Mantissenbits. Dieses Tool nimmt jede eingegebene Dezimalzahl, kodiert sie in einer der beiden Breiten mit dem DataView/ArrayBuffer-Float-Encoder des Browsers — derselben Mechanik, auf der Ihr Code tatsächlich läuft — und färbt jedes Bit entsprechend seiner Zugehörigkeit ein.
Die Kodierung selbst folgt drei Schritten, und dieses Tool geht sie alle durch, statt nur die fertigen Bits zu zeigen. Erstens, Normalisierung: Die Zahl wird als 1,Mantisse × 2^Exponent umgeschrieben, mit genau einer von null verschiedenen Ziffer vor dem Binärpunkt (zu kleine Zahlen werden stattdessen subnormal behandelt, ohne implizite führende 1). Zweitens, Exponenten-Bias: Da das Exponentenfeld sowohl positive als auch negative Exponenten als vorzeichenlose Zahl speichern muss, wird vor dem binären Ausschreiben ein fester Bias addiert (127 für einfache Genauigkeit, 1023 für doppelte). Drittens wird die gebrochene Mantisse bitweise mit der klassischen Methode „mit zwei multiplizieren, ganzzahligen Anteil als nächstes Bit nehmen, Rest behalten“ erweitert — wiederholt, bis das Mantissenfeld voll ist; die übrigen Bits entscheiden dann über Auf- oder Abrunden (Round-half-to-even, der IEEE-754-Standard).
Genau deshalb wird eine so gewöhnliche Zahl wie 0,1 nicht exakt gespeichert. Binär ist 0,1 ein periodischer Bruch (0,0001100110011…, unendlich), sodass keine endliche Mantisse ihn präzise fassen kann — irgendwo muss gerundet werden. Kodieren Sie 0,1 als 32-Bit-Float und lesen Sie die Bits zurück, erhalten Sie nicht 0,1, sondern exakt 0,100000001490116119384765625. Doppelte Genauigkeit hat 29 Mantissenbits mehr zur Verfügung, daher ist ihr Rundungsfehler viel kleiner — aber auch nicht null: 0,1 als 64-Bit-Double ist exakt 0,1000000000000000055511151231257827021181583404541015625. Dieses Tool berechnet diesen exakten gespeicherten Wert mit Ganzzahlarithmetik großer Zahlen (ohne Gleitkomma-Abkürzungen), sodass die Lücke zwischen dem, was Sie eintippen, und dem, was die Hardware tatsächlich behält, niemals versteckt oder angenähert wird.
Sonderwerte erhalten exakte, reservierte Bitmuster statt einer normalen Kodierung: Null und negative Null haben ausschließlich Nullen in Exponenten- und Mantissenbits (nur das Vorzeichenbit unterscheidet sich), ±Unendlich hat lauter Einsen im Exponenten bei einer Null-Mantisse, und NaN hat lauter Einsen im Exponenten, wobei mindestens ein Mantissenbit gesetzt ist. Alles hier läuft lokal in Ihrem Browser — nichts von dem, was Sie eintippen, wird irgendwohin hochgeladen — was dies zu einem sicheren Ort macht, um ein echtes Gespür für Gleitkommafehler zu entwickeln: warum `0.1 + 0.2 !== 0.3` in fast jeder Programmiersprache gilt, warum float32-Texturen in Grafikcode an Genauigkeit verlieren, die float64 nicht verlieren würde, und warum Finanzcode binäre Gleitkommazahlen generell meiden sollte.