zoukankan      html  css  js  c++  java
  • 习题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是负数并且越来越大,死循环。

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

  • 相关阅读:
    【OBIEE】补全维度成员
    【OBIEE】超过了已配置的最大允许输入记录数
    【OBIEE】开启和关闭OBIEE的SSO登陆认证
    【OBIEE】OBIEE重装删除DEV前缀
    【OBIEE】OBIEE 12C迁移
    【OBIEE】OBIEE集成第三方js
    【Java】webservice调用
    【前端】汉字转拼音首字母
    【Oracle】Redhat安装Oracle 11g
    CAS单点登录:基础框架搭建(一)
  • 原文地址:https://www.cnblogs.com/KeithTee/p/13881328.html
Copyright © 2011-2022 走看看