ホームページ >バックエンド開発 >C++ >C で正確な浮動小数点精度を確保するにはどうすればよいですか?

C で正確な浮動小数点精度を確保するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-05 16:32:02475ブラウズ

How to Ensure Accurate Floating-Point Precision in C  ?

C の浮動小数点数の精度

C で浮動小数点数を扱う場合、その精度の制限を理解することが不可欠です。次のコードを考えてみましょう:

<code class="cpp">double a = 0.3;
std::cout.precision(20);
std::cout << a << std::endl;

結果は 0.3 ではなく 0.2999999999999999889 となり、精度の低下を示します。これに対処するために、C は std::numeric_limits::digits10 定数を提供します。ここで、T は浮動小数点数の型です。この定数は、正確に表現できる有効桁数の最大数を表します。

std::numeric_limits::digits10 を使用して精度を正しく設定する方法は次のとおりです:

<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 で正確に表現できる最大有効桁数に設定します。結果として、どちらの場合も出力は 0.3 になります。

ただし、このアプローチを使用した場合でも、ループが 50 回を大幅に超えて反復される場合、累積誤差が発生する可能性があることに注意することが重要です。これは、浮動小数点数は近似値であり、一連の操作で誤差が蓄積される可能性があるためです。このような状況に対処するには、Boost.Multiprecision などの任意精度の演算を提供するライブラリを使用することをお勧めします。

以上がC で正確な浮動小数点精度を確保するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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