Gleitkomma
IEEE-754-Codierung mit Vorzeichen, Charakteristik (EX-q) und Mantisse (FK). Konstanter relativer Fehler.
Eingaben oben setzen und Berechnen drücken, dann wird die Schritt-für-Schritt-Rechnung angezeigt.
Funktionsweise und Bereich
Die Gleitkomma-Codierung cGK,k,n codiert eine reelle Zahl in normierter Form m · 2e mit 1 ≤ |m| < 2. Die n Bit teilen sich auf in 1 Bit Vorzeichen, n − k Bit Charakteristik (EX-q mit q = 2n-k-1 − 1) und k − 1 Bit Mantisse (Festkomma ohne führende 1, da diese durch die Normierung implizit ist). Codiert wird, indem man zuerst normiert, dann das Vorzeichenbit setzt, anschließend den Exponenten als cEX-q,n-k(e) und schließlich |m| − 1 als cFK,k-1,k-1 codiert und alles aneinanderhängt. Bei der Decodierung liest man das Vorzeichen aus Bit n − 1, den Exponenten via EX-q-Decodierung und die Mantisse als 1.<Mantissenbits> 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 2e / 2k beschränkt, dafür bleibt der relative Fehler durch 1 / 2k konstant. Eine wichtige Stolperfalle ist die nicht-assoziative Addition wegen der Rundung beim Exponentenangleich: zum Beispiel ergibt (2-9 + 223) − 223 in float 0, weil 2-9 bei der Addition verschluckt wird. Vergleiche sollten daher immer mit einer Toleranz statt mit == erfolgen.
Rundungsfehler
Bei der Gleitkomma-Codierung wächst der absolute Fehler mit dem Exponenten, dafür bleibt der relative Fehler durch eine Konstante begrenzt — gleich genaues Rechnen über alle Größenordnungen.
- Maximaler absoluter Fehler
- 2e / 2k (worst case bei e = q = 1: ≈ 0.03125)
- Maximaler relativer Fehler
- 1 / 2k = 1 / 26 = 0.015625 (konstant)
Klicke auf "Berechnen", um den tatsächlichen Fehler des aktuellen Inputs zu sehen.
Wann verwenden?
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.