IEEE-754-Konverter — Dezimalzahl zu Gleitkomma-Bits (32/64 Bit)

Wandelt in beide Richtungen zwischen Dezimalzahlen und IEEE-754-Bitmustern (einfache Genauigkeit 32 Bit oder doppelte Genauigkeit 64 Bit) um. Farblich unterschiedene Vorzeichen, Exponent und Mantisse machen NaN, Unendlich und subnormale Zahlen sofort erkennbar.

Das klassische Beispiel: Warum 0.1 + 0.2 nicht 0.3 ergibt

In JavaScript ergibt `0.1 + 0.2` den Wert `0.30000000000000004`, nicht `0.3`. Ein Blick auf die Bitmuster mit doppelter Genauigkeit erklärt, warum.

Wert Hexadezimal mit doppelter Genauigkeit (64 Bit) Binär mit doppelter Genauigkeit (64 Bit)
0.1 0x3FB999999999999A 0011111110111001100110011001100110011001100110011001100110011010
0.2 0x3FC999999999999A 0011111111001001100110011001100110011001100110011001100110011010
0.3 0x3FD3333333333333 0011111111010011001100110011001100110011001100110011001100110011
0.1 + 0.2 0x3FD3333333333334 0011111111010011001100110011001100110011001100110011001100110100

0.1, 0.2 und 0.3 sind im Binärsystem allesamt unendlich periodische Brüche, sodass keiner von ihnen exakt in die 52-Bit-Mantisse passt und jeder gerundet wird. Da sich die Rundungsfehler von 0.1 und 0.2 nicht zufällig gegenseitig aufheben, weicht ihre Summe am Ende genau ein Bit vom exakten Bitmuster für 0.3 (0x3FD3333333333334) ab. Geben Sie diese Werte oben in den Konverter ein und vergleichen Sie die abschließenden Bits selbst.

Was ist IEEE 754? Gleitkommazahlen als Bits sichtbar machen

Wenn ein Computer eine Dezimalzahl speichert, behält er nicht die eingegebenen Ziffern bei, sondern packt den Wert nach dem IEEE-754-Standard in eine feste Anzahl von Bits, aufgeteilt in Vorzeichen, Exponent und Mantisse. Dieses Werkzeug zeigt Ihnen genau, welche Bits für einen eingegebenen Wert gespeichert werden – sowohl in einfacher Genauigkeit (32 Bit) als auch in doppelter Genauigkeit (64 Bit) – und funktioniert auch umgekehrt: Fügen Sie ein rohes Hexadezimal- oder Binärmuster ein und sehen Sie, welchen Dezimalwert es ergibt.

Im alltäglichen Programmieren muss man sich um diese Ebene meist nicht kümmern, doch genau sie erklärt, warum `0.1 + 0.2` nicht `0.3` ergibt, warum sehr große Ganzzahlen als Gleitkommazahl an Genauigkeit verlieren, und warum sich NaN und Unendlich beim Vergleichen so verhalten, wie sie es tun. Wer Vorzeichen, Exponent und Mantisse für einen echten Wert nebeneinander sieht, kann diese abstrakten Regeln an einem konkreten Beispiel nachvollziehen.

So verwenden Sie dieses Werkzeug

  1. Richtung und Genauigkeit wählen Wählen Sie „Dezimal → Bitmuster“ oder „Bitmuster → Dezimal“ und legen Sie einfache (32 Bit) oder doppelte (64 Bit) Genauigkeit fest.
  2. Wert eingeben Bei Dezimaleingabe können Sie eine beliebige Zahl oder „NaN“/„Infinity“/„-Infinity“ eingeben. Bei Bit-Eingabe verwenden Sie eine mit `0x` versehene Hexadezimalzeichenfolge oder eine Binärzeichenfolge mit der passenden Stellenzahl.
  3. Aufschlüsselung von Vorzeichen, Exponent und Mantisse ablesen Die farblich markierte Bitfolge und eine Detailtabelle zeigen den rohen Exponenten, den Exponenten nach Entfernen des Bias und die vollständige Hexadezimaldarstellung.
  4. Klassifizierungs-Badge prüfen Das Ergebnis wird automatisch als Null, subnormal, normal, Unendlich oder NaN eingestuft, samt kurzer Erklärung, was diese Einstufung bedeutet.
  5. Voreinstellungen und Grenzfälle ausprobieren Nutzen Sie die Schaltflächen für 0,1/0,2/0,3, ±0, ±Infinity und NaN, oder probieren Sie negative sowie extrem große und kleine Zahlen aus.

