我有一个问题,即使用std :: accumulate来确定三个最精确的方法来计算向量元素的总和,它们只能是正数。
1)
double sum(vector<float> &v)
{
return accumulate(v.begin(), v.end(), 0.0);
}
2)
double sum(vector<float> &v)
{
sort(v.begin(), v.end());
return accumulate(v.begin(), v.end(), 0.0);
}
3)
double sum(vector<float> &v)
{
sort(v.begin(), v.end(), greater<float>());
return accumulate(v.begin(), v.end(), 0.0);
}
这是一种求职面试问题,这就是为什么我有这三种方法来计算总和。我已经做了很多搜索网络,但无法找出差异。你能帮我们理解吗?
答案 0 :(得分:4)
差异应该非常小,但从较小的数字开始会稍微准确一些。考虑到出于说明目的,您的浮点数仅包含4位有效数字和指数,并且它是十进制而不是二进制。使用数字:
a = 5000
b = 5000
c = 1000e4 (10000000)
如果我们先添加c
,然后添加a
或b
,则两者中较小的一个会从表示中删除并进行舍入。 c
+ b
+ a
的最终结果将产生1000e4
。另一方面,如果我们首先添加a
和b
,我们会将1e4
作为第一个中间值,并将其添加到c
将产生1001e4
这是一个更精确的操作结果。