为什么循环给出不同的结果而不是积累?

时间:2017-01-19 15:16:24

标签: c++ for-loop lambda accumulate

我在这里发布了一个实现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

的实时示例

这里发生了什么?这两个应该评估完全相同的代码!

1 个答案:

答案 0 :(得分:10)

在累积示例中,您不会迭代整个值集。 next(cbegin(small))将在 cbegin(small)之后的元素处开始。试试这个。

accumulate(cbegin(small), cend(small), big, /*the lambda*/);