Gleitkomma

Gib eine Dezimalzahl ein. Die Schritte unten zeigen die Umwandlung genau so, wie du sie auf Papier rechnen würdest. Die Zeile ganz oben ist das, was letztendlich im Rechner landet.

Interaktive Simulation wird geladen...
Lektion

Die Theorie — Gleitkomma282 Wörter

Eine Gleitkommazahl ist eine ganze Zahl, die mit einer Zweierpotenz multipliziert wird: (−1)s × 1.f × 2E−1023. Das Format legt fest, wie viele Bits auf E und wie viele auf f entfallen. Diese einzige Aufteilung bestimmt zugleich, wie weit das Format reicht und wie fein es zwei Zahlen voneinander unterscheiden kann.

Was die einzelnen Symbole bedeuten

s
das Vorzeichenbit, 0 für positiv und 1 für negativ. Es steht für sich allein und wird nicht mit der Zahl verrechnet. Deshalb kennt das Format sowohl eine +0 als auch eine −0.
E
das Exponentenfeld, dem der Wert 1023 hinzuaddiert wird, damit es ohne eigenes Vorzeichen negativ werden kann. Es wählt aus, in welchem Bereich du dich befindest, und dieser Bereich entscheidet darüber, wie weit die Nachbarn voneinander entfernt sind.
f
die Mantisse: 52 Bits, die auf eine führende 1 folgen. Diese 1 wird nie gespeichert, weil eine normalisierte Zahl immer mit einer Eins beginnt. Diese 52 Bits bilden die gesamte Genauigkeit, und der Exponent steuert keine eigene bei.
Setzt voraus
Dass die Zahl endlich und normal ist. Unterhalb von 2−1022 fällt die führende 1 weg und das Format läuft weiter, indem es stattdessen Genauigkeit opfert. Die kleinste positive Double-Zahl ist somit 4,94 × 10−324 und besitzt nur noch ein einziges Bit für den Signifikanden.
Versagt, wenn
An zwei Stellen, und zwar beide in echtem Code. Der Vergleich zweier berechneter Werte mit = schlägt fehl, sobald sie über unterschiedliche Wege ermittelt wurden. Verschiedene Wege runden nämlich verschieden. Eine lange Summe hängt zudem von der Reihenfolge ab: Addierst du eine Liste vorwärts und rückwärts, unterscheiden sich die Ergebnisse. Addierst du die kleinsten Terme zuerst, verlierst du am wenigsten.

Acht von tausend 🖖

Von den Zahlen 0,001 bis 1,000 werden genau acht ganz ohne Fehler gespeichert: 0,125, 0,25, 0,375, 0,5, 0,625, 0,75, 0,875 und 1. Ein Binärbruch ist eine Summe aus Halben, Vierteln, Achteln und so weiter abwärts, und ein Nenner von 1000 trägt einen Faktor von 125 in sich, den keine Zweierpotenz je beseitigen wird. Tippe 0,375, und das Tool nennt es exakt. Bei 0,376 tut es das nicht.

0,1 + 0,2 landet exakt in der Mitte 🖖

Die beiden gespeicherten Werte summieren sich auf 0,3000000000000000166533453693773481063544750213623046875, und das ist exakt der Mittelpunkt zwischen den beiden Doubles auf beiden Seiten von 0,3. Die Addition selbst ist fehlerfrei. Ein Gleichstand muss irgendwie aufgelöst werden, und die Regel besagt, dass der Nachbar genommen wird, dessen letztes Bit gerade ist: Das Double unter 0,3 beendet seine Mantisse auf einem ungeraden Bit und das darüber auf einem geraden, also wird die Summe aufgerundet. Daher kommt der Überhang bei 0,30000000000000004.

Weniger Bits, richtiges Ergebnis 🖖

Klick auf binary32 mit denselben zwei Zahlen. 0,1 + 0,2 ergibt 0,300000011920928955078125, was exakt dem gespeicherten Wert von 0,3 in diesem Format entspricht. Der berühmte Fehler entsteht nur, wenn die Summe genau in der Mitte landet. In 24 Bits bleibt sie jedoch ein Viertel der Lücke davor stehen. Sie rundet also zu der Zahl zurück, die du erwartet hast. Halbe Genauigkeit, richtiges Ergebnis.

Der Abstand verdoppelt sich bei jeder Zweierpotenz 🖖

Überall zwischen 0,0625 und 0,125 beträgt die Distanz von einer darstellbaren Zahl zur nächsten 1,39 × 10⁻¹⁷. Sie schwankt innerhalb dieses Bereichs überhaupt nicht. Gehst du in den nächsthöheren Bereich über, verdoppelt sie sich. Die Treppe im Diagramm zeigt exakt das, eine Stufe pro Zweierpotenz. Deshalb kann ein und dasselbe Format 10⁻³⁰⁰ und 10³⁰⁰ fassen, kann aber 9007199254740993 nicht darstellen.

