std :: accumulate可能溢出

时间:2012-12-16 22:30:48

标签: c++

我有一个生成一些大数字的函数,将它们放在一个向量中,对它们求和,然后返回总和。我一直在使用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;
}

我希望sumtestSum的值相等。但是,sum等于470064632且测试总和等于82074443256,这是预期值。

我尝试将限制减少到更小的数字(500),sumtestSum的值相等。这让我觉得错误是accumulate溢出,我不知道问题是什么。我正在使用VS2012编译x64平台。

1 个答案:

答案 0 :(得分:19)

看起来像溢出错误:数字是0x131C049DF8和0x1C049DF8。

尝试将最终参数0转换为ull类型,因为accumulate返回的类型是最终参数的类型:

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