Gleitkomma-Arithmetik: Erforschung der Assoziativität in Gleitkomma-Operationen
Im Bereich der Programmierung sind Gleitkommazahlen für die Arbeit unerlässlich mit kontinuierlichen Werten. Allerdings kann sich die Gleitkomma-Arithmetik manchmal anders verhalten als die Mathematik, die wir in der Schule gelernt haben, insbesondere wenn es um Assoziativität geht.
Betrachten Sie das Beispiel der Addition von drei Gleitkommawerten und deren Vergleich mit 1:
cout << ((0.7 + 0.2 + 0.1) == 1) << endl; // output is 0 cout << ((0.7 + 0.1 + 0.2) == 1) << endl; // output is 1
Seltsamerweise führen die beiden Ausdrücke zu unterschiedlichen Ergebnissen. Diese Diskrepanz ist auf die Tatsache zurückzuführen, dass die Gleitkommaaddition nicht immer assoziativ ist. Mit anderen Worten: Eine Änderung der Reihenfolge, in der wir Werte hinzufügen, kann das Endergebnis verändern.
Das Phänomen der Nichtassoziativität entsteht aufgrund der Einschränkungen der Gleitkommadarstellung. Gleitkommazahlen verwenden ein Binärformat mit einer endlichen Anzahl von Bits, was ihre Genauigkeit einschränkt. Daher können Berechnungen mit Gleitkommazahlen zu Rundungsfehlern führen, die sich über mehrere Operationen ansammeln.
Im obigen Beispiel führt die Addition von 0,7, 0,2 und 0,1 je nach Reihenfolge zu leicht unterschiedlichen Zwischenwerten von Operationen. Diese geringfügigen Unterschiede breiten sich durch die anschließende Addition aus und führen letztendlich zu unterschiedlichen Endergebnissen.
Um dieses Konzept besser zu verstehen, betrachten wir ein Beispiel aus David Goldbergs wegweisender Arbeit „What Every Computer Scientist Should Know about Floating Point Arithmetic“:
(1e30 + -1e30) + 1 = 1, while 1e30 + (-1e30 + 1) = 0
In diesem Fall haben die Klammern großen Einfluss auf das Ergebnis. Das Addieren von 1e30 und -1e30 in Klammern führt aufgrund der Rundung zu einem Wert nahe Null, der dann zu 1 addiert wird. Andererseits ergibt das Addieren von 1e30 und dem Ergebnis von -1e30 1 einen Wert ungleich Null.
Daher ist es bei der Arbeit mit Gleitkomma-Arithmetik wichtig, sich der möglichen Nicht-Assoziativität bewusst zu sein und bei der Manipulation vorsichtig zu sein Ausdrücke, die wiederholte Additionen oder andere assoziative Operationen beinhalten.
Das obige ist der detaillierte Inhalt vonWarum folgt die Gleitkommaaddition nicht immer dem Assoziativgesetz?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!