发布网友 发布时间:2024-10-24 13:49
共2个回答
热心网友 时间:2024-11-17 02:12
楼主你好
改动比较多,修改后的代码如下:
#include<stdio.h>
#include<math.h>
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<a=为条件,但a你初始化是0,只判断初始的a
{
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)<e) //那个do..while换成了for循环里的一个判断语句就可以了,不必双循环
break;
}
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之后,高次方多几次就不是小数字了~~所以适用范围还是小角度的好。如果不符合楼主你的意思,你可以在此基础上再改进~~
希望楼主能看明白~祝楼主学习进步~~
热心网友 时间:2024-11-17 02:11
temp=temp*i; temp 一直是0 没变