C 中的浮點不精確
程式設計中的浮點運算涉及使用固定位數表示實數,從而導致潛在的不準確。本文解決了 C 浮點運算中的精確度問題,例如以下程式碼:
<code class="cpp">double a = 0.3; std::cout.precision(20); std::cout << a << std::endl;
此程式碼輸出 0.2999999999999999889,而不是預期的 0.3。此外,如果 a 與自身相加 50 次,結果將變為 15.000000000000014211,而不是預期的 15。
說明
浮點數的精確度有限,由下式決定他們的位數。雙精度浮點數的小數部分有 53 位,因此有效精度約為 15 位小數。
使用 std::cout. precision(20) 時,指示流顯示 20 位小數精確。然而,a 的基礎值只有 15 位元精度。附加的數字用零填充,導致不準確。
第二個範例累積了重複添加的不準確度。由於浮點運算不具有關聯性,稍微不同的加法序列可能會產生略有不同的結果。
解決方案
為了最大限度地減少精度損失,請不要設定 std:: cout. precision 高於數字類型的可用精度。這可以透過使用:
<code class="cpp">std::cout.precision(std::numeric_limits<double>::digits10);</code>
這將雙精度浮點數的精度限制為 15 位元。
但是,對於大量重複計算,仍然可能會出現累積誤差。在這種情況下,建議使用替代技術,例如定點算術或使用帶有整數分子和分母的分數。
以上是為什麼 C 語言中 `0.3` 變成了 `0.2999999999999999889` ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!