| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1133 人关注过本帖
标题:一道计算e^n的函数题,我不知道哪里错了!!!求赐教
取消只看楼主 加入收藏
xyaliner
Rank: 2
等 级:论坛游民
帖 子:27
专家分:35
注 册:2012-5-10
结帖率:60%
收藏
 问题点数:0 回复次数:5 
一道计算e^n的函数题,我不知道哪里错了!!!求赐教
原理为:e^n=1+n+n^2/(2!)+n^3/(3!)+……+n^x/(x!)
源代码如下:(x控制精度,n为指数)
#include

unsigned f1(unsigned p,unsigned q);
unsigned f2(unsigned r);
long double f3(unsigned n,unsigned x);

void main()
{
     unsigned n,x;
 
     printf("Please input n and x:");
     scanf("%u%u",&n,&x);
     printf("e^%u = %lf\n",n,f3(n,x));
}

 unsigned f1(unsigned p,unsigned q)               //计算n^x
{
    unsigned pow=1;  

    if(q>0)
       for(;q>0;--q)
           pow*=p;
    else
       pow=1;
 
   return pow;
}
unsigned f2(unsigned r)                          //计算x!
{
    unsigned fac;
 
    if(r==0||r==1)
         fac=1;
    else
         fac=r*f2(r-1);  
   
    return fac;
}

long double f3(unsigned n,unsigned x)            //计算e^x
{
   long double exp=0;
   unsigned i;

   for(i=0;i<=x;i++)
        exp+=1.0*f1(n,i)/f2(i);
 
   return exp;
}

检验时发现:输入3 22和输入3 12结果有蛮大差异,而由3 22算出来的结果和e^3相同!!
x是控制精度的,不知道哪里出错了!!
搜索更多相关主题的帖子: 计算 include 源代码 
2012-05-10 20:00
xyaliner
Rank: 2
等 级:论坛游民
帖 子:27
专家分:35
注 册:2012-5-10
收藏
得分:0 
有点匆忙,更正一下    #include<stdio.h>没有打出来………忽略这个   
                      另外 最后检验时是输入3 12和正确值相近!


[ 本帖最后由 xyaliner 于 2012-5-10 20:18 编辑 ]
2012-05-10 20:14
xyaliner
Rank: 2
等 级:论坛游民
帖 子:27
专家分:35
注 册:2012-5-10
收藏
得分:0 
回复 8楼 TonyDeng
回复晚了,不好意思,非常感谢大大耐心而细致的解答~~(*^__^*) !!
2012-05-12 00:16
xyaliner
Rank: 2
等 级:论坛游民
帖 子:27
专家分:35
注 册:2012-5-10
收藏
得分:0 
回复 8楼 TonyDeng
首先,再次非常地感谢大大的指导。
1、函数原理我没有理解错,这个原理是书上的,至于x是不是精度控制,书上没提;
2、经过独立检验,我定义的计算x!的函数是正确的;
3、逐项输出结果观察数据,以判断级数是否收敛:我发现当n=3,x>13后,输出值并不像x<13时递增,而是出现了摆动;
4、我估计最终问题应该如同你估计的溢出错误所致:
        我直接用数学库函数编程检验如下:
#include<stdio.h>
#include<math.h>

int f(int r);

void main()
{
    int i,n,x;
    double exp;

    scanf("%d%d",&n,&x);
    for(i=1,exp=1;i<=x;i++)
        exp+=pow(n,i)/f(i);
    printf("%f",exp);
}

int f(int r)                          //计算x!
{
    int fac;
   
    if(r==0||r==1)
        fac=1;
    else
        fac=r*f2(r-1);

    return fac;
}
     当输入,3  12时,结果正确,当输入3 22时结果为负,溢出。

                                                  
2012-05-12 00:49
xyaliner
Rank: 2
等 级:论坛游民
帖 子:27
专家分:35
注 册:2012-5-10
收藏
得分:0 
回复 11楼 lucky563591
首先,计算e^n在数学函数里有exp(),系统是无法识别pow(e,n)里的e的;
然后这是为了检验是不是这个多项式的值溢出:1+n+n^2/(2!)+n^3/(3!)+……+n^x/(x!)。
2012-05-12 09:25
xyaliner
Rank: 2
等 级:论坛游民
帖 子:27
专家分:35
注 册:2012-5-10
收藏
得分:0 
回复 13楼 TonyDeng
嗯嗯,当我用double代替整数储存后再测试,发现:  
    1、当x>=647时,溢出;
    2、当x<8时,结果精度随x的增大而增高;当x>=8且x<=16时,精度有小幅度提升;当x>16时,x已经对计算值的小数点前6位(即取8位有效数字:20.085537)无影响。
   
     因此结论是:在计算n^x和x!时,计算值超出了int型变量的最大取值范围而溢出,导致最终结果的错误。
                                          感谢大大更进一步的指导!!!

[ 本帖最后由 xyaliner 于 2012-5-13 00:26 编辑 ]
2012-05-13 00:12
快速回复:一道计算e^n的函数题,我不知道哪里错了!!!求赐教
数据加载中...
 
   



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

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