【问题标题】:What is the most accurate way to count a sum of vector elements using std::accumulate? [duplicate]使用 std::accumulate 计算向量元素总和的最准确方法是什么? [复制]
【发布时间】:2011-10-11 15:55:39
【问题描述】:

可能重复:
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);
}

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

【问题讨论】:

  • 你说的“求职面试题”是什么意思?您是否在寻求帮助以通过工作面试?
  • 按绝对值排序,从小端开始。你可以想想为什么会这样。
  • @Marcelo Cantos 不,我不是要求通过工作面试。这个任务曾经在求职面试中,所以我只是在准备求职面试,做不同的任务

标签: c++ sorting vector accumulate


【解决方案1】:

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

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

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

【讨论】:

  • 差别可能巨大,看看其他问题中的基准即可。
猜你喜欢
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多