1. 程式人生 > 實用技巧 >習題4-2 求冪級數展開的部分和

習題4-2 求冪級數展開的部分和

已知函式ex​​可以展開為冪級數1。現給定一個實數x,要求利用此冪級數部分和求ex​​的近似值,求和一直繼續到最後一項的絕對值小於0.00001。

輸入格式:

輸入在一行中給出一個實數0。

輸出格式:

在一行中輸出滿足條件的冪級數部分和,保留小數點後四位。

輸入樣例:

1.2

輸出樣例:

3.3201


 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<string.h>
 4 #include<stdlib.h>
 5 double fact(int n) {                //階乘
6 long double sum = 1; 7 for (int i = 1; i <= n; i++) { 8 sum *= i; 9 } 10 return sum; 11 } 12 int main() { 13 double x = 0; 14 scanf("%lf", &x); 15 double temp = 0.0; //臨時變數 16 double fenmu = 0.0; 17 double fenzi = 0.0; 18 double e = 1.0; 19 for
(int i = 1;; i++) { //第一項是x的一次方除以1 所以這裡int = 1 20 21 fenzi = 1.0 * pow(x, i); 22 fenmu = 1.0 * fact(i); 23 temp = fenzi / fenmu; 24 e += temp; 25 if (fabs(temp) < 0.00001) { 26 break; 27 } 28 } 29 printf("%.4lf", e);
30 return 0; 31 }

這個題目我覺得很有必要放上來。

這個題目我遇到的問題是:精度不夠,導致x取到比較大的值時,資料溢位,導致出錯。

具體一點,我之前寫的程式碼,在fact函式裡面,它的返回值型別和裡面的sum,我用的是int型別,因為它就是整數,我覺得用double有點顯得多此一舉,沒想到輸在了這裡。

int 精度 沒有double精度高,所以一個答案通不過,就是最大x。

例如,當x取到5時,fact返回的數字就是亂碼的了,甚至是負數,因為精度不夠,導致main函式裡面temp是負數並且越來越大,死迴圈。

最最生氣的是,我竟然不知道哪出錯了,我檢查了很多遍都不清楚哪裡出問題。。。。