2012-03-20 39 views
1

我嘗試讓我自己戰俘,但我得到錯誤的結果C++或C戰俘給錯誤的結果

即時得到:2^3.3 = 16,這是不對的......爲什麼?

#include <iostream> 

using namespace std; 

double new_pow(double base, double power){ 

double result = 1; 

for(int i = 0; i <= power; i++) { 
    result *= base; 
} 


    return result; 
} 



int main (int argc, char * const argv[]) { 

    std::cout << new_pow(2,3.3) << endl; 
    return 0; 
} 

請幫我找到了這個錯誤

回答

3

Ignacio的答案已經提到使用對數。但是我們最終最終會使用exp()這又是一個庫函數。所以,如果你不想使用庫函數的話,那麼你不得不求助於類似的x^y

正如泰勒展開式的直接評價爲Taylor's expansionx^y繁瑣,如伊格納西奧提到,base^power = exp(power*ln(base))。而taylor's expansion for e^x是相當簡單的,而ln(x)也很簡單。用C兩者都產生於簡單Interative的/遞歸實現

下面是使用上述泰勒展開

double pow_x (double x , unsigned i) 
{ 
     double prod=1; 
     if (i == 0) 
      return 1; 
     while (i) 
     { 
      prod*=x; 
      i--; 
     } 
     return prod; 
} 

long long factorial (unsigned n) 
{ 
    if (n == 0) 
     return 1; 

    return n * factorial (n-1); 
} 

double expo (double x, int terms) 
{ 
     /* terms tells us how long should we expand the taylor's series */ 
     double sum=0; 
     unsigned i=0; 
     while (i< terms) 
     { 
      sum+= pow_x(x,i)/factorial(i); 
      i++; 
     } 
     return sum; 
} 

exp(5.93,20)e^x一個簡單的實現提供376.152869Google tends to agree.

我希望這在使用這個例子,你可以自己實施ln(x)

+0

這是很長的... – user1262876 2012-03-20 06:37:46

+0

任何例子?在C++或C? – user1262876 2012-03-20 06:40:31

+0

@ user1262876我同意taylor的擴展很難在C/C++中實現。我在這裏工作。我會盡快編輯我的答案 – 2012-03-20 06:42:04

0

因爲你是如此4.0後遞增1。i,這將直接增加爲5.0,從而使循環的條件檢查錯誤的,因而終止循環。

而且,循環變量的初始值是0,所以你應該看看這樣的 -

for(double i=0; i<power; i++) 

您可以在this答案看一看,以獲取有關如何執行浮點冪的想法和here爲它的一個相當高層次的實現。

+0

還是不行!當功率是浮點數時,使用重複乘法不能很容易地實現指數運算 – 2012-03-20 06:20:00

+0

@PavanManjunath:請參閱編輯。 – 2012-03-20 06:22:30

0
for(int i = 0; i <= power; i++) 

應該

for(int i = 1; i <= power; i++) 

否則,它會爲一個額外的迭代運行。

正如Ignacio Vazquez-Abram的回答所述。 假設你想要權力y = x^b。 這相當於ln(y)= b * ln(x)。

所以y = exp(b*ln(x))

y = Math.e(b*Math.Log(x)) //Java 
+0

即時通訊= 8 ..這仍然是錯誤的 – user1262876 2012-03-20 06:15:40

+0

你正在使用'int' ...所以你的'雙'是自動typecasted到'int' ....在你的循環... – 2012-03-20 06:16:50

+0

我確實改變它雙..之前問..但仍然相同 – user1262876 2012-03-20 06:17:18

5

的錯誤是,你的循環運行4次,因爲它不會超過3.3 4次迭代。這就是爲什麼浮點冪乘以對數而不是重複乘法。

+0

+1。只回答說明如何解決問題,而不是指出明顯的錯誤! – 2012-03-20 06:18:51

+0

所以我應該使用float而不是double? – user1262876 2012-03-20 06:19:38

+3

不,您應該使用[對數](http://en.wikipedia.org/wiki/Exponentiation#Powers_via_logarithms)而不是迭代。 – 2012-03-20 06:20:24

0

您正在通過將power視爲int來循環。循環將運行4次並返回2^4 = 16

How to approximate decimal exponents using logarithms

+0

我將它改爲了兩倍..錯誤 – user1262876 2012-03-20 06:18:03

+0

@ user1262876您不必將其更改爲雙倍。我只是提到你爲什麼得到你所得到的。正如伊格納西奧提到的那樣,非整數指數不能這樣做。他們完成對數。 – 2012-03-20 06:20:11

+0

所以我應該使用日誌? float .. im lost – user1262876 2012-03-20 06:21:17