0

IEEE-754 Float Visualizer

Sehen Sie genau, wie eine Dezimalzahl als IEEE-754-Float gespeichert wird – Vorzeichenbit, Exponentenbits und Mantissenbits – und warum Zahlen wie 0,1 nicht genau gespeichert werden.

Buy Me a Coffee at ko-fi.com
Verarbeitung... 0%
Normalisieren
Berechnung des Exponentenbias
Erweiternde Mantissenbits
Fertig

Ergebnis

Jede Gleitkommazahl, die ein Computer speichert – eine JavaScript-Zahl, eine C-Floatzahl, eine Python-Floatzahl – wird unter IEEE 754 auf die gleiche Weise codiert: ein Vorzeichenbit, ein Block von Exponentenbits und ein Block von Mantissenbits (Bruchbits). Einfache Genauigkeit (32 Bit) verwendet 1 Vorzeichenbit, 8 Exponentenbits und 23 Mantissenbits; Double Precision (64-Bit), das Format hinter dem Standard-Zahlentyp fast jeder Sprache, verwendet 1 Vorzeichenbit, 11 Exponentenbits und 52 Mantissenbits. Dieses Tool nimmt jede von Ihnen eingegebene Dezimalzahl, kodiert sie in beliebiger Breite mit dem browsereigenen DataView/ArrayBuffer-Float-Encoder – der gleichen Maschinerie, auf der Ihr Code tatsächlich läuft – und färbt jedes Bit entsprechend der Region, zu der es gehört.

Die Kodierung selbst erfolgt in drei Schritten, und dieses Tool geht alle Schritte durch, anstatt nur die letzten Teile anzuzeigen. Zuerst die Normalisierung: Die Zahl wird als 1.Mantisse × 2^Exponent umgeschrieben, mit genau einer Ziffer ungleich Null vor dem Binärpunkt (Zahlen, die dafür zu klein sind, erhalten stattdessen die subnormale Behandlung, ohne implizite führende 1). Zweitens Exponenten-Bias: Da das Exponentenfeld sowohl positive als auch negative Exponenten als vorzeichenlose Zahl speichern muss, wird ein fester Bias (127 für einfache Genauigkeit, 1023 für doppelte Genauigkeit) hinzugefügt, bevor das Feld binär ausgeschrieben wird. Drittens wird die gebrochene Mantisse Stück für Stück mit der klassischen Methode „Mit zwei multiplizieren, den ganzzahligen Teil als nächstes Bit nehmen, Rest behalten“ erweitert. Diese Methode wird wiederholt, bis das Mantissenfeld voll ist. An diesem Punkt entscheiden die verbleibenden Bits darüber, ob das Ergebnis auf- oder abgerundet wird (von halb auf gerade runden, die IEEE-754-Standardeinstellung).

Genau aus diesem Grund wird eine so gewöhnliche Zahl wie 0,1 nicht genau gespeichert. Im Binärformat ist 0,1 ein sich wiederholender Bruch (0,0001100110011…, für immer), daher kann ihn keine endliche Mantisse genau halten – er muss irgendwo gerundet werden. Codieren Sie 0,1 als 32-Bit-Float und lesen Sie die Bits zurück, und Sie erhalten nicht 0,1 zurück: Sie erhalten genau 0,100000001490116119384765625. Double Precision verfügt über 29 weitere Mantissenbits, mit denen man arbeiten kann, daher ist der Rundungsfehler viel kleiner, aber auch nicht Null – 0,1 als 64-Bit-Double ist genau 0,1000000000000000055511151231257827021181583404541015625. Dieses Tool berechnet den genauen gespeicherten Wert mit Arithmetik großer Ganzzahlen (keine Gleitkomma-Verknüpfungen), sodass die Lücke zwischen dem, was Sie eingegeben haben, und dem, was die Hardware tatsächlich speichert, niemals ausgeblendet oder angenähert wird.

Spezielle Werte erhalten exakte, reservierte Bitmuster anstelle einer normalen Kodierung: Null und negative Null haben Exponenten- und Mantissenbits, die nur aus Nullen bestehen (nur das Vorzeichenbit unterscheidet sich), ±Infinity hat Exponentenbits, die nur aus Einsen bestehen, mit einer Mantisse, die nur aus Nullen besteht, und NaN hat Exponentenbits aus allen Einsen, wobei mindestens ein Mantissenbit gesetzt ist. Alles hier läuft lokal in Ihrem Browser – nichts, was Sie eingeben, wird irgendwo hochgeladen – was dies zu einem sicheren Ort macht, um echte Intuition für Gleitkomma-Fehler zu entwickeln: warum „0,1 + 0,2 !== 0,3“ in fast jeder Programmiersprache, warum Float32-Texturen im Grafikcode an Präzision verlieren, was bei Float64 nicht der Fall wäre, und warum Finanzcode im Allgemeinen binäre Gleitkommazahlen ganz vermeiden sollte.