浮點相等的令人困惑的案例
在軟體開發領域,浮點比較的話題引發了無數爭論。雖然眾所周知,浮點精度對確定相等性提出了挑戰,但仍然存在使用 == 可能不會像人們想像的那樣有問題的情況。
讓我們剖析提出的具體程式碼範例:
// Defined in somewhere.h static const double BAR = 3.14; // Code elsewhere.cpp void foo(double d) { if (d == BAR) ... }
問題是在某些情況下這種比較是否有效。答案在於浮點數資料表示的基本性質。
IEEE 754 是浮點運算的流行標準,保證特定範圍內的整數表示在儲存為浮點數時是準確的。換句話說,包括 0.0 在內的整數都可以直接使用 == 進行比較,而不必擔心精確度錯誤。
因此,在給定的程式碼中,只要將 BAR 初始化為 float 範圍內的整數值即可,比較 d == BAR 是安全可靠的。
但是,當處理經過數學運算或計算的變數時,情況就變得更加複雜。雖然某些計算可能會產生精確的整數值,但其他計算可能會引入舍入錯誤,從而使浮點相等性無效。
類似地,假設 BAR 確實是整數常數,呼叫 foo(BAR) 將永遠比較相等。這是因為兩個變數使用相同的靜態常數,這保證表示相同的基礎整數值。
總之,雖然通常應謹慎對待浮點相等,但在某些特定情況下可以放心使用。當比較浮點範圍內的整數或使用靜態常數時,程式設計師可以依靠浮點表示的精確性質來執行可靠的相等檢查。
以上是浮點相等可靠嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!