首頁 >後端開發 >C++ >為什麼浮點加法不總是遵循結合律?

為什麼浮點加法不總是遵循結合律?

Susan Sarandon
Susan Sarandon原創
2024-12-20 02:02:09484瀏覽

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

浮點算術:探索浮點運算中的關聯性

在程式設計領域,浮點數對於工作至關重要具有連續值。然而,浮點運算有時可能與我們在學校學到的數學不同,尤其是在結合性方面。

考慮將三個浮點值相加並將它們與 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

奇怪的是,這兩個表達式產生不同的結果。這種差異源於浮點加法並不總是結合的事實。換句話說,改變添加值的順序可以改變最終結果。

非結合性現像是由於浮點表示的限製而產生的。浮點數使用具有有限位數的二進位格式,這限制了它們的精確度。因此,浮點數計算可能會引入在多次運算中累積的捨入誤差。

在上面的範例中,根據順序添加 0.7、0.2 和 0.1 會導致中間值略有不同的操作。這些細微的差異透過後續的加法傳播,最終導致不同的最終結果。

為了進一步理解這個概念,讓我們考慮David Goldberg 的開創性論文“每個計算機科學家應該了解浮點運算”中的一個示例:

(1e30 + -1e30) + 1 = 1, while 1e30 + (-1e30 + 1) = 0

在這種情況下,括號對結果影響很大。將 1e30 和 -1e30 加到括號中會因四捨五入而產生接近零的值,然後將其加到 1。另一方面,將 1e30 和 -1e30 1 的結果相加會產生一個非零值。

因此,在使用浮點算術時,了解潛在的非結合性並在操作涉及重複加法或其他操作的表達式時保持謹慎至關重要。關聯運算。

以上是為什麼浮點加法不總是遵循結合律?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn