習題4-2 求冪級數展開的部分和
阿新 • • 發佈:2020-10-26
已知函式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是負數並且越來越大,死迴圈。
最最生氣的是,我竟然不知道哪出錯了,我檢查了很多遍都不清楚哪裡出問題。。。。