Я отправил ответ здесь реализации Суммирование Каган в: 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 должны оценивать точно тот же самый код!
Ugh, я оставил его там, когда был посеян с 'small.front()', а не 'big'. Спасибо, что сделали для меня идиотский тест. –