C ++ std :: accumulate не дает ожидаемого сумма

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, что, очевидно, неверно. Любые объяснения?

37
задан ROMANIA_engineer 14 October 2017 в 22:43
поделиться

2 ответа

Вы вызываете accumulate с 0 в качестве аргумента init, поэтому он будет накапливаться с использованием целочисленной математики. Вместо этого используйте 0.0.

8
ответ дан 27 November 2019 в 04:29
поделиться
std::accumulate ( doublenumbers.begin( ) , doublenumbers.end( ) , .0 ) ;

или

std::accumulate ( doublenumbers.begin( ) , doublenumbers.end( ) , (double) 0 ) ;

Тип переменной "аккумулятор" является типом последнего аргумента std::accumulate. Вы указали 0 в качестве аргумента — литерала int — это означает, что тип аккумулятора будет int. «Накопление» выполняется в накопителе int (т.е. округляется до int после каждого отдельного суммирования) и дает результат int. В данном случае это, по-видимому, 1.

6
ответ дан 27 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: