Tippe 0.1 + 0.2 in fast jeden Rechner ein, der mit binären Gleitkommazahlen arbeitet, und die rohe Antwort ist 0.30000000000000004, nicht 0.3. Dieser Rechner erzeugt denselben Wert intern und rundet ihn dann für die Anzeige, so dass du 0.3 siehst. Der Übeltäter ist ein Basismissverhältnis: Menschen schreiben Zahlen zur Basis 10, Computer speichern sie zur Basis 2, und 0.1 existiert zur Basis 2 nicht exakt.
Die wichtigsten Punkte
0.1 + 0.2ist0.30000000000000004in binärer Gleitkomma-Arithmetik, in jeder Sprache.- 0.1 ist im Binärsystem ein sich wiederholendes Muster,
0.0001100110011….- Dieser Rechner rundet Ergebnisse auf 12 signifikante Stellen, zeigt also
0.3, nicht die rohe Double-Zahl.- Der gespeicherte Wert von 0.1 ergibt sich als
0.10000000000000000555111512312578….
Woher die zusätzlichen Ziffern kommen
Du weißt bereits, dass einige Brüche zur Basis 10 nicht sauber passen. Ein Drittel ist 0.333…, unendlich wiederholend, weil 3 kein Teiler von 10 ist. Computer speichern Zahlen zur Basis 2, wo die einzigen sauberen Brüche Zweierpotenzen im Nenner haben: Hälften, Viertel, Achtel. Ein Zehntel steht nicht auf dieser Liste. Im Binärsystem ist 0.1 0.0001100110011…, ewig wiederholend, genau so, wie sich ein Drittel im Dezimalsystem wiederholt.
Eine Double-Precision-Zahl hat 53 Bit für die Ziffern, also wird die unendliche binäre Entwicklung abgeschnitten. Der Wert, der gespeichert wird, wenn du 0.1 tippst, ist 0.1000000000000000055511151231257827021181583404541015625. Er liegt nahe an 0.1, ist aber nicht gleich. Addiere zwei dieser leicht falschen Werte, und die Fehler heben sich nicht auf, sie stapeln sich, und die Summe landet einen Schritt hinter 0.3. Daher 0.30000000000000004. Das ist der IEEE-754-Standard, den praktisch jeder Prozessor und jede Sprache implementiert, so dass dieselbe Antwort in JavaScript, Python, C und Excel erscheint.
Was dieser Rechner dagegen tut
Die Betriebsregel dieser Seite ist im Leitfaden zur Gleitkomma-Arithmetik festgehalten: Jedes Ergebnis wird auf 12 signifikante Stellen gerundet, bevor es gezeigt wird. Eine Double trägt etwa 15 bis 17 verlässliche Ziffern, also behält das Runden bei 12 jede Ziffer, der vertraut werden kann, und verwirft die letzten paar, genau dort, wo das angesammelte Rauschen sitzt.
Durchgerechnetes Beispiel 1: gib es ein. Tippe im Hauptrechner 0.1+0.2 ein. Das Display liefert 0.3. Die zugrunde liegende Double ist 0.30000000000000004, aber die Anzeigeregel versteckt sie. Zieh denselben Trick in die andere Richtung mit 0.3-0.2: Das rohe Ergebnis ist 0.09999999999999998, und das Display zeigt 0.1. Auch Multiplikation macht es: 1.1*3 hält 3.3000000000000003 und zeigt 3.3.
Wenn die Antwort wirklich nicht festzunageln ist, stellt der Rechner sich nicht dumm. Tippe 1/3, und er zeigt 0.333333333333, zwölf Dreien und dann Schluss. Der Leitfaden zu signifikanten Stellen erklärt genau, wie dieses Runden und diese Anzeigegrenzen funktionieren.
Wann der Unterschied zählt
Für die tägliche Arithmetik, Hausaufgaben und Ingenieursschätzungen sind 12 verlässliche Ziffern weit mehr Genauigkeit, als irgendeine Messung rechtfertigt. Es zählt in drei engeren Situationen, alle im Leitfaden zur Gleitkomma-Arithmetik beschrieben:
- Geld. Speichere Währungen nicht als Gleitkommazahl. Pfennige und Cents als ganze Zahlen sind der sichere Weg, und Laufsummen winziger Fehler sind eine bekannte Klasse von Buchhaltungs-Fehlern.
- Gleichheitsprüfungen im Code. Zu testen, ob zwei berechnete Gleitkommazahlen gleich sind, ist unzuverlässig; vergleiche stattdessen mit einer kleinen Toleranz.
- Lange Operationsketten. Fehler summieren sich, und das Subtrahieren zweier fast gleicher Zahlen verliert die meiste Genauigkeit.
Durchgerechnetes Beispiel 2: exakte Brüche. Wenn du einen exakt korrekten Bruch brauchst, hält der Bruchrechner Zähler und Nenner als ganze Zahlen und rundet nie. Tippe dort 1/3 + 1/3 + 1/3 ein, und er liefert exakt 1. Mache dieselbe Summe mit den angezeigten Dezimalzahlen, 0.333333333333 + 0.333333333333 + 0.333333333333, und das Ergebnis ist 0.999999999999. Dieselbe Idee, verschiedene Welten.
Durchgerechnetes Beispiel 3: Wurzeln und Quadrate. sqrt(2)^2 ist ein klassischer Stolperdraht. Logisch ist die Quadratwurzel von 2 quadriert 2. Im Rechner ist das rohe Ergebnis 2.0000000000000004, für die Anzeige gerundet auf 2. Wenn du den exakten Wert brauchst, behalte die Wurzelform und werte einmal am Ende aus, was die Referenz der Rechnerfunktionen unter der √-Taste behandelt.
Es gibt auch eine ganzzahlige Grenze, die man kennen sollte. Unter 2^53 − 1 = 9,007,199,254,740,991 ist jede ganze Zahl exakt darstellbar, und der Rechner druckt alle ihre Ziffern. Oberhalb dieser Linie wechseln Werte wie 19! in die wissenschaftliche Schreibweise, statt Genauigkeit zu behaupten, die nicht existiert.
Häufig gestellte Fragen
Ist 0.1 plus 0.2 wirklich 0.3 oder nicht?
In exakter Dezimal-Arithmetik ja. In binären Gleitkommazahlen ist das gespeicherte Ergebnis 0.30000000000000004. Dieser Rechner liefert denselben Wert intern zurück und rundet für die Anzeige auf 12 signifikante Stellen, so dass du 0.3 siehst.
Ist das ein Fehler im Rechner?
Nein. Es ist der IEEE-754-Standard, den jeder gängige Prozessor und jede Sprache implementiert. Programme und Rechner, die das Problem zu vermeiden scheinen, verstecken es mit Anzeigerundung, genau wie dieser hier.
Wie bekomme ich eine exakte Antwort?
Nutze den Bruchrechner für rationale Arithmetik, die nie rundet, oder behalte symbolische Formen wie sqrt(2) und pi im Ausdruck bis zum letzten Schritt.
Warum zeigt 1 geteilt durch 3 nur zwölf Dreien?
Weil ein Drittel in keiner der beiden Basen eine exakte Darstellung hat. Der Rechner zeigt zwölf verlässliche Ziffern und stoppt, statt so zu tun, als ob der Wert enden würde.