#include
#include
// 这个函数需要返回 double 类型,不然结果很快就溢出了
double f(int n)
{
int i;
double m=1.0;
for(i=1;i<=n;i++)
m*=i;
return m;
}
double funcos(double e,double x)
{
int i=0,flag=1;
double cos=0,item=1.0;
while(fabs(item)>=e)
{
item=flag*pow(x,i)/f(i);
cos+=item;
flag=-flag;
//printf("%lf %lf %lf\n",pow(x,i),f(i),item);
i=i+2;
}
return cos;
}
int main()
{
double e,x;
printf("e: ");
scanf("%lf",&e);
printf("x: ");
scanf("%lf",&x);
printf("cos(x)=%.3lf,standard result=%.3lf\n",funcos(e,x),cos(x));
return 0;
}
楼主你好
改动比较多,修改后的代码如下:
#include
#include
double fun(double x,double e);//我把声明都放外面了
double fun2(double i); //多声明了一个fun2,用于计算阶乘
int main(void)
{
double x,e,cosx;
scanf("%lf %lf",&x,&e); //这里改成一个scanf函数输入两个,中间用空格或者回车隔开就可以
cosx=fun(x,e); //这里楼主原来的x和e的位置放反了
printf("%.3f",cosx);
return 0;
}
double fun(double x,double e)
{
double sum=1.0,item=0,a=0,temp=1,flag=-1,i; //sum初始值改成了1
for(i=2;i<=1000;i=i+2) //这里原来是i从0开始,i{
temp=fun2(i);//原式因为i从0开始,所以原式temp从相乘第一次后就一直为0了
item=pow(x,i)/temp;
sum=item*flag+sum;//由于第一个数是x^0/0!,就是1,所以初始化sum为1,直接从第二个开始
flag=-flag;
if(fabs(item)
}
return sum;
}
double fun2(double i) //用来计算阶乘的函数fun2
{
int j;
double sum=1;
for(j=1;j<=i;j++)
{
sum=sum*j;
}
return sum;
}
输入1和0.001,输出为0.540~
至于循环那里,我采用了for循环,其实可以用你原来的循环的,不过考虑到变量的范围问题,还是尽量计算小一点的数,毕竟如果角度是50 60之后,高次方多几次就不是小数字了~~所以适用范围还是小角度的好。如果不符合楼主你的意思,你可以在此基础上再改进~~
希望楼主能看明白~祝楼主学习进步~~
循环结构中item是个定值 没有重新赋值 所以一直满足循环条件 陷入死循环
建议里面给item重新赋值