2010-06-30 149 views
7

我試圖讓到pow()功能從文件math.h someihing類似於一個簡單的通話..曖昧POW()函數

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

但Visual Studio中說,這是一個錯誤

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

我以爲我的格式爲float pow(float, float)

+4

閱讀錯誤消息的最後一行。 0.5被認爲是一個double,並且編譯器無法弄清楚自動重做它的內容,因爲有幾次強制轉換可以工作。 – tloach 2010-06-30 18:43:07

+0

我刪除了'c'標籤,因爲這是'C++'特有的。 – 2010-06-30 18:49:13

回答

18

在行:

v=pow(w,0.5); 

w是一個浮子和0.5double。您可以改用0.5f

+0

是的..你試圖叫'pow(float,double)'。編譯器不知道是否要將其轉換爲'pow(float,float)'(精度損失)或'pow(double,double)'。其實......我不知道爲什麼它不會選擇第二個......可能是因爲這個功能可能完全不同。 – mpen 2010-06-30 18:58:40

+0

它沒有選擇第二個,因爲它不知道在大多數用途中語義在實踐中是否足夠好,並且不值得教它,因爲肯定無法管理角落案例。例如,如果第一個結果超出範圍,則下游代碼可能取決於該行爲。人類應該做出決定;編譯器應該實現它們。 – mabraham 2014-05-21 12:52:13

2

嘗試 v=pow(w,0.5f);

2

0.5是double類型。嘗試

v=pow(w,0.5f); 
1

嘿,你試過0.5f嗎?

4

像pow(),sin()等數學函數在更現代的C++實現中被模板化。它含糊不清的原因是不清楚你想要做什麼。如果你發送的兩個參數是相同的,那麼你可能希望計算以特定的精度完成。如果它們不同,那麼你是想要以更高的精度進行計算,並且需要提高精度較低的操作數,還是希望降低精度,降低精度,然後以較低的精度進行計算。即

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

除了已經在其他的答案給予其他所有方法,你總是可以顯式地指定模板參數:

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