ホームページ > バックエンド開発 > C++ > C の浮動小数点演算で精度エラーが発生するのはなぜですか?

C の浮動小数点演算で精度エラーが発生するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-04 13:06:02
オリジナル
436 人が閲覧しました

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>
ログイン後にコピー

このアプローチでは、精度が double データ型で利用可能な最大値に設定されることが保証されます。ループの反復回数が 50 回ではなく 5000 回など、大幅に増加した場合、精度の設定に関係なく、累積誤差が最終的に顕著になることに注意することが重要です。これは浮動小数点演算に固有の制限です。

以上がC の浮動小数点演算で精度エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート