C++ std::accumulate doesn't give the expected sum
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 ) ;
This produces 1, which is evidently wrong. Any explanations?
Solution 1:
You should write the following:
std::cout <<
std::accumulate ( doublenumbers.begin( ) , doublenumbers.end( ) , 0.0 ) ;
Because the type of 0 is int
.
When std::accumulate
is instantiated with the type of the third argument is int
, then it would convert the right hand side of the sum. e.g.:
result += *iter;
// int += double
This would force a conversion of double
to int
, instead of what you were thinking of which is the opposite.
Solution 2:
You're calling accumulate
with 0
as the init
argument, so it'll accumulate using integer maths. Use 0.0
instead.