我在这里发布了一个实现Kahan总结的答案:https://stackoverflow.com/a/41743731/2642059我在accumulate
中使用了lambda:
accumulate(next(cbegin(small)), cend(small), big, [c = 0.0](const auto& sum, const auto& input) mutable {
const auto y = input - c;
const auto t = sum + y;
c = t - sum - y;
return t;
} )
这应该与for
- 循环:
auto sum = big;
auto c = 0.0;
for (long i = 0; i < size(small); ++i) {
const auto y = small[i] - c;
const auto t = sum + y;
c = t - sum - y;
sum = t;
}
但事实并非如此。给定vector<double> small(10000000, 1e-7)
accumulate
得出:
1.999999900000000e + 00
for
- 循环产生:
2.000000000000000e + 00
http://coliru.stacked-crooked.com/a/3cb0e3c542303eb4
这里发生了什么?这两个应该评估完全相同的代码!
答案 0 :(得分:10)
在累积示例中,您不会迭代整个值集。 next(cbegin(small))
将在 cbegin(small)
之后的元素处开始。试试这个。
accumulate(cbegin(small), cend(small), big, /*the lambda*/);