2011-10-19 31 views
4

我無法弄清楚爲什麼我不斷得到結果1.#my_exp()當我給它1作爲輸入。下面是代碼:使用C++的exp函數

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函數將返回零。

然後你除以它導致它無限。因此,解決辦法是改變proddouble

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附近工作?