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