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 サイトの他の関連記事を参照してください。