| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1132 人关注过本帖
标题:一道计算e^n的函数题,我不知道哪里错了!!!求赐教
只看楼主 加入收藏
xyaliner
Rank: 2
等 级:论坛游民
帖 子:27
专家分:35
注 册:2012-5-10
结帖率:60%
收藏
 问题点数:0 回复次数:13 
一道计算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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
double双精度数的精度只有18位,而且不是所有编译器和执行机器的long double字长必然是double两倍的,你使用long double之前,先检查一下sizeof(long double)到底有多长。

授人以渔,不授人以鱼。
2012-05-10 20:28
月幽之境
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-5-10
收藏
得分:0 
回复 3楼 TonyDeng
我那个号不是怎么的,密码老是输入错误,汗……
     我试过了,long double和double 等长,当我把long double全换为 double ,unsigned全换为 int时,输入3 22结果还是比正确值多6,有较大偏差
2012-05-10 20:54
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你对题目中的数学公式理解错了,那里等号左右的n不是同一个,你这样算当然差了6。多项式的项数不够,取6~10项才差不多,而且你还没有利用精度22来核算。

e^3=20.0855
取前4项(n从0循环到3)正好是13,与正确值差7,你说差6。

[ 本帖最后由 TonyDeng 于 2012-5-10 21:51 编辑 ]

授人以渔,不授人以鱼。
2012-05-10 21:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你算阶乘n!的那个怎么会是这样的?f3()中循环到i=22,就是22!,没必要这样算的呀。你仔细检查一下整个算法。

授人以渔,不授人以鱼。
2012-05-10 21:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
再看你的数据类型,算到3^22和22!,用unsigned int或int能容纳得下吗?

授人以渔,不授人以鱼。
2012-05-10 21:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你的程序,用了x=22来作为项数,而不是用作精度控制。而在计算多项式的过程中,到某个时候就溢出了(x=12时没有溢出),最终影响到计算结果,你可以检查一下,这个级数不是逐项收敛的。

不妨这样检验程序:每增加一项,就把结果输出一下,观察数据的变化规律。

[ 本帖最后由 TonyDeng 于 2012-5-10 22:00 编辑 ]

授人以渔,不授人以鱼。
2012-05-10 21:58
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
快速回复:一道计算e^n的函数题,我不知道哪里错了!!!求赐教
数据加载中...
 
   



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

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