Tipps für die Nutzung

  • Wandeln Sie 0.1, 0.2 und 0.3 mit doppelter Genauigkeit in Bits um und vergleichen Sie sie mit dem Ergebnis von 0.1+0.2 (0.30000000000000004) — Sie können optisch erkennen, dass sich nur das letzte Bit unterscheidet.
  • Die Eingabe von „-0“ im Dezimalfeld erzeugt ein Bitmuster, bei dem nur das Vorzeichenbit gesetzt ist (anders als bei „+0“). Als Zahlen gilt 0 === -0, aber die Bitdarstellungen sind unterschiedlich.
  • Wenn das Exponentenfeld vollständig null ist, bedeutet eine Mantisse von null tatsächlich null, und eine Mantisse ungleich null bedeutet eine subnormale Zahl — eine spezielle Darstellung, mit der Werte extrem nahe null auf Kosten der Genauigkeit erreicht werden.
  • Das Umschalten zwischen einfacher (32 Bit) und doppelter (64 Bit) Genauigkeit für denselben Wert wie 0.1 zeigt, dass der Rundungsfehler bei einfacher Genauigkeit größer ist.
  • Um ein Bitmuster zurück in einen Dezimalwert zu decodieren, geben Sie entweder eine mit `0x` versehene Hexadezimalzeichenfolge oder eine Binärzeichenfolge mit genau so vielen Stellen wie die gewählte Genauigkeit ein (das Präfix `0b` ist optional).

Wofür dieses Werkzeug nützlich ist

Informatikstudium und Selbststudium

Lehrbücher beschreiben den Aufbau von Gleitkommazahlen abstrakt; hier lässt sich das Gelernte an echten Zahlen überprüfen, etwa für ein Praktikumsprotokoll.

Fehlersuche bei numerischen Präzisionsproblemen

Grenzen Sie ein, warum genau eine Berechnung leicht abweicht, indem Sie den fraglichen Wert eingeben und sein exaktes Bitmuster betrachten – ganz ohne eigenen Code.

Embedded- und Low-Level-Programmierung

Dekodieren Sie einen hexadezimalen Gleitkommawert aus einem Speicherauszug oder Register wieder in eine lesbare Dezimalzahl.

Vorbereitung auf technische Vorstellungsgespräche

Üben Sie Antworten auf Fragen wie „Worin unterscheiden sich einfache und doppelte Genauigkeit auf Bit-Ebene“ anhand eines konkreten Beispiels statt auswendig gelernter Fakten.

„0.1 + 0.2 ≠ 0.3“ jemandem erklären

Zeigen Sie die tatsächlichen Bitmuster nebeneinander, statt nur zu behaupten, dass Rundungsfehler bei Gleitkommazahlen die Ursache sind.

Glossar

IEEE 754
Der internationale Standard, der festlegt, wie Computer Gleitkommazahlen darstellen. 1985 veröffentlicht und von fast jedem float/double-Typ jeder Programmiersprache befolgt.
Vorzeichenbit
Das einzelne Bit, das angibt, ob ein Wert positiv (0) oder negativ (1) ist. Es ist unabhängig von Exponent und Mantisse, weshalb „+0“ und „-0“ als unterschiedliche Bitmuster existieren.
Exponent
Die Bits, die die Skalierung (Größenordnung) des Werts codieren – 8 Bit bei einfacher, 11 Bit bei doppelter Genauigkeit – gespeichert mit addiertem Bias.
Mantisse (Signifikand)
Die Bits, die die signifikanten Stellen des Werts codieren – 23 Bit bei einfacher, 52 Bit bei doppelter Genauigkeit – normalerweise mit einer impliziten führenden 1 interpretiert.
Bias
Ein fester Versatz (127 bei einfacher, 1023 bei doppelter Genauigkeit), der zum Exponenten addiert wird, damit er als einfache vorzeichenlose Ganzzahl gespeichert und verglichen werden kann.
Subnormale Zahl
Ein Bitmuster mit vollständig null gesetztem Exponenten und einer Mantisse ungleich null. Ohne die implizite führende 1 lassen sich Werte näher an null darstellen als bei einer normalen Zahl, allerdings auf Kosten der Genauigkeit.
NaN (Not a Number)
Ein Bitmuster mit vollständig auf eins gesetztem Exponenten und einer Mantisse ungleich null, das durch undefinierte Operationen wie 0/0 oder ∞-∞ entsteht.
Unendlich (Infinity)
Ein Bitmuster mit vollständig auf eins gesetztem Exponenten und einer vollständig auf null gesetzten Mantisse, typischerweise das Ergebnis einer Berechnung, die den darstellbaren Bereich überschreitet.

Häufig gestellte Fragen

0.1, 0.2 und 0.3 sind im Binärsystem allesamt unendlich periodische Brüche, sodass ein Computer jeden von ihnen runden muss, damit er in die endliche Mantisse passt (52 Bit bei doppelter Genauigkeit). Da sich die Rundungsfehler von 0.1 und 0.2 nicht zufällig gegenseitig aufheben, weicht ihre Summe leicht vom exakten Bitmuster für 0.3 ab (0.30000000000000004). Das ist kein Fehler einer bestimmten Sprache — es tritt in jeder IEEE-754-konformen Sprache auf.

Einfache Genauigkeit (float, 32 Bit) verwendet 1 Vorzeichenbit, 8 Exponentenbits und 23 Mantissenbits. Doppelte Genauigkeit (double, 64 Bit) verwendet 1 Vorzeichenbit, 11 Exponentenbits und 52 Mantissenbits. Mehr Mantissenbits ergeben mehr signifikante Stellen (Genauigkeit), und mehr Exponentenbits ergeben einen größeren darstellbaren Bereich. Die meisten Programmiersprachen verwenden standardmäßig doppelte Genauigkeit für ihren Gleitkommatyp.

