我想在不用調用pow()的情況下在c中編寫一個冪函數。我可以使用此自定義功能替換內置的pow功能嗎?
double power (double X, int Y)
{
int i;
double value = 1;
for (i = 0; i < Y; i++)
value *= X;
return value;
}
我的問題是,沒有任何理由,你可以看到這個功能不會有任何給定的測試值正常工作?我試圖涵蓋所有輸入的可能性。
-Thanks
我想在不用調用pow()的情況下在c中編寫一個冪函數。我可以使用此自定義功能替換內置的pow功能嗎?
double power (double X, int Y)
{
int i;
double value = 1;
for (i = 0; i < Y; i++)
value *= X;
return value;
}
我的問題是,沒有任何理由,你可以看到這個功能不會有任何給定的測試值正常工作?我試圖涵蓋所有輸入的可能性。
-Thanks
此功能是不夠的,原因如下:
這是越野車。請注意,value
被聲明爲int
而非double
,這意味着如果您嘗試計算power(1.5, 1)
,則將返回1而不是1.5
。事實上,幾乎所有的投入都是錯誤的。
它不處理負指數。嘗試計算power(2, -1)
。正確的答案是0.5
,但是你的函數(修復上面提到的int
錯誤之後)將返回1而不是0.5
。你可以很容易地解決這個問題(例如,你可以計算power(2, 1)
,然後採取倒數),但是按照目前的寫法,這很麻煩。
這很慢。當功率爲整數時,大多數指數是使用一種稱爲exponentiation by squaring的算法來計算的,該算法比您的代碼快得多。通過平方運算的冪運算將執行Θ(log Y)乘法運算,而代碼所做的乘法運算則爲Θ(Y)。您的功能需要花費更長的時間才能完成。
它不處理分數指數。嘗試計算power(1.5, 1.5)
。你會得到錯誤的答案,因爲指數是int
,而不是double
。糾正這一點並不容易;關於如何正確實現這一點的其他問題,在Stack Overflow上進行搜索。
它重新發明輪。在基本層面上,您應該問自己爲什麼要重寫語言數學庫提供給您的函數。這可能會在程序中引入錯誤或低效率(請參閱前面的重點),並且在一天結束時您還沒有增加功能。
希望這有助於!
,它不處理溢出! – nitish712
@ nitish712-我認爲這是我在第一部分中提到的int錯誤的後果。一旦解決了這個問題,我認爲溢出問題就會解決。 – templatetypedef
你是對的:) – nitish712
你的功能應該是這樣的,它會跑的比POW慢(),它運行在爲O(log Y):
#include<math.h>
#define ABS(x) ((x<0)?(-x):(x))
double power (double X, int Y)
{
int i;
double value = 1;
if (Y == 0)
{
return 1.0;
}
else if (X == 0)
{
return 0.0;
}
for (i = 0; i < ABS(Y); i++)
{
value *= X;
if (value == NAN
|| value == INFINITY
|| (X > 0 && (value*X) < value)
|| (X < 0 && (value*X) > value))
{
return NAN;
}
}
if (Y < 0) return (1.0/value);
else return value;
}
這不是你如何檢查浮點溢出。我不知道這個標準是怎麼說的,但是我的系統(OS X,x86-64,Apple LLVM GCC 4.2.1)返回無窮大。它也總是檢測到「溢出」,如果X小於1. – ughoavgfhw
@ughoavgfhw你是對的,更新.. –
這將是相當緩慢和太不精確。 –
值爲int爲什麼? – ughoavgfhw
我改變了值爲一倍,謝謝 – user28374