2017-01-19 5 views
1

Я отправил ответ здесь реализации Суммирование Каган в: https://stackoverflow.com/a/41743731/2642059 Я использовал лямбда в accumulate:Почему петля дает разные результаты, чем накапливается?

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 -loop:

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 -loop урожайность:

2.000000000000000e + 00

Живой пример в http://coliru.stacked-crooked.com/a/3cb0e3c542303eb4

Что здесь происходит? Эти 2 должны оценивать точно тот же самый код!

ответ

10

В примере накопления вы не итерируете по всему набору значений. next(cbegin(small)) начнется с элемента послеcbegin(small). Попробуйте это вместо этого.

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

Ugh, я оставил его там, когда был посеян с 'small.front()', а не 'big'. Спасибо, что сделали для меня идиотский тест. –

Смежные вопросы