In typischen Gleitkommaimplementierungen wird das Ergebnis einer einzelnen Operation so erzeugt, als ob die Operation mit unendlicher Genauigkeit ausgeführt und dann auf die nächste Gleitkommazahl gerundet wurde.
Vergleichen Sie und b + a : Das Ergebnis jeder mit unendlicher Genauigkeit ausgeführten Operation ist das gleiche, daher werden diese identischen Ergebnisse mit unendlicher Genauigkeit auf identische Weise gerundet. Mit anderen Worten ist die Gleitkommazugabe kommutativ.a + bb + a
Nehmen wir : ist eine Gleitkommazahl. Bei binären Gleitkommazahlen ist auch eine Gleitkommazahl (der Exponent ist um eins größer), daher wird ohne Rundungsfehler addiert. Dann auf dem zusätzlichen genauen Wert . Das Ergebnis ist der exakte Wert , gerundet auf die nächste Gleitkommazahl.b 2 b b + b a b + b 2 b + ab + b + ab2 bb + beinb + b2 b + a
Nehmen Sie : wird addiert und es tritt ein Rundungsfehler , so dass wir das Ergebnis . Addiere und das Ergebnis ist der exakte Wert , gerundet auf die nächste Gleitkommazahl.a + b r a + b + r b 2 b + a + ra + b + ba + bra + b + rb2 b + a + r
Also in einem Fall , gerundet. Im anderen Fall ist gerundet.2 b + a + r2 b + a2 b + a + r
PS. Ob für zwei bestimmte Zahlen und beide Berechnungen das gleiche Ergebnis liefern oder nicht, hängt von den Zahlen und dem Rundungsfehler in der Berechnung und ist normalerweise schwer vorherzusagen. Die Verwendung von einfacher oder doppelter Genauigkeit macht im Prinzip keinen Unterschied zum Problem, aber da die Rundungsfehler unterschiedlich sind, gibt es Werte für a und b, bei denen die Ergebnisse bei einfacher Genauigkeit gleich sind und bei doppelter Genauigkeit nicht oder umgekehrt. Die Genauigkeit wird viel höher sein, aber das Problem, dass zwei Ausdrücke mathematisch gleich, aber in der Gleitkomma-Arithmetik nicht gleich sind, bleibt gleich.b a + beinba + b
PPS. In einigen Sprachen kann die Gleitkomma-Arithmetik mit höherer Genauigkeit oder einem höheren Zahlenbereich als in den tatsächlichen Anweisungen angegeben ausgeführt werden. In diesem Fall wäre es sehr viel wahrscheinlicher (aber immer noch nicht garantiert), dass beide Summen das gleiche Ergebnis liefern.
PPPS. In einem Kommentar wurde gefragt, ob Gleitkommazahlen gleich sind oder nicht. Absolut, wenn Sie wissen, was Sie tun. Wenn Sie beispielsweise ein Array sortieren oder eine Menge implementieren, geraten Sie in große Schwierigkeiten, wenn Sie den Begriff "ungefähr gleich" verwenden möchten. In einer grafischen Benutzeroberfläche müssen Sie möglicherweise die Objektgrößen neu berechnen, wenn sich die Größe eines Objekts geändert hat. Sie vergleichen oldSize == newSize, um diese Neuberechnung zu vermeiden, da Sie in der Praxis fast nie nahezu identische Größen haben und Ihr Programm korrekt ist auch wenn es eine unnötige Neuberechnung gibt.