首頁 > 後端開發 > C++ > 主體

為什麼 C 語言中 `0.3` 變成了 `0.2999999999999999889` ?

Linda Hamilton
發布: 2024-11-04 12:03:29
原創
397 人瀏覽過

Why Does `0.3` Become `0.2999999999999999889` in C  ?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!