2013-10-21 154 views
2

我想在不用調用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

+0

這將是相當緩慢和太不精確。 –

+4

值爲int爲什麼? – ughoavgfhw

+0

我改變了值爲一倍,謝謝 – user28374

回答

13

此功能是不夠的,原因如下:

  • 這是越野車。請注意,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上進行搜索。

  • 它重新發明輪。在基本層面上,您應該問自己爲什麼要重寫語言數學庫提供給您的函數。這可能會在程序中引入錯誤或低效率(請參閱前面的重點),並且在一天結束時您還沒有增加功能。

希望這有助於!

+0

,它不處理溢出! – nitish712

+0

@ nitish712-我認爲這是我在第一部分中提到的int錯誤的後果。一旦解決了這個問題,我認爲溢出問題就會解決。 – templatetypedef

+0

你是對的:) – nitish712

0

你的功能應該是這樣的,它會跑的比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; 
} 
+1

這不是你如何檢查浮點溢出。我不知道這個標準是怎麼說的,但是我的系統(OS X,x86-64,Apple LLVM GCC 4.2.1)返回無窮大。它也總是檢測到「溢出」,如果X小於1. – ughoavgfhw

+0

@ughoavgfhw你是對的,更新.. –