C++ で丸めエラーを防止または修正するにはどうすればよいですか?
例:
float SomeNumber = 999.9999;
cout << SomeNumber << endl;
それは1000を印刷します!
cout
精度を設定することにより、丸めを変更できます。
cout.precision(7);
float SomeNumber = 999.9999;
cout << SomeNumber << endl;
printf
または、 cstdioから使用することもできます。
デフォルトでは、フォーマットされた出力は、std::ostream
浮動小数点値を 6 つの有効な 10 進数に丸めます。数値が 1000 に丸められないようにするには、7 が必要です。
cout << setprecision(7) << SomeNumber << endl;
^^^^^^^^^^^^^^^
float
また、一般的に使用される 32 ビット IEEE 表現を想定すると、 の精度の限界に近づいていることに注意してください。有効数字が 7 桁以上必要な場合は、 に切り替える必要がありますdouble
。たとえば、次の例では、1000
指定した精度に関係なく が出力されます。
float SomeNumber = 999.99999; // 8 significant figures
cout << setprecision(10) << SomeNumber << endl;
出力が丸められないようにするには、iomanip で setprecision を使用します。
float SomeNumber = 999.9999;
std::cout << SomeNumber << std::endl; //outputs 1000
std::cout << std::setprecision (7) << SomeNumber << std::endl; //outputs 999.9999
return 0;
ただし、SomeNumber に格納される実際の値は常に 999.9999 であるため、値自体について心配する必要はありません (float が提供するよりも高い精度が必要でない限り)。
前述のように、cout の丸めの修正のみを探している場合は、.precision 関数を使用してください。浮動小数点がすべての可能な分数を表すことができないことに言及している場合は、以下をお読みください。
浮動小数点数を使用すると、このような丸め誤差を避けることはできません。別の方法でデータを表す必要があります。たとえば、5 桁の精度が必要な場合は、最小単位の数を表す long として格納するだけです。
つまり、0.00001 の精度を持つ 5.23524 は、523524 として long (または値の範囲が適合する場合は int) で表すことができます。単位が 0.00001 であることはわかっているので、簡単に機能させることができます。