C 中的浮點精度
在 C 中,浮點數精確到一定的小數位數。但是,這種精度存在限制,可能會導致意外結果。
問題陳述
考慮以下程式碼片段:
<code class="cpp">double a = 0.3; std::cout.precision(20); std::cout << a << std::endl; // Print 0.2999999999999999889 double a, b; a = 0.3; b = 0; for (char i = 1; i <= 50; i++) { b = b + a; }; std::cout.precision(20); std::cout << b << std::endl; // Print 15.000000000000014211
如圖所示,a 略小於0.3,但乘以50 時, b 略大於15.0。這種與預期結果的偏差可以歸因於浮點精度的限制。
解
要獲得正確的結果,避免設定精確度高於數字類型的可用精確度。以下修訂後的程式碼片段示範了此方法:
<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中文網其他相關文章!