鉴于平均函数的这两种实现:
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
在求和循环的末尾。
另一方面,第二种实现在理论上似乎效率较低,因为要执行的部门数量较多(我没有分析任何内容,这是一个盲目的猜测)。
那么,这些实现中的一种是否比另一种更可取?我真的认为第一个实现不太准确吗?