Tools & Thoughts

IEEE-754 Konverter für Fließkommazahlen

Translations: en

Diese Webseite dient zur Umrechnung zwischen der Dezimaldarstellung von Zahlen (z.B. "1.02") und den von modernen CPUs verwendeten IEEE 754-Fließkommazahlen. Aus Platzgründen werden nur Zahlen mit einfacher Genauigkeit (32 Bit) dargestellt. Diese Seite soll dem besseren Verständnis von Fließkommazahlen dienen.

Update

Der Konverter wurde Anfang 2024 umgestellt und arbeitet jetzt vollständig Client-seitig. Es wird ein Browser benötigt, der "Web-Assembler" unterstütz. Die Umstellung kann zu einer anderen Verhalten bei der Darstellung von Zahlen führen. Dafür sollte die Darstellung bei Änderungen schneller aktualisiert werden.


Diese Webseite soll dabei helfen, die Darstellung von Zahlen im IEEE-754-Format ("float") zu verstehen. Dieses Zahlenformat wird von allen gängigen CPUs für Berechnungen mit nicht-ganzzahligen Werten verwendet. Aufgrund der Nutzung von Binärwerten können dabei Abweichungen zwischen Zahlen zustande kommen, die im Dezimalsystem leicht darstellbar sind, und den entsprechenden IEEE-754-Zahlen. Ein gutes Beispiel hierfür ist die Zahl "0.1". Die Konvertierung ist auf 32-Bit Fließkommazahlen beschränkt, der IEEE-754-Standard unterstützt aber auch Zahlen mit höherer Genauigkeit.

  • Benutzung:

    Der Konverter dient zur Umrechnung von IEEE-754 Zahlen mit 32-Bit Genauigkeit (single precision). Für Ein- bzw. Ausgabe steht einerseits eine Leiste mit Buttons für jedes einzelne Bit, andererseits diverse Textfelder zur Verfügung. Eingaben in den Textfeldern müssen mit Return abgeschlossen werden, die Anzeige in allen anderen Feldern wird dann aktualisiert. Als zusätzliche Information erscheint der Wert der Floatzahl nach Umwandlung in doppelte Genauigkeit, so dass eventuelle, in der normalen Dezimaldarstellung nicht ersichtliche Rundungsfehler leicht erkannt werden können.

  • Besondere Werte:

    Als Eingabe im Dezimalfeld werden auch die Worte "Infinity", "-Infinity" sowie "NaN" erkannt und umgewandelt. Fü "NaN" sind verschiedene Binärdarstellungen zulässig. Zu beachten ist auch, dass es sowohl eine +0 als auch eine -0 gibt.

  • Umrechnung:

    Allgemein ergibt sich der Wert einer IEEE-754-Zahl als:

    Vorzeichen * 2exponent * mantisse

    Das Vorzeichen wird aus Bit 32 gebildet. Der Exponent ergibt sich aus Bits 24-31 durch Subtraktion von 127. Die Mantisse wird aus den restlichen Bits gebildet, wobei eine nicht dargestellte 1 vorangestellt wird. Die tatsächlich dargestellten Bits entsprechen den Nachkommastellen (Wertigkeit 1/2, 1/4, ...), so dass der Wert zwischen 1 und 2 liegt. Eine Ausnahme sind Zahlen mit einem Exponent von -127 (binär 00000000), hier wird für einen fließenden Übergang zum Wert 0.0 hin auf die implizite 1 in der Mantisse verzichtet. Andere Wertebereiche für die Mantisse sind durch Anpassung des Offsets des Exponenten ebenfalls möglich.

  • Underflow:

    Ein Exponent mit minimalen Wert (0) wird als Indikator für einen Underlow genutzt. Der Wert des Exponenten wird dann als 2-126 gesetzt, und der Wertebereich der Mantisse auf [0:1) gesetzt. Dies erlaubt einen fließenden Übergang bis zum Wert 0.
    Hinweis: Der Konverter hat früher in diesem Fall den Exponenten als -127 und den Wertebereich der Mantisse als [0:2) angezeigt. Dies stellt den gleichen Wert dar. Da dies aber zu Verwirrungen geführt hat, wurde die Anzeige geändert (2015-09-26).

  • Rundungsfehler:

    Bei Eingabe von "0.1" kann man sehr gut sehen, dass diese Zahl nicht exakt als Fließkommazahl darstellbar ist. Vor allem beim Ändern des letzten Bits wird dies in der Anzeige des entsprechenden double-Wertes deutlich.

  • Andere Darstellungen:

    Die hexadezimale Darstellung zeigt nur den Integer-Wert der dargestellten Binäfolge. Dies sollte nicht mit der hexadezimalen Darstellung von Fließkommazahlen wie 0xab.12ef verwechselt werden.

  • FAQ (Frequently Asked Questions):

    • Ich benötige den Source-Code, weil ich selber eine Konvertierungsroutine von Format X in Format Y programmieren möchte. Können Sie ihn mir schicken?

      Der Source-Code für das Applet beinhaltet selber keine Konvertierungsroutinen für IEEE754. Die Umwandlung einer Fließkommazahl in ihr Bitmuster ist auch nur eine andere Interpretation des gleichen Speicherinhalts, die etwa in C/C++ mit typecasts zu erreichen ist. In Java kann die Methode java.lang.Float.floatToIntBits benutzt werden. Die Umwandlung zwischen einem String (beispielsweise dem 7 Zeichen langen String "3.14159") in eine Fließkommazahl (mit 32-Bit) wird ebenfalls von Bibliotheksroutinen ausgeführt. Details hierzu lassen sich beispielsweise in dem Sourcecode für Standard C-Bibliotheken herausfinden (etwas der GNU libc, FreeBSD libc oder uclibc - bitte auch die entsprechenden Lizenzen beachten), aber das ist etwa komplizierter.

    • Meine eigene Konvertierung kommt aber zu einem anderen Ergebnis, der Konverter muss falsch sein!

      (OK, das ist nich wirklich eine Frage, aber solche Mails kommen auch gelegentlich). Prinzipiell können natürlich auch bei dem Konverter-Applet Fehler nicht ausgeschlossen werden, allerdings sind die verwendeten Bibliotheksroutinen (siehe oben) ziemlich zuverlässig und genau. Bisher waren bei genauerer Betrachtung immer die anderen Konvertierungen ungenauer. In der Regel sind das ohnehin nur Abweichungen im letzten Bit, es empfiehlt sich mal die Differenz des Double-Precision-Wertes und der gewünschten Dezimalzahl bei den beiden in Frage kommenden Bitmustern zu betrachten.

  • Hinweis: Berichte zu Problemen mit dem Konverter bitte hier melden.