50 votes

C++ std::accumulate ne donne pas la somme attendue

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 ) ;

Cela produit 1, ce qui est évidemment faux. Des explications ?

72voto

AraK Points 38702

Vous devez écrire ce qui suit :

 std::cout << 
 std::accumulate ( doublenumbers.begin( ) , doublenumbers.end( ) , 0.0 ) ;

Parce que le type de 0 est int .

Lorsque std::accumulate est instancié avec le type du troisième argument est int , alors il convertirait le côté droit de la somme. par exemple:

    result += *iter;
// int    += double

Cela forcerait une conversion de double en int , au lieu de ce à quoi vous pensiez qui est le contraire.

9voto

Oli Charlesworth Points 148744

Vous appelez accumulate avec 0 comme init , donc il s'accumulera à l'aide de calculs entiers. Utilisez plutôt 0.0

1voto

std::accumulate<double> (doublenumbers.begin(), doublenumbers.end(), 0); // also works

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X