c++ - 高效稳定的有序数之和

标签 c++ floating-point precision

我有一个很长的浮点正数列表( std::vector<float> ,大小〜1000)。数字按降序排列。如果我按照顺序对它们进行求和:

for (auto v : vec) { sum += v; }

我想我可能会遇到一些数值稳定性问题,因为接近 vector 的末尾 sum将比v大得多。最简单的解决方案是以相反的顺序遍历 vector 。我的问题是:这和前向情况一样有效吗?我会丢失更多缓存吗?

还有其他聪明的解决方案吗?

最佳答案

bench-marked您的用例和结果(参见附图)表明向前或向后循环不会产生任何性能差异。

您可能还想在硬件+编译器上进行测量。

<小时/>

使用 STL 执行求和,其速度与手动循环数据一样快,但更具表现力。

使用以下内容进行反向累积:

std::accumulate(rbegin(data), rend(data), 0.0f);

而向前累积:

std::accumulate(begin(data), end(data), 0.0f);

enter image description here

关于c++ - 高效稳定的有序数之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58838104/

相关文章:

c++ - std::function 和 lambda 参数的段错误

php - 在php中将指数数转换为小数

floating-point - CPU中常用的浮点运算有哪些算法?

mysql 精度只有十进制

java - Jooq 将 String 转换为 BigDecimal

c++ - 如何在 C++ 中编写整数和平凡类型之间的双向映射?

c++ - 如何进行带有偏差的浮点舍入(总是向上或向下舍入)?

c - 如何将存储 IEEE 754 float 的 4 个字节转换为 C 中的浮点值?

C++ 精度 - setprecision 的行为

c++ - 如何迭代打印 std::tuple