# Gleitkomma visualisieren: IEEE-754, Exponent und Mantisse

> Gleitkommacodierung interaktiv: Vorzeichen, Charakteristik (Exzess-q) und Mantisse Schritt für Schritt, mit Bit-Visualisierung und Rundungsfehler.

Adresse: https://marckimmel.de/informatik/zahlenkodierungen/gleitkomma
English version: https://marckimmel.de/en/informatik/zahlenkodierungen/gleitkomma.md

IEEE-754-Codierung mit Vorzeichen, Charakteristik (EX-q) und Mantisse (FK). Konstanter relativer Fehler.

Die Gleitkomma-Codierung c_(GK,k,n) codiert eine reelle Zahl in normierter Form m · 2^e mit 1 ≤ |m| im Binärsystem. Einige Bitmuster sind reserviert: Charakteristik 0…0 mit Mantisse ≠ 0 sind subnormale Zahlen, Charakteristik 1…1 mit Mantisse = 0 steht für ±∞, Charakteristik 1…1 mit Mantisse ≠ 0 steht für NaN, das All-Null-Bitmuster codiert die Null. Der absolute Rundungsfehler wächst zwar mit dem Exponenten und ist durch 2^e / 2^k beschränkt, dafür bleibt der relative Fehler durch 1 / 2^k konstant. Eine wichtige Stolperfalle ist die nicht-assoziative Addition wegen der Rundung beim Exponentenangleich: zum Beispiel ergibt (2^(-9) + 2^(23)) − 2^(23) in float 0, weil 2^(-9) bei der Addition verschluckt wird. Vergleiche sollten daher immer mit einer Toleranz statt mit == erfolgen.

In C stehen für die Gleitkomma-Codierung die Datentypen float (binary32, k = 24, n = 32, etwa 7 Dezimalstellen Genauigkeit) und double (binary64, k = 53, n = 64, etwa 15 Dezimalstellen) zur Verfügung. long double ist plattformabhängig. Wegen Stellenauslöschung sollten Zahlen nach Größenordnung gruppiert addiert werden, indem kleine Werte zuerst zusammengefasst und dann zur großen Zahl addiert werden. Für exakte Bruchrechnung greift man besser auf Spezial-Libraries wie Rational oder BigDecimal zurück. NaN ist ungleich allem inklusive sich selbst, daher prüft man via isnan(x) statt mit x == NaN.

## Häufige Fragen

### Was ist der Unterschied zwischen Festkomma und Gleitkomma?

Bei der Festkommadarstellung steht das Komma an einer festen Stelle, der absolute Fehler ist überall gleich groß und der Wertebereich klein. Die Gleitkommadarstellung speichert eine Mantisse und einen Exponenten, das Komma gleitet also mit der Größenordnung. Der Wertebereich wird dadurch sehr groß, und der relative Fehler bleibt über alle Größenordnungen gleich.

### Wie ist eine float-Zahl nach IEEE 754 aufgebaut?

Eine float-Zahl (binary32) hat 32 Bit: 1 Vorzeichenbit, 8 Bit Exponent im Exzess-127-Code und 23 Bit Mantisse ohne die führende 1, die durch die Normierung feststeht. Eine double-Zahl (binary64) hat 1 Vorzeichenbit, 11 Bit Exponent im Exzess-1023-Code und 52 Bit Mantisse.

### Warum ergibt 0,1 + 0,2 nicht genau 0,3?

0,1 und 0,2 haben im Binärsystem keine endliche Darstellung, so wie 1/3 im Dezimalsystem. Beide werden auf die nächste darstellbare Zahl gerundet, und die Summe trifft nicht genau die gerundete 0,3. In double ergibt 0,1 + 0,2 deshalb 0,30000000000000004. Gleitkommazahlen vergleicht man daher mit einer Toleranz und nicht mit ==.

## Weiter

- [Zahlenkodierungen](https://marckimmel.de/informatik/zahlenkodierungen.md)
