输入精度e 和实数x,用下列公式求cos x 的近似值,精确到最后一项的绝对值小于e。c语言编程,求解啊~

输入精度e和实数x,用下列公式求cosx的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数funcos(e,x)求余弦函数的近似值。【... 输入精度e 和实数x,用下列公式求cos x 的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数funcos(e,x)求余弦函数的近似值。

【输入形式】
输入两个浮点数:精度e和实数x
【输入输出样例1】(下划线部分表示输入)
e: 0.001
x: 1
cos(x)=0.540

我编写出来的程序,如果X大一点,比如说10,总是会死循环!求指点??到底哪里错了??
#include<stdio.h>
#include<math.h>
int f(int n)
{
int i,m=1;
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;
i=i+2;
}
return cos;
}

int main()
{
double e,x;
printf("e: ");
scanf("%lf",&e);
printf("x: ");
scanf("%lf",&x);
printf("cos(x)=%.3lf",funcos(e,x));
return 0;
}
展开
 我来答
百度网友b0e28cae4
推荐于2018-04-16 · TA获得超过4016个赞
知道大有可为答主
回答量:1276
采纳率:85%
帮助的人:600万
展开全部
#include<stdio.h>
#include<math.h>
// 这个函数需要返回 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;
}
我是比丘猴
2012-10-14 · TA获得超过671个赞
知道小有建树答主
回答量:113
采纳率:0%
帮助的人:188万
展开全部
楼主你好
改动比较多,修改后的代码如下:
#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之后,高次方多几次就不是小数字了~~所以适用范围还是小角度的好。如果不符合楼主你的意思,你可以在此基础上再改进~~
希望楼主能看明白~祝楼主学习进步~~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
瓜牌芝康诚卡堡2M
2012-05-02 · TA获得超过111个赞
知道小有建树答主
回答量:173
采纳率:0%
帮助的人:134万
展开全部
循环结构中item是个定值 没有重新赋值 所以一直满足循环条件 陷入死循环
建议里面给item重新赋值
追问
有重新赋值啊item=flag*pow(x,i)/f(i);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式