使用std :: accumulate计算向量元素总和的最准确方法是什么?

时间:2011-07-23 13:50:49

标签: c++ sorting vector accumulate

  

可能重复:
  C++ float precision question

我有一个问题,即使用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);
}

这是一种求职面试问题,这就是为什么我有这三种方法来计算总和。我已经做了很多搜索网络,但无法找出差异。你能帮我们理解吗?

1 个答案:

答案 0 :(得分:4)

差异应该非常小,但从较小的数字开始会稍微准确一些。考虑到出于说明目的,您的浮点数仅包含4位有效数字和指数,并且它是十进制而不是二进制。使用数字:

a = 5000
b = 5000
c = 1000e4 (10000000)

如果我们先添加c,然后添加ab,则两者中较小的一个会从表示中删除并进行舍入。 c + b + a的最终结果将产生1000e4。另一方面,如果我们首先添加ab,我们会将1e4作为第一个中间值,并将其添加到c将产生1001e4这是一个更精确的操作结果。