2010-06-30 7 views
7

Je suis en train de faire un simple appel à la fonction pow() de math.h someihing similaire à ..fonction pow() Ambigu

#include<math.h> 
int main() 
{ 
    float v,w; 
    w=3.0; 
    v=pow(w,0.5);//i think this is 'float pow(float,float)' 
    return 0; 
} 

mais visual studio dit que c'est une erreur

1>c:\users\user\documents\visual studio 2008\projects\deo\deo\main.cpp(7) : error C2666: 'pow' : 6 overloads have similar conversions 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(575): could be 'long double pow(long double,int)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(573): or  'long double pow(long double,long double)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(527): or  'float pow(float,int)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(525): or  'float pow(float,float)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(489): or  'double pow(double,int)' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(123): or  'double pow(double,double)' 
1>  while trying to match the argument list '(float, double)' 

Je pensais avoir le format float pow(float, float).

+4

Lire la dernière ligne de ce message d'erreur. 0.5 est considéré comme un double, et le compilateur ne peut pas savoir à quoi il faut le refondre automatiquement puisqu'il y a plusieurs moulages qu'il pourrait faire qui fonctionneraient. – tloach

+0

Je supprime la balise 'c' car elle est unique à' C++ '. –

Répondre

18

Dans la ligne:

v=pow(w,0.5); 

w est un flotteur et 0.5 est un double. Vous pouvez utiliser 0.5f à la place.

+0

Ouais ... vous essayiez d'appeler 'pow (float, double)'. Le compilateur ne sait pas si vous voulez lancer ça en 'pow (float, float)' (perte de précision) ou 'pow (double, double)'. En fait ... je ne sais pas pourquoi il ne choisit pas le second ... probablement parce que la fonction pourrait être quelque chose de complètement différent. – mpen

+0

Il ne choisit pas le second parce qu'il ne sait pas que la sémantique est assez bonne dans la pratique pour la plupart des utilisations, et cela ne vaut pas la peine de l'enseigner car il ne peut certainement pas gérer les cas de coin. Par exemple, si le résultat du premier est hors de portée, le code aval peut dépendre de ce comportement. Les humains devraient prendre des décisions. les compilateurs devraient les implémenter. – mabraham

2

Essayez v=pow(w,0.5f);

2

0.5 est de type double. Essayez

v=pow(w,0.5f); 
1

Hey, avez-vous essayé 0.5f?

4

Les fonctions mathématiques comme pow(), sin() etc. sont modélisées dans des implémentations C++ plus modernes. La raison pour laquelle il est ambigu est que ce que vous voulez faire n'est pas clair. Si vous envoyez les deux arguments étant les mêmes, vous voulez sans doute que le calcul soit fait à cette précision spécifique. Si elles sont différentes, alors vous voulez calculer à la plus haute précision et upcast l'opérande de précision inférieure, ou voulez-vous baisser la précision plus élevée pour réduire la précision et ensuite faire le calcul avec une précision plus faible. à savoir

float a,b; 
double c,d; 
pow(a,b); // not ambiguous, done at float precision 
pow(c,d); // not ambiguous, done at double precision 
pow(a,c); // ambiguous, gives error 
pow((double)a,c); // not ambiguous, performs computation at double precision 
pow(a,(float)c); // not ambiguous, gives computation at float precision, but c might lose precision in the down cast 
0

En plus de toutes les autres méthodes qui ont déjà été données dans les autres réponses, vous pouvez toujours spécifier explicitement l'argument modèle:

float w = 3.0f; 
double v = 1.5; 
v = pow<float>(w, v);