double numbers[ ] = { 1, 0.5 ,0.333333 ,0.25 ,0.2, 0.166667, 0.142857, 0.125,
0.111111, 0.1 } ;
std::vector<double> doublenumbers ( numbers , numbers + 10 ) ;
std::cout << std::accumulate ( doublenumbers.begin( ) , doublenumbers.end( ) , 0 ) ;
Это дает 1, что, очевидно, неверно. Любые объяснения?
Вы вызываете accumulate
с 0
в качестве аргумента init
, поэтому он будет накапливаться с использованием целочисленной математики. Вместо этого используйте 0.0
.
std::accumulate ( doublenumbers.begin( ) , doublenumbers.end( ) , .0 ) ;
или
std::accumulate ( doublenumbers.begin( ) , doublenumbers.end( ) , (double) 0 ) ;
Тип переменной "аккумулятор" является типом последнего аргумента std::accumulate
. Вы указали 0
в качестве аргумента — литерала int
— это означает, что тип аккумулятора будет int
. «Накопление» выполняется в накопителе int
(т.е. округляется до int
после каждого отдельного суммирования) и дает результат int
. В данном случае это, по-видимому, 1
.