4

可能重复:
C++ 浮点精度问题

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

这是一种求职面试问题,这就是为什么我得到这三种特殊的方法来计算总和。我在网上做了很多搜索,但无法弄清楚其中的区别。请各位大侠帮我理解一下好吗?

4

1 回答 1

4

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

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

如果我们c先添加,然后添加ab,两者中较小的一个会从表示中消失并被四舍五入。c++的b最终结果a将产生1000e4. 另一方面,如果我们将aand bfirst1e4作为第一个中间值添加,然后将其添加到c将产生1001e4对于操作来说更精确的结果。

于 2011-07-23T13:59:19.047 回答