Geben Sie in den meisten Programmiersprachen 0.1 + 0.2 aus, erhalten Sie 0,30000000000000004. Nichts ist kaputt – so speichern Computer reelle Zahlen. Diese Anleitung erklärt das Format doppelter Genauigkeit nach IEEE 754, das SciKey und die meiste numerische Software verwenden, wie sich seine Grenzen in Ergebnissen zeigen und wie der Rechner damit umgeht.
1. Doppelte Genauigkeit nach IEEE 754
Eine Double-Zahl (binary64) belegt 64 Bit.
| Teil | Bits | Aufgabe |
|---|---|---|
| Vorzeichen | 1 | Positiv oder negativ |
| Exponent | 11 | Welche Zweierpotenz |
| Mantisse | 52 | Signifikante Stellen (effektiv 53, mit verborgener führender 1) |
53 signifikante Bits entsprechen etwa 15 bis 17 Dezimalstellen. Der größte darstellbare Wert ist etwa 1,797×10³⁰⁸, und der Abstand zwischen 1 und der nächsten Double-Zahl (Maschinengenauigkeit) beträgt 2⁻⁵² ≈ 2,22×10⁻¹⁶.
2. 0,1 hat keine exakte Binärdarstellung
So wie 1/3 = 0,333… im Dezimalsystem nie endet, endet 1/10 im Binärsystem nie: 0,1 = 0,0001100110011…₂, periodisch ohne Ende. Die Zahl wird auf 53 Bit gerundet, der gespeicherte Wert ist also tatsächlich
0,1000000000000000055511151231257827…
Auch 0,2 wird etwas zu groß gespeichert. Ihre Summe trägt beide Fehler zu 0,3000000000000000444…, und das ist eine andere Double-Zahl als die, in der 0,3 gespeichert wird (0,2999999999999999888…). Die kürzeste Dezimalzahl, die die Summe eindeutig bezeichnet, ist daher 0,30000000000000004.
Aus demselben Grund ist auch 0.1×3 gleich 0,30000000000000004. Dezimalzahlen, deren Nenner Zweierpotenzen sind, etwa 0,5, 0,25 und 0,375, sind binär exakt und fehlerfrei.
3. Warum der Rechner trotzdem 0,3 zeigt
SciKey zeigt nicht den rohen internen Wert an, sondern rundet auf die eingestellten signifikanten Stellen (standardmäßig 12). Auf 12 Stellen gerundet ist 0,30000000000000004 gleich 0,300000000000, also 0,3. Der Fehler sitzt in der 17. Stelle und erreicht die Anzeige nie.
Wissenschaftliche Taschenrechner arbeiten genauso: Sie rechnen typischerweise intern mit etwa 15 Stellen und zeigen 10 an, wodurch winzige Fehler in den letzten Stellen bei der Anzeige verschwinden. Nur die Anzeige ändert sich, der gespeicherte Wert ist weiterhin 0,30000000000000004. Rechnet man damit weiter, bleiben meist Fehler um 10⁻¹⁶, die in der Praxis keine Rolle spielen.
4. Warum sin(π) nicht null ist
Im RAD-Modus sollte sin(π) genau 0 sein. Aber π ist irrational, und die π am nächsten liegende Double-Zahl ist etwa 1,22×10⁻¹⁶ kleiner als der wahre Wert. In der Nähe von π hat der Sinus die Steigung −1, also ist sin(Double-π) ≈ 1,2246×10⁻¹⁶. Der Sinus selbst wurde genau berechnet; die Eingabe war nie exakt π.
SciKey korrigiert das nach folgenden Regeln:
- In den Modi DEG und GRAD wird das Argument exakt um 360° (400 gon) reduziert, und Vielfache von 90° liefern exakte Werte:
sin(180)= 0,cos(90)= 0, undtan(90)ist nicht definiert und ergibt daher einen Fehler. - Im RAD-Modus liefert sin den Wert 0, wenn das Argument bis auf einen relativen Fehler von 10⁻¹³ mit einem ganzzahligen Vielfachen von π übereinstimmt; stimmt es mit einem ungeraden Vielfachen von π/2 überein, liefert cos den Wert 0 und tan einen Fehler.
Deshalb zeigt sin(π) in SciKey 0. Die Korrektur greift nur in der Nähe von Vielfachen von π und beeinflusst keine andere Berechnung.
5. Große Zahlen: Fakultäten und Überlauf
Fakultäten wachsen schnell. 170! ≈ 7,25741561531×10³⁰⁶ passt noch in eine Double-Zahl, 171! ist aber etwa 1,24×10³⁰⁹ und liegt jenseits des Maximums von 1,797×10³⁰⁸. Deshalb akzeptiert n! in SciKey ganze Zahlen von 0 bis 170, und 171! ergibt einen Überlauffehler.
In der Praxis stehen große Fakultäten meist in Quotienten. Der Binomialkoeffizient C(200, 3) ist 200!/(3!·197!), doch nCr(200, 3) = 1313400 berechnet ihn direkt ohne riesige Zwischenwerte. In der Wahrscheinlichkeitsrechnung ist es ebenfalls üblich, Logarithmen zu bilden und zu addieren.
6. Die Ganzzahlgrenze: 2⁵³
Mit 53 signifikanten Bits ist jede ganze Zahl bis 2⁵³ = 9007199254740992 exakt. Darüber überspringen Double-Zahlen ganze Zahlen. 2⁵³ + 1 ist nicht darstellbar und wird auf 2⁵³ zurückgerundet, daher ergibt 2^53+1-2^53 den Wert 0 und nicht 1: Die addierte 1 verschwand beim Speichern der Summe.
Deshalb zeigt SciKey binäre, oktale und hexadezimale Werte nur für ganze Zahlen mit Betrag bis 2⁵³; darüber sind die niederwertigen Stellen nicht garantiert. Aus demselben Grund ändern Kartennummern oder IDs mit mehr als 16 Stellen ihre letzten Ziffern, wenn man sie als Zahlen behandelt.
7. Auslöschung: der gefährlichste Fehler
Die Subtraktion zweier fast gleicher Zahlen tilgt die führenden Stellen und lässt fast nur Fehler übrig. Man nennt das Auslöschung (catastrophic cancellation).
Beispiel 1. (1+1E-15)-1 sollte 10⁻¹⁵ sein, doch doppelte Genauigkeit liefert 1,11022302463×10⁻¹⁵. Beim Speichern von 1 + 10⁻¹⁵ entsteht ein Rundungsfehler der Größenordnung 10⁻¹⁶, und nach Abzug der 1 macht dieser Fehler 11 % des Ergebnisses aus.
Beispiel 2. Für x = 10⁸ ist √(x²+1) − x etwa 5×10⁻⁹. Direkt berechnet ist √(10¹⁶+1) von 10⁸ nicht zu unterscheiden, und das Ergebnis ist 0. Durch Erweitern erhält man eine gleichwertige Form ohne Subtraktion:
√(x²+1) − x = 1 / (√(x²+1) + x)
Speichern Sie 10⁸ in x, dann liefert 1/(sqrt(x^2+1)+x) genau 5×10⁻⁹.
Beispiel 3. 1 − cos(10⁻⁸) ist etwa 5×10⁻¹⁷, doch cos(10⁻⁸) rundet exakt auf 1, und das direkte Ergebnis ist 0. Mit der Identität 1 − cos x = 2 sin²(x/2) ergibt 2sin(0.5E-8)^2 den Wert 5×10⁻¹⁷ (RAD-Modus).
Keine Zahl von Anzeigestellen behebt das. Sie müssen die Formel umformen.
8. Praktische Tipps
- Nicht auf exakte Gleichheit prüfen. Um zwei berechnete Ergebnisse zu vergleichen, prüfen Sie, ob ihre Differenz klein genug ist (zum Beispiel ein relativer Fehler von 10⁻¹²).
- Geldbeträge in ganzen Einheiten rechnen. Rechnen Sie in der kleinsten Währungseinheit (z. B. Cent) als ganze Zahl, damit sich keine Bruchteilfehler aufsummieren.
- Subtraktion fast gleicher Zahlen vermeiden. Erweitern, Identitäten nutzen oder umstellen, um die Subtraktion zu beseitigen.
- Mit Verhältnissen bei großen Zahlen arbeiten. Wenn Fakultäten oder Potenzen explodieren, verwenden Sie nCr, Logarithmen oder kürzen Sie zuerst.
- Zwischenergebnisse nicht runden. Der Fehler doppelter Genauigkeit liegt bei etwa 10⁻¹⁶, doch Runden von Hand auf vier Stellen erzeugt Fehler um 10⁻⁴. Die größeren Fehler stammen meist vom Menschen, nicht von der Maschine.
- Die Anzeige auf 15 Stellen erhöhen. Wirkt ein Ergebnis seltsam, zeigen Sie mehr Stellen an, um den internen Wert zu sehen und einen Fehler in den letzten Stellen von einer tatsächlich falschen Formel zu unterscheiden.