2011-01-26 39 views
1

我的公司有一個軟件,運動一個相當大的代碼庫。最近,我被分配了檢查代碼是否會使用gcc 4.1.2在x86_64目標上編譯的任務。編譯中對代碼做了很小的修改,但是今天早上我收到了一些令人困惑的編譯錯誤。編譯器錯誤:無與倫比的pow調用(...)

該代碼正在嘗試並失敗,使用int, unsigned int&作爲參數從<cmath>調用pow。編譯器吐出一個錯誤,因爲它找不到合適的匹配來調用。是pow<cmath>的重載如下:

double pow(double base, double exponent) 
long double pow(long double base, long double exponent) 
float pow(float base, float exponent) 
double pow(double base, int exponent) 
long double pow(long double base, int exponent) 

我不太舒爾,爲什麼這進一步鞏固了我們的32位環境,但是這不是重點現在。

我的問題是:我應該如何施放參數,我應該使用哪一個pow?謝謝。

P.S.我無法更改參數的數據類型,因爲這樣做會需要太多的工作。我的任務是獲取代碼進行編譯,詳細說明我所做的任何黑客攻擊,以便稍後我們可以查看這些黑客並找到正確的方法處理它們。

+0

也許你可以添加確切的編譯錯誤?那些違規的線? – xtofl 2011-01-26 07:56:48

+1

你不能只將'unsigned int&'轉換爲int或float嗎?試試pow(a,(float)b) – fazo 2011-01-26 07:58:34

回答

2

如果你打很多電話給pow(int, unsigned int)你爲什麼不直接自己編碼?如果執行速度不是問題,那不是太多工作。

否則,我會使用一個pow()過載,其輸入參數保證包含您的期望值,例如pow(float, float)pow(double, double)。無論如何,我覺得製作自己的版本可以防止浮點和整數之間的轉換問題。

+1

這是一個好主意:例如運行時檢查`unsigned int`實際上是否存在一個強制類型轉換爲`int` ... – xtofl 2011-01-26 08:08:49

1

結果將始終爲整數,帶有這些類型的參數。

根據參數的期望範圍,特別是指數,您應該選擇floatdoublelong double版本。

因此,這將成爲

pow((float) i, (int)ui); 

您可以通過solving方程POW(I,UI)< max_double找到參數的允許範圍。