我有一个很长的浮点正数列表( 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);
关于c++ - 高效稳定的有序数之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58838104/