Возможное переполнение с помощью std:: accumulate

У меня есть функция, которая генерирует некоторые большие числа, помещает их в вектор, суммирует их, возвращает сумму. Я использовал std::accumulate для вычисления суммы, однако после некоторого тестирования я понял, что он не возвращает ожидаемую сумму.

typedef unsigned long long ull;
ull sum(ull kLimit)
{
    ull testSum = 0;
    vector<ull> numbers;
    for (ull n = 0; n < kLimit; ++n) {
        if (/* number I want */) {
            numbers.push_back(n);
            // directly sum for testing
            testSum += n;
        }
    }
    ull sum = accumulate(begin(numbers), end(numbers), 0);
    return sum;
}

Я ожидал бы, что значение sum и testSum будет равно. Однако сумма равна 470064632, а тестовая сумма равна 82074443256, что является ожидаемым значением.

Я попытался уменьшить предел до гораздо меньшего числа (500), а значения sum и testSum были равны. Это заставляет меня думать, что ошибка переполнена с помощью accumulate, я не уверен, что проблема может быть. Я компилирую VS2012 для платформы x64.

Ответ 1

Это похоже на ошибку переполнения: цифры 0x131C049DF8 и 0x1C049DF8.

Попробуйте ввести последний параметр 0, чтобы ввести ull, потому что тип, возвращаемый путем накопления, является типом этого окончательного параметра:

T accumulate(InputIt first, InputIt last, T value) { ... }