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が等しいことを期待します。ただし、sum は に等しく470064632、test sum は に等しく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 に答える