在用麦克劳林展开求cosx的近似值时,当展开式最后一位小于0.001的精度时,出现错误结果
#include <stdio.h>
#include <math.h>
double funcos( double e, double x );
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
return 0;
}
double funcos( double e, double x ){
double rlt; //输出结果
double k=1; //计算出的每一项数
long t=1; //计算每一项的分母阶乘
rlt = 0;
for(int i=0;k>e;i=i+2){
if(i!=0){
t = t*(i-1);
t = t*i;
}
k = (pow(x,i)/t);
if(i%4==0){
rlt = rlt + k;
}else{
rlt = rlt - k;
}
//printf("%f %d %f\n",k,t,rlt); 测试代码
}
return rlt;
}
当输入:
0.001 -3.14
时,出现下列结果
cos(-3.14) = 0.017627
显然不正确,但是当输入:
0.01 -3.14
时,能出现正确答案
我认为可能是double类型太小了,于是换成double double,阶乘的变量类型也换成了long,可是仍然没有解决问题
知道上述代码错误原因,并获得解决方法