2015-11-24 2 views
0

pour une affectation On m'a demandé d'écrire un programme qui calcule la moyenne géométrique et arithmétique en c normal. i a écrit cette fonction:La fonction pow donne un résultat indésirable c

double Geometric_mean(int number[], int n) //number[5]={1,2,3,4,5},n=5 
{ 
    int i; 
    double mean = 1; 
    for (i = 0;i < n;i++) 
    { 
     mean =mean*number[i]; 
    } 
    mean = pow(mean,1/n); //mean=120 
    return(mean); //mean=1 
} 

i obtenir le résultat souhaité avant que le prisonnier de guerre, il se tourne vers 1 au lieu du du désiré 2,605

+0

"calcule géométrique et moyenne arithmétique dans * c * régulier". Alors pourquoi avez-vous tagué C++? – Samidamaru

Répondre

4

Depuis 1 et n sont int s, 1/n est une division euclidienne dont le résultat est 0 pour tout n > 1.

Vous devez utiliser une division double:

#include <cstddef> 
#include <cmath> 

double gmean(const int data[], std::size_t datasize) 
{ 
    double product = 1.0; 
    for (std::size_t i = 0 ; i < datasize ; i++) 
    { 
     product *= data[i]; 
    } 
    return std::pow(product, 1.0/datasize); 
} 

Live example.

Notez que j'ai une réponse en C++. C et C++ sont deux langues séparées et vous devez choisir lequel utiliser au préalable.

+1

Je préférerais '1.0/n' à la place de la distribution statique – mch

+0

@mch Vous avez raison. je suis en train d'éditer. – YSC

2

Vous utilisez pow de division intégrale (moyenne, 1/n); le résultat de 1/n est égal à zéro si n> 1. Vous devez convertir flotter ou double:

pow(mean,1.0/n); 

ou

pow(mean,1/(double)n); 
+0

et pourquoi pas '1.0/(double) n' ??? Pourquoi forcer avec un cast le compilateur pour faire un autre casting? Bien sûr, tout est correct, mais pourquoi insister pour utiliser des entiers si l'opération entière est en virgule flottante? Les débutants obtiennent une meilleure instruction s'ils apprennent dès le départ à distinguer les littéraux en virgule flottante (nombres ** avec ** un point décimal explicite) des littéraux entiers (ils n'ont pas de point) –