Aufgabe vollständig gelöst

  1. Ein Zahlungssystem speichert Pfundbeträge als binary64. Zeige, dass sowohl £0,10 als auch £0,20 geringfügig zu hoch gespeichert werden und dass ihre Addition nicht £0,30 ergibt. Erkläre zudem, was ein Entwickler von Zahlungssystemen dagegen unternimmt.

    1. 0,1 im Zweiersystem ist 0,0001 gefolgt von einer 1001, die sich unendlich wiederholt. Ein Zehntel braucht eine Fünf im Nenner, und ein Binärbruch besteht aus nichts als Zweien. Daher bricht die Bruchentwicklung nie ab.

    2. 53 Binärziffern werden behalten und der Rest wird weggerundet. Hier wird aufgerundet, sodass der gespeicherte Wert um 5,55 × 10⁻¹⁸ über 0,1 liegt. Der Rundungsschritt auf der Seite zeigt diese Richtung als Pfeil an.

    3. 0,2 besteht aus denselben 53 Ziffern, nur ist der Exponent um eins höher. Sein Fehler ist also genau doppelt so groß: 1,11 × 10⁻¹⁷. Trag 0,2 in das Feld ein und vergleiche die beiden Fehlerkarten.

    4. Addiert landen die beiden gespeicherten Werte exakt auf dem Mittelpunkt zwischen den beiden Doubles auf beiden Seiten von 0,3. Bei einem Gleichstand gewinnt der Nachbar, der auf ein gerades Bit endet, und das ist hier der obere.

    5. Was also zurückkommt, ist 0,3000000000000000444089209850062616169452667236328125, und jede weitere Berechnung schleppt dies mit sich.

    6. Tippe nun 10 und 20 anstelle von 0,1 und 0,2. Beide sind ganze Zahlen deutlich unter 2⁵³, beide werden exakt gespeichert, und 10 + 20 ergibt 30, ohne dass irgendwo etwas verloren geht.

    Antwort

    Speichere Geld als ganze Zahl der kleinsten Einheit, also in Pence statt in Pfund, und die Arithmetik ist exakt, denn jede Ganzzahl bis 2⁵³ ist exakt. Die einzige verbleibende Rundung ist die, die du selbst schreibst, in dem von dir gewählten Moment, auf die du direkt zeigen kannst. Das Tool zeigt dir beide Hälften in zehn Sekunden: Tippe 0,1 und die Fehlerkarte ist nicht null, tippe 10 und sie ist es.

Beispielaufgaben

  • 0,1 - 0,1 wird als 0,1000000000000000055511151231257827021181583404541015625 gespeichert, und 0,2 liegt um das Doppelte darüber. Ihre Summe landet exakt auf halbem Weg zwischen den beiden darstellbaren Zahlen auf beiden Seiten von 0,3. Deshalb greift die Rundungsregel für die Mitte und rundet auf.
  • 0,375 - Die Reihe zur Basis zwei bricht nach drei Ziffern ab, statt unendlich weiterzulaufen, und das Tool bezeichnet den Wert als exakt. 0,375 ist 3/8, und Achtel sind genau das, woraus ein Binärbruch gemacht ist. Änderst du die letzte Ziffer zu 0,376, endet die Entwicklung nie.
  • 0,1 in 32 Bit - Die gleiche 0,1 in 24 Bit Mantisse statt 53: Sie wird als 0,100000001490116119384765625 hinterlegt, und das Werkzeug meldet 7,22 Dezimalstellen. Addierst du hier 0,2, erhältst du 0,300000011920928955078125. Exakt so wird 0,3 in diesem Format gespeichert.
  • 2⁵³ + 1 - Über 2⁵³ erreicht der Abstand 2, sodass jede zweite ganze Zahl fehlt. 9007199254740993 sitzt exakt zwischen zweien davon. Die Rundungsregel schickt die Zahl abwärts zur 9007199254740992, was einen Fehler von −1 ergibt. Wenn du 1 addierst, ändert das aus demselben Grund gar nichts.
  • 10¹⁶ + 1 - 10¹⁶ wird exakt gehalten, genauso wie 1. Die Rechnung 10¹⁶ + 1 kommt schlicht als 10¹⁶ zurück. Der Abstand beträgt hier 2. Somit liegt 10000000000000001 genau in der Mitte zwischen zwei Nachbarn. Die Regel des geraden letzten Bits, die 0,1 + 0,2 noch nach oben geschoben hat, drückt diese Zahl wieder nach unten.