已知函数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是负数并且越来越大,死循环。
最最生气的是,我竟然不知道哪出错了,我检查了很多遍都不清楚哪里出问题。。。。