我有一个生成一些大数字的函数,将它们放在一个向量中,对它们求和,然后返回总和。我一直在使用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
的值相等。但是,sum等于470064632
且测试总和等于82074443256
,这是预期值。
我尝试将限制减少到更小的数字(500),sum
和testSum
的值相等。这让我觉得错误是accumulate
溢出,我不知道问题是什么。我正在使用VS2012编译x64平台。
答案 0 :(得分:19)
看起来像溢出错误:数字是0x131C049DF8和0x1C049DF8。
尝试将最终参数0
转换为ull
类型,因为accumulate返回的类型是最终参数的类型:
T accumulate(InputIt first, InputIt last, T value) { ... }