首先考虑计算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类型的,因此,这里也是进行了隐式的类型转换。