Я разместил здесь ответ, реализующий Суммирование Кахана: 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
выходы:
2.000000000000000e + 00
Живой пример на http://coliru.stacked-crooked.com/a/3cb0e3c542303eb4
Что тут происходит? Эти 2 должны оценить именно так тот же код!
В примере с накоплением вы не выполняете итерацию по всему набору значений. next(cbegin(small))
начнется с элемента после cbegin(small)
, Попробуйте это вместо этого.
accumulate(cbegin(small), cend(small), big, /*the lambda*/);
Других решений пока нет …