平均関数のこれら 2 つの実装を考えると、次のようになります。
float average(const vector<float>& seq)
{
float sum = 0.0f;
for (auto&& value : seq)
{
sum += value;
}
return sum / seq.size();
}
と:
float average(const vector<float>& seq)
{
float avg = 0.0f;
for (auto&& value : seq)
{
avg += value / seq.size();
}
return avg;
}
私の質問を説明するために、次のように入力データに大きな違いがあると想像してください。
1.0f, 0.0f, 0.0f, 0.0f, 1000000.0f
私の推測では、最初の実装では、sum
「大きくなりすぎて」最下位桁が失われ、1000000.0f
代わりに1000001.0f
合計ループの最後になる可能性があります。
一方、2 番目の実装は、実行する除算の数が多いため、理論的には効率が悪いようです (私は何もプロファイリングしていません。これは盲目的な推測です)。
それで、これらの実装の1つは他の実装よりも望ましいですか? 最初の実装は精度が低いというのは本当ですか?