Es handelt sich um ein Bitmuster, bei dem das Exponentenfeld vollständig null ist, die Mantisse jedoch ungleich null ist. Eine normale Gleitkommazahl besitzt eine implizite führende 1 in ihrer Mantisse, eine subnormale Zahl lässt diese jedoch weg und fixiert stattdessen den Exponenten auf seinen Minimalwert, wodurch Werte dargestellt werden können, die noch näher an null liegen als die kleinste normale Zahl — allerdings auf Kosten etwas an Genauigkeit.

IEEE 754 besitzt ein unabhängiges Vorzeichenbit, sodass selbst wenn Exponent und Mantisse beide vollständig null sind, ein Vorzeichenbit von 0 „+0“ und ein Vorzeichenbit von 1 „-0“ ergibt — zwei unterschiedliche Bitmuster. Numerisch gilt 0 === -0, aber manche Operationen zeigen den Unterschied, etwa dass 1/0 +Infinity ergibt, während 1/-0 -Infinity ergibt.

Beide verwenden ein Bitmuster, bei dem das Exponentenfeld vollständig eins ist. Ist die Mantisse vollständig null, stellt es Unendlich dar (wobei das Vorzeichenbit +Infinity von -Infinity unterscheidet); ist die Mantisse ungleich null, stellt es NaN (Not a Number) dar. Diese entstehen durch mathematisch undefinierte Operationen wie Division durch null oder ∞ - ∞.
Tool-kun

Übrigens – Wie IEEE 754 zu einer gemeinsamen Sprache wurde

Vor 1985 verwendete jeder Computerhersteller seine eigene Gleitkommadarstellung. IBM, DEC, Cray und andere konnten denselben Wert, etwa „0.1“, berechnen und dabei subtil unterschiedliches Rundungsverhalten und darstellbare Wertebereiche erhalten, sodass das Portieren eines numerischen Programms von einer Maschine auf eine andere oft leicht unterschiedliche Ergebnisse lieferte. Um dieses Chaos zu beheben, trieb eine Arbeitsgruppe unter der Leitung von William Kahan von der UC Berkeley — der auch am Design des numerischen Koprozessors Intel 8087 mitgewirkt hatte — die Schaffung eines branchenweiten Standards voran, der 1985 als IEEE 754 veröffentlicht wurde.

Die Kernidee von IEEE 754 besteht darin, eine endliche Anzahl von Bits (32 oder 64) in drei Rollen aufzuteilen — Vorzeichen, Exponent und Mantisse —, um die unendliche Menge der reellen Zahlen anzunähern. Der Exponent übernimmt die Skalierung (wie groß oder klein eine Zahl ist), während die Mantisse die Genauigkeit übernimmt (wie viele signifikante Stellen sie hat), sodass eine feste Anzahl von Bits flexibel sowohl sehr kleine als auch sehr große Größenordnungen abdecken kann. Der Exponent wird mit einem addierten Bias gespeichert (127 bei einfacher, 1023 bei doppelter Genauigkeit), sodass der einfache Vergleich zweier Bitmuster als vorzeichenlose Ganzzahlen genügt, um zu bestimmen, welcher Wert größer ist — und die zusätzliche Komplexität einer vorzeichenbehafteten Darstellung wie des Zweierkomplements vermieden wird.

Nur Brüche, deren Nenner eine Zweierpotenz ist (1/2, 1/4, 3/8 und so weiter), lassen sich binär exakt darstellen. Der Dezimalwert 0.1 ist der Bruch 1/10, und da 10 keine Zweierpotenz ist, wird er zum unendlich periodischen Binärbruch 0.0001100110011... Mit nur einer endlichen Anzahl verfügbarer Mantissenbits muss er irgendwo abgeschnitten und gerundet werden — das ist der grundlegende Grund, warum ein Computer 0.1 nicht exakt darstellen kann. Aus demselben Grund vermeiden Buchhaltungssysteme, die eine exakte Dezimalarithmetik benötigen, in der Regel Gleitkommazahlen zugunsten von Ganzzahlarithmetik oder eines dedizierten Dezimaltyps (wie BCD).

IEEE 754 wurde später 2008 und 2019 überarbeitet und um halbe Genauigkeit (16 Bit), vierfache Genauigkeit (128 Bit) und dezimale Gleitkommaformate erweitert, aber die grundlegende Dreiteilung in Vorzeichen, Exponent und Mantisse sowie die Rundungsmodi sind seit der ursprünglichen Ausgabe von 1985 unverändert geblieben. Da nahezu jeder float/double-Typ jeder Programmiersprache diesem Standard entspricht, taucht die Frage „Warum ist 0.1 + 0.2 nicht gleich 0.3?“ unabhängig von der verwendeten Sprache im Wesentlichen in derselben Form auf.