2010-06-30 15 views
7

Próbuję zrobić prosty wywołanie funkcji pow() z math.h someihing podobny do .. mówi, że to błądNiejednoznaczne pow() funkcja

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

#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; 
} 

ale Visual Studio Myślałem, że mam format float pow(float, float).

+4

przeczytać ostatni wiersz tego komunikatu o błędzie. 0.5 jest uważane za podwójne, a kompilator nie może dowiedzieć się, do czego automatycznie go przekształcić, ponieważ istnieje kilka rzutów, które mogłyby to zrobić. – tloach

+0

Usuwam tag 'c', ponieważ jest to unikalne dla' C++ '. –

Odpowiedz

18

w linii:

v=pow(w,0.5); 

w jest pływak i 0.5 jest double. Zamiast tego możesz użyć 0.5f.

+0

Tak, próbowałeś wywołać 'pow (float, double)'. Kompilator nie wie, czy chcesz rzucić to na 'pow (float, float)' (utrata precyzji) lub 'pow (double, double)'. Właściwie ... nie wiem, dlaczego nie wybiera drugiego ... prawdopodobnie dlatego, że funkcja może być zupełnie inna. – mpen

+0

Nie wybiera drugiego, ponieważ nie wie, że semantyka jest wystarczająco dobra w praktyce dla większości zastosowań, i nie warto tego uczyć, ponieważ zdecydowanie nie można zarządzać narożnymi przypadkami. Na przykład, jeśli wynik pierwszego będzie poza zakresem, kod źródłowy może być zależny od tego zachowania. Ludzie powinni podejmować decyzje; kompilatory powinny je implementować. – mabraham

2

Spróbuj v=pow(w,0.5f);

2

0.5 jest typu podwójnego. Wypróbuj

v=pow(w,0.5f); 
1

Hej, próbowałeś 0,5f?

4

Funkcje matematyczne, takie jak pow(), sin() itd., Są przekształcane w templat w bardziej nowoczesnych implementacjach C++. Powód jest niejednoznaczny, ponieważ nie jest jasne, co chcesz zrobić. Jeśli oba argumenty są takie same, prawdopodobnie chcesz, aby obliczenia były wykonywane z tą dokładnością. Jeśli są różne, to czy chcesz obliczyć z większą precyzją i podnieść dokładniejszy operand, czy chcesz obniżyć wyższą dokładność, aby zmniejszyć dokładność, a następnie wykonać obliczenia z mniejszą precyzją. tj

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

Oprócz wszystkich innych metod, które już zostały podane w innych odpowiedzi, zawsze można jednoznacznie określić szablon argument:

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