Почему цикл дает разные результаты, чем накапливается?

Я разместил здесь ответ, реализующий Суммирование Кахана: 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 должны оценить именно так тот же код!

1

Решение

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector