Heim > Backend-Entwicklung > C++ > Warum folgt die Gleitkommaaddition nicht immer dem Assoziativgesetz?

Warum folgt die Gleitkommaaddition nicht immer dem Assoziativgesetz?

Susan Sarandon
Freigeben: 2024-12-20 02:02:09
Original
482 Leute haben es durchsucht

Why Doesn't Floating-Point Addition Always Follow the Associative Law?

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage