2017-02-20 56 views
3

我已經寫了一個C程序,它應該計算和打印所有n值的e^x的近似值。我正在使用這個等式來實現我的程序。如何解決我的e^x逼近C程序?

f(x,n)= e^x = i = 0直到n = x^i/x! = x^0/0! + x^1/1! + x^2/2! + .... + x^n/n!

這是我的代碼:

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

double factorial(int n){ 
     double fac =1; 
     int i; 
     for(i =1; i <= n; i++){ 
       fac *=n; 
     } 
     return fac; 
} 
double exponent(double x, int n){ 
     double sum, i; 
     for(i = 0; i <=n; i++){ 
       sum += (pow(x, i)/ factorial(i)); 
     } 
     return sum; 
} 

int main(int argc, char *argv[]){ 
     int n = atoi(argv[1]); 
     double x = atof(argv[2]); 
     printf("\ti\tApproximantion\n"); 
     printf("-------------------------------------\n"); 
     int i; 
     for(i =0; i <=n; i++){ 
       printf("\t%d\t%f\n", i, exponent(x,i)); 
     } 
     printf("Exact Value =\t%12f\n", exp(x)); 
     return 0; 
}//main 

我使用迭代而不是遞歸。 我使用./aprroximation 10 2.2電流輸出爲:

 i  Approximation 
------------------------------------- 
     0  1.000000 
     1  3.200000 
     2  4.410000 
     3  4.804370 
     4  7.895877 
     5  8.912368 
     6  9.914798 
     7  10.915101 
     8  11.915134 
     9  12.915137 
     10  13.915137 
Exact Value =  9.025013 

輸出應爲:(忽略空格/ Tab鍵)

i Approximation 
-------------------------------- 
    0 1.0000000000 
    1 3.2000000000 
    2 5.6200000000 
    3 7.3946666667 
    4 8.3707333333 
    5 8.8002026667 
    6 8.9576747556 
    7 9.0071659835 
    8 9.0207760712 
    9 9.0241029815 
    10 9.0248349018 
Exact Value = 9.0250134994 

我似乎無法找到我的代碼的問題。我已經看了一些僞代碼的階乘和權力的功能,沒有什麼突出的。我的結果仍然是錯誤的。有什麼想法嗎?

+4

一遍又一遍地重新計算階乘是幼稚和昂貴的。 – duffymo

+0

從你的輸出看起來,似乎每次在步驟9之後'sum'都會加1。你可以通過輸入'n'而不是10來代替13,看看它是否成立? –

+0

嗯,我不能用你的代碼重現,輸出不同:在[ideone](http://ideone.com/Bok1D8)上。 –

回答

3

我看到,你沒有初始化變量sum裏面的exponent()函數。初始化爲零,否則exponent()函數看起來沒問題。

double exponent(double x, int n){ 
    double sum = 0, i; 
    for(i = 0; i <=n; i++){ 
     sum += pow(x, i)/ factorial(i); 
    } 
    return sum; 
} 

更新

我在factorial()功能發現了另一個問題。試想一下,for循環內的聲明是否正確!

for(i=1; i<=n; i++){ 
    fac *= n; 
} 

不是n!你所計算這裏,它是n^n。你應該做以下事情。

for(i=1; i<=n; i++){ 
    fac *= i; 
} 
+0

我沒注意到。這確實有幫助,但我的最高數字仍然是4,所以輸出是錯誤的。任何其他錯誤,你可以發現? –

+0

@below_avg_st查看我更新的答案。 –

5

有兩個問題:

  1. exponent功能你不初始化sum
  2. factorial功能是錯誤的。

如果您已經單獨測試了factorial函數,您至少可以自己發現這個問題。