习题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是负数并且越来越大,死循环。

最最生气的是,我竟然不知道哪出错了,我检查了很多遍都不清楚哪里出问题。。。。

原文地址:https://www.cnblogs.com/KeithTee/p/13881328.html