首頁 >後端開發 >C++ >為什麼 C 中的浮點運算會導致精度誤差?

為什麼 C 中的浮點運算會導致精度誤差?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-04 13:06:02420瀏覽

Why Does Floating-Point Arithmetic in C   Lead to Precision Errors?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn