
。。输入精度e 和实数x,用下列公式求cos x 的近似值,精确到最后一项的绝对值小于e。
输入精度e和实数x,用下列公式求cosx的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数funcos(e,x)求余弦函数的近似值。【...
输入精度e 和实数x,用下列公式求cos x 的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数funcos(e,x)求余弦函数的近似值。【输入形式】输入两个浮点数:精度e和实数x【输入输出样例1】(下划线部分表示输入)e: 0.001x: 1cos(x)=0.540
以下是我写的,编译是正确的,但调试结果是1.000
#include<stdio.h>#include<math.h>
int main(void)
{
double fun(double x,double e);
double x,e,cosx;
scanf("%lf",&x); scanf("%lf",&e);
cosx=fun(e,x); printf("%.3f",cosx);
return 0;
}
double fun(double x,double e)
{
double sum=0,item=0,a=0,temp=1,flag=1,i;
do{ for(i=0;i<a;i++)
temp=temp*i;
item=pow(x,a)/temp;
sum=item*flag+sum;
flag=-flag;
a=a+2;}
while(fabs(item)<e);
return sum;
}
和x和e输入没关系,我先输入X=1然后输入e=0.001,的 展开
以下是我写的,编译是正确的,但调试结果是1.000
#include<stdio.h>#include<math.h>
int main(void)
{
double fun(double x,double e);
double x,e,cosx;
scanf("%lf",&x); scanf("%lf",&e);
cosx=fun(e,x); printf("%.3f",cosx);
return 0;
}
double fun(double x,double e)
{
double sum=0,item=0,a=0,temp=1,flag=1,i;
do{ for(i=0;i<a;i++)
temp=temp*i;
item=pow(x,a)/temp;
sum=item*flag+sum;
flag=-flag;
a=a+2;}
while(fabs(item)<e);
return sum;
}
和x和e输入没关系,我先输入X=1然后输入e=0.001,的 展开
展开全部
楼主你好
改动比较多,修改后的代码如下:
#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之后,高次方多几次就不是小数字了~~所以适用范围还是小角度的好。如果不符合楼主你的意思,你可以在此基础上再改进~~
希望楼主能看明白~祝楼主学习进步~~
改动比较多,修改后的代码如下:
#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之后,高次方多几次就不是小数字了~~所以适用范围还是小角度的好。如果不符合楼主你的意思,你可以在此基础上再改进~~
希望楼主能看明白~祝楼主学习进步~~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询