| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 417 人关注过本帖
标题:精度控制
只看楼主 加入收藏
汪t宝宝
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-7-3
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:3 
精度控制
1、编写一子函数my_expTaylor,以x和n为参数,函数返回ex的近似值。用my_exp.c文件来中实现完整的程序。
2、编写主函数main来调用my_expTaylor,给出参数x =1.0, n = 0, 1, 2, …, 9 (也就是说,不同n值共调用10次)时的运行结果,每次调用的运行结果单独一行(注意输出格式和数值范围)。
3、在第2步的基础上更改程序,使程序的最后结果能够满足一定的精度要求(如累加项的值小于10-4)。
注意:
除输入输出函数外不能使用C语言标准库函数,尤其是exp 函数。
n越大精度越高.
my_expTaylor 函数的第一个参数必须为双精度类型。
my_expTaylor 函数的第二个参数必须为无符号整。
my_expTaylor 函数的返回值必须为双精度类型。
不能在my_expTaylor函数内使用printf函数。
注意零的阶乘为1.
我的程序为:#include<stdio.h>
double my_expTaylor(double x,double r);
void main()
{
    double x,r,m;
    unsigned int n;
    printf("Please input x和r:\n");
     scanf("%lf,%lf",&x,&r);
       m=my_expTaylor(x,r);
   printf("e的%lf次幂的%u阶近似值是%lf\n",x,n,m);
  }
 double my_expTaylor(double x,double r)
 {
     int i;
     double t=1,p=1,sum=1,w;
{
    for(i=1;;i++)
{
 t=t*i;
 p=p*x;
 w=p/t;
 sum=sum+w;
 if(p/t<r)
    break;
}
}
return(sum);
 }
运行结果一直是48阶,精度控制对吗
就是在进行第三步的时候一直不正确,求指导
搜索更多相关主题的帖子: C语言 
2015-07-03 12:45
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:20 
程序代码:
#include<stdio.h>

double my_expTaylor(double x,unsigned int n)
{
    int i;
    double t=1,p=1,sum=1,w;
    {
        for(i=1;;i++)
        {
            t=t*i;
            p=p*x;
            w=p/t;
            if(w<0.00001) break;
            sum=sum+w;
        }
    }
    return sum;
}

int main()
{
    printf("ex=%lf\n",my_expTaylor(1.0,10));
    return 0;
}


DO IT YOURSELF !
2015-07-03 14:22
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
常数 e 的值约为 2.718282

DO IT YOURSELF !
2015-07-03 14:29
汪t宝宝
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-7-3
收藏
得分:0 
回复 2楼 wp231957
老师说是由于算法不好的原因,如果数据过大,会溢出。修改之后是这样
#include<stdio.h>
double my_expTaylor(double x,double r);
void main()
{
    double x,r,m;
    unsigned int n;
    printf("Please input x,r:\n");
     scanf("%lf,%lf",&x,&r);
       m=my_expTaylor(x,r);
   printf("e^(%lf)=%lf\n",x,m);
  }
 double my_expTaylor(double x,double r)
 {
     int i;
     double t=1,sum=1;
    for(i=1;;i++)
{
 t=t*(x/i);
 sum=sum+t;
 if(t<r)
    break;
}
return(sum);
 }
r为精度
2015-07-05 14:02
快速回复:精度控制
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046587 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved