長いdouble型の配列、たとえばN == 1000000
があるとします。合計の誤差が最小になるように、2倍の平均を計算するにはどうすればよいですか?
平均を計算するための2つの単純なアプローチがあります。最初
double result = 0;
for (double x : arr) {
result += x;
}
result /= arr.size();
これは値の合計が非常に大きい場合、不正確な場合があります。浮動小数点数は精度を失います。
別のアプローチは、次のとおりです。
double result = 0;
for (double x : arr) {
result += x/arr.size();
}
数字が小さいときには、精度を失う可能性があります。
浮動小数点数の単純な平均を計算するためのフェイルセーフな方法はありますか?標準ライブラリのみを使用するソリューションは高く評価されています。
クレームは無意味ですが、値の大きさに基づいて精度を失うことはありません。これが浮動小数点の「浮動小数点数」が処理するものです。 * double *が格納できる有効数字の桁数は値に依存しませんが、これ以上表示すると間違った値になります。 –
@HansPassantバイナリ表現には制限があります。 2つの浮動小数点数を加算すると、指数が一致します。つまり、4桁の10進数しか表現できない場合、1.234e0を1.234e3に追加すると、最初に0.001e3に変換され、下位桁が破棄されます。 –