Blatt · Zahlen
Nachkomma — was in einer Fließkommazahl wirklich steht
0.1 + 0.2 ist nicht 0.3, und das ist kein Fehler, sondern die
Bauart. Hier liegt die Zahl offen: jedes Bit anklickbar, daneben der
exakte Wert — nicht gerundet dargestellt, sondern mit BigInt vollständig
ausgerechnet. Dazu die Frage, die man selten gestellt bekommt: wo genau sitzen die
darstellbaren Zahlen, und was kostet es, viele davon zu addieren.
| Verfahren | Ergebnis | Fehler in ULP |
|---|
Der Vergleichswert ist keine bessere Fließkommazahl, sondern die mit BigInt exakt gerechnete Summe.
Die exakte Darstellung ist nur etwas wert, wenn sie stimmt. Geprüft wird deshalb gegen das Verfahren selbst: jede ausgerechnete Dezimalzahl muss beim Zurücklesen dasselbe Bitmuster ergeben, jeder Nachbar muss genau ein Bitmuster entfernt liegen, und die exakte Summe muss mit der schrittweise aufaddierten Bruchsumme übereinstimmen.
noch nicht geprüft
Warum 0.1 nicht 0.1 ist
Eine binäre Bruchzahl kann nur Summen von Zweierpotenzen darstellen. Ein Zehntel ist
im Zweiersystem periodisch — wie ein Drittel im Zehnersystem. Gespeichert wird
deshalb die nächstgelegene darstellbare Zahl, und die ist um rund
5.55e-18 zu groß.
Warum die Abstände wachsen
Zwischen zwei Zweierpotenzen liegen immer gleich viele Zahlen: 252. Nach oben wird derselbe Vorrat über einen doppelt so langen Abschnitt verteilt — der Abstand verdoppelt sich mit jeder Oktave. Ab 253 ist er größer als 1, und ganze Zahlen fallen aus dem Raster.
Was hier gemessen wird
Der Fehler beim Summieren wird nicht geschätzt, sondern gegen die mit BigInt exakt gerechnete Summe gestellt und in ULP angegeben — in Vielfachen des Abstands zum Nachbarn. Das ist das einzige Maß, das über Größenordnungen hinweg vergleichbar bleibt.
Eine einzelne HTML-Datei. Kein Build, keine Bibliothek, nichts verlässt den Browser. Alle Blätter: ssims437.github.io