繁体   English   中英

std :: accumulate可能溢出

[英]Possible overflow with 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;
}

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM