c++ - 使用 std::accumulate 计算 vector 元素总和的最准确方法是什么?

标签 c++ sorting vector accumulate

<分区>

Possible Duplicate:
C++ float precision question

我遇到了一个问题,即使用 std::accumulate 确定三种方法中最精确的方法来计算 vector 元素之和, vector 元素之和只能是正数。

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);
}

这是一种求职面试题,所以我得到了这三种计算总和的方法。我在网上做了很多搜索,但无法弄清楚其中的区别。你们能帮我理解一下吗?

最佳答案

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

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

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

关于c++ - 使用 std::accumulate 计算 vector 元素总和的最准确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6800810/

相关文章:

c++ - 是否可以将 std::vector 传递给需要 CArray 的 MFC 函数?

c++ - opengl不画任何东西

Javascript - 通过用户输入和排序按钮创建的列表

c++ - vector 内存泄漏

algorithm - 当集合不相交时,是否有类似于联合查找的交集查找算法?

ruby - 按键排序散列,忽略重音

windows - 如何查找发生运行时错误的行 - Visual C++

c++ - 当以多态方式使用时,派生类的 std::vector 成员的复制分配会导致内存泄漏

javascript - 当 JS 代码在应用程序构建时未知时从 QML 调用 JS 函数(帽子提示 SpiderMonkey)

c++ - 调用函数是否被视为上下文切换?