accumulate でオーバーフローすることがある (C++)
C++
Published: 2020-01-05

やったこと

accumulate で計算結果がオーバーフローした時の対処方法です。

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

// accumulateの戻り値型は、第3引数の型となるため、変数sum_llの型はlong long

戻り値の型は、第3引数で決まります。 なので、戻り値を long long にする場合、 0LL にする必要があります。

test.cpp

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    ll a[] = {(ll)1e9, (ll)1e9, (ll)1e9, (ll)1e9};

    cout << accumulate(a, a + 4, 0) << endl;
    cout << accumulate(a, a + 4, 0LL) << endl;
}

出力結果

-294967296
4000000000

参考