14

我有一个函数可以生成一些大数,将它们放入一个向量中,对它们求和,然后返回总和。我一直在用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,但我不确定问题可能是什么。我正在为 x64 平台使用 VS2012 进行编译。

4

1 回答 1

24

它看起来确实像一个溢出错误:数字是 0x131C049DF8 和 0x1C049DF8。

尝试将您的最终参数0转换为 type ull,因为累积返回的类型是该最终参数的类型:

T accumulate(InputIt first, InputIt last, T value) { ... }
于 2012-12-16T22:39:16.257 回答