ホームページ >バックエンド開発 >C++ >C での浮動小数点演算が精度の問題を引き起こすのはなぜですか?

C での浮動小数点演算が精度の問題を引き起こすのはなぜですか?

DDD
DDDオリジナル
2024-11-04 11:20:02949ブラウズ

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

C の浮動小数点精度の癖

C の浮動小数点演算は、直観に反する可能性のある動作を示します。次の点を考慮してください。

式 double a = 0.3;論理的に 0.3 を表す値を変数 a に代入します。ただし、 std::cout << の出力は<< std::endl;小数点以下 20 桁の精度では、「0.2999999999999999889」と表示されます。このずれは、浮動小数点数の内部ストレージが論理値と異なることを示しています。

同様に、a と b を繰り返し加算するループでは、ループ (50 回の繰り返し) の最後での結果が返されます。は「15.000000000000014211」ですが、これは本来よりも大きくなっています。この結果は、複数の操作で丸め誤差がどのように蓄積されるかを示しています。

これらの精度の問題を回避するには、浮動小数点値の精度をデータ型の実際の精度よりも高く設定しないことが重要です。これは、次のアプローチを使用して実現できます。

#include 
#include 

int main() {
    double a = 0.3;
    std::cout.precision(std::numeric_limits::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::digits10);
    std::cout << b << std::endl;
}

精度を double データ型の利用可能な最大精度に設定することで、出力は格納された値を正確に表します。ただし、ループの反復回数が大幅に増加した場合 (たとえば、50 回ではなく 5000 回)、浮動小数点演算の固有の制限により、累積誤差が依然として顕著になります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。