C 中的浮點精確度怪癖
C 中的浮點運算表現出可能違反直覺的行為。考慮以下內容:
表達式 double a = 0.3;將邏輯上表示 0.3 的值賦給變數 a。然而, std::cout 的輸出
同樣,在 a 與 b 重複相加的循環中,循環結束時的結果(50 次迭代)是“15.000000000000014211”,該值高於應有的值。此結果示範了捨入誤差如何在多次運算中累積。
為了規避這些精確度問題,避免將浮點數值的精確度設定為高於資料型別的實際精確度非常重要。這可以使用以下方法來實現:
<code class="cpp">#include <iostream> #include <limits> int main() { double a = 0.3; std::cout.precision(std::numeric_limits<double>::digits10); std::cout << a << std::endl; double b = 0; for (char i = 1; i <= 50; i++) { b = b + a; } std::cout.precision(std::numeric_limits<double>::digits10); std::cout << b << std::endl; }</code>
透過將精度設定為雙精度資料類型的最大可用精度,輸出將準確表示儲存的值。然而,如果循環運行明顯更多的迭代次數(例如 5000 次而不是 50 次),由於浮點運算的固有限制,累積誤差仍然會變得明顯。
以上是為什麼 C 語言中的浮點運算會導致精確度問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!