百度知道 - 信息提示
。。输入精度e 和实数x,用下列公式求cos x 的近似值,精确到最后一项的绝对值小于e。
楼主你好
改动比较多,修改后的代码如下:
#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<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之后,高次方多几次就不是小数字了~~所以适用范围还是小角度的好。如果不符合楼主你的意思,你可以在此基础上再改进~~
希望楼主能看明白~祝楼主学习进步~~
C语言 输入精度e 和实数x,用下列公式求cos x 的近似值,精确到最后一项的绝对值小于e。
#include //头文件置顶
#include
double fact(int n)
{
double s = 1;
for(int i = 1; i <= n; i++)
{
s *= i;
}
return s;
}
double funcos(double e,int x)
{
//运算次序要理清
double cos = 0;
double item = 1;
int i = 0;
int flag = 1;
while(abs(item) >= e)
{
item = flag * pow(double (x), 2 * i) / fact(2 * i);
cos += item;
flag *= -1;
i++;
}
return cos;
}
int main()
{
int x = 0;
double e = 0;
printf("e: ");
scanf("%lf",&e);
printf("x: ");
scanf("%d",&x);
printf("cos(x) = %.3lf\n",funcos(e, x)); //唯一的缺陷就是3必须随e的变化手动改写
return 0;
}
运行结果: