2011-10-19 16 views
4

私は入力として1を与えるとき、私はなぜ結果を得ることができないのか分かりません。#INFはmy_exp()からです。コードは次のとおりです。exp関数を使ってC++

double factorial(const int k) 
{ 
    int prod = 1; 
    for(int i=1; i<=k; i++) 
     prod = i * prod; 
    return prod; 
} 

double power(const double base, const int exponent) 
{ 
    double result = 1; 
    for(int i=1; i<=exponent; i++) 
     result = result * base; 
    return result; 
} 

double my_exp(double x) 
{ 
    double sum = 1 + x; 
    for(int k=2; k<50; k++) 
     sum = sum + power(x,k)/factorial(k); 
    return sum; 
} 
+0

問題を示す自己完結型のコードスニペットを提供してください。 –

+0

'x'の値は' 1#INF'を与えますか? – NPE

+0

x = 1は私に1を与えます。#INF – Sean

答えて

7

factorial関数で整数オーバーフローがあります。これにより、ゼロが出力されます。 49!2^32で割り切れるので、factorial関数はゼロを返します。

あなたはそれによってそれを無限になるように分割します。だから、解決策はdoubleprodを変更することです:

double prod = 1; 
6

代わりに完全にパワーとあなたの展開における各用語について階乗条件を評価する、あなたはk番目の用語がK-1に関連している方法を検討する必要がありますこの用語に基づいて各用語を更新するだけです。それはあなたの力と階乗関数の厄介なオーバーフローを避けます(あなたはもはや必要ありません)。例えば。

double my_exp(double x) 
{ 
    double sum = 1.0 + x; 
    double term = x;     // term for k = 1 is just x 
    for (int k = 2; k < 50; k++) 
    { 
     term = term * x/(double)k; // term[k] = term[k-1] * x/k 
     sum = sum + term; 
    } 
    return sum; 
} 
-2

kフォーム50の最大値を30にすると効果があります。

あなたのコードはちょうど0の近くで動作しますか?

関連する問題