Zum Inhalt springenSkip to content

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.

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 ==.