C语言 计算e及e的次方的近似值

首先考虑计算e的近似值,使用公式:e=1+1/1!+1/2!+1/3!+……("/"表示除)。

代码如下:

/*计算e的近似值*/
#include<stdio.h>

main(){
   int i,j,a,b=1;
   float d=1;
   printf("请输入公式中的n值:");
   scanf("%d",&a);
   for(i=1;i<=a;i++){
    for(j=1;j<=i;j++){
       b*=j;
    }
    d+=1.00/b;
    b=1;
   }
   printf("e值为:%.2f\n",d);

   return 0;
}

再考虑计算e^m的近似值,使用公式:e^m=1+m/1!+m^2/2!+m^3/3!+…… 。

代码如下:

#include<math.h>

main(){
 int i,j,n,m,c=1;
 float d=1;
 /*n值即泰勒公式中的n值用于确定精确度*/
 printf("请输入n值:\n");
 scanf("%d",&n);
 /*m值即次方数*/
 printf("请输入m值:\n");
 scanf("%d",&m);
 for(i=1;i<=n;i++){
    for(j=1;j<=i;j++){
        c*=j;
    }
    d+=pow(m,i)/c;
    c=1;
 }
 printf("e^m的值为%.2f",d);
}

对于以上两个简单的程序,注意一下几点:

1、这里都是将数学中的展开式用于程序设计中,像求e的近似值,乍一看可能觉得无从下手,但用数学式子一展开,就很清晰明了;

2、这里两个程序中的整数阶乘值的计算正常应该封装在函数中,增强代码复用性;

3、两个代码中的n值对应两个展开式中的n值,可以调控近似值的精度,n值给的越大,显示近似值时要求的小数位越多,越精确;

4、这里还有一个c语言中的类型转换的问题,像第一个程序中,"d+=1.00/b”一句就很值得玩味。左侧的d肯定设置为float类型,而右侧的1.00若改为1,当然是不行的,两个整数相除将截去计算结果的小数部分,这样最终结果将一直是2.00;而当将1改为1.00后,右侧就变成了一个浮点数除以一个整数,而c编译器只知道怎样计算操作数数据类型相同的表达式,这样这个相除的过程就会存在一个类型提升,即拷贝b的值并将拷贝值提升为float类型后再进行相除,这样得到的结果是正确的浮点数。前述的类型提升也称为隐式转换,还有一种显式转换,像此处,使用"d+=(float) 1/b”结果也是完全正确的;

5、使用4中的理论,第二个代码中的"d+=pow(m,i)/c;"一句看似有点问题,它好像没有进行显式或隐式的类型转换,但结果却是正确的。事实上,pow()函数的返回值是double类型的,因此,这里也是进行了隐式的类型转换。

猜你喜欢

转载自blog.csdn.net/somanlee/article/details/65936649
今日推荐