accumulateの第三引数に注意(及び数値の型指定)

vector<long long>型やvector<double>型の配列 x の総和を求めるときに,

std::accumulate(x.begin(), x.end(), 0);

とすると誤差がおおきくなったり,オーバーフローしたりする。std::accumulateの仕様として第三引数の型で値が帰ってくるらしい。なので正しくはそれぞれ

std::accumulate(x.begin(), x.end(), 0LL);
std::accumulate(x.begin(), x.end(), 0.0);

とする。一応数値の型指定のまとめしておく:

0          //int
0LL        //int64_t
0.0        //double
0.0f       //float  

(2020/04/24 19:55 誤りがあったので修正しました。)

(メモ) std::cout よりも printf のほうが便利で早いこともあるっぽい,桁数固定など