浮點運算的結合性
在程式設計領域,浮點數通常用來表示實數。然而,這些浮點數值的加法和乘法的基本運算可能並不總是如預期的那樣。
常出現的一個問題是浮點加法和乘法是否具有關聯性。結合性意味著操作數相加或相乘的順序不會影響最終結果。雖然乘法對於浮點數確實具有關聯性,但加法則不然。
觀察以下程式碼時,這種關聯性的缺乏變得很明顯:
cout << ((0.7 + 0.2 + 0.1) == 1) << endl; //output is 0 cout << ((0.7 + 0.1 + 0.2) == 1) << endl; //output is 1
這種令人費解的行為是由固有的不精確性引起的浮點數。當增加多個數字時,由於舍入錯誤,執行加法的順序可能會導致結果略有不同。
開創性論文「每個電腦科學家應該了解浮點運算」闡明了這個問題:
「另一個灰色區域涉及括號的解釋。由於舍入誤差,代數結合律不一定成立例如,當x = 1e30、y = -1e30 且z = 1 時,表達式(x y) z 的答案與x (y z) 完全不同(前一種情況為1,後一種情況為0)。
以上是浮點加法是否具有結合律?的詳細內容。更多資訊請關注PHP中文網其他相關文章!