已知求sin(x)的近似值的多项式公式为:
sin(x)=x-x3/3!+x5/5!-x7/7!+………
编程并计算sin(x)的值,要求最后一项的绝对值小于10-5,并统计出此时累加了多少项。
#include<stdio.h>
#include<math.h>
void main()
{ double x,j,sum=0;//h是多项式第h项,i是for的循环次数,j是每一项的值,k是阶乘答案
int h=1,i,k;
printf("请输入x的值:");
scanf("%lf",&x);
while(1)
{ k=1;
for(i=1;i<=2*h-1;i++)
k*=i;
j=pow(-1,h+1)*pow(x,2*h-1)/k;
sum+=j;
if(fabs(j)<pow(10,-5)) break;
h++;
}
printf("sin(%lf)的近似值=%lf\n",x,sum);
printf("累加了%d项\n",h);
}
不好意思,还是不太明白,k很快溢出是啥意思?我试过了sin(1.57)的值,明显不对啊,也只累加了一项,在x较小的时候貌似也不满足。你能运行一下试试看吗?我该怎么改?
追答不知道你那里的sin(1.57)是多少,刚试了一下我这里是对的,而且其他3个x值也是对的。但x=2.2时就溢出了。看图片:
嗯,我也试了一下,答案对了,但是x大于大概2π/3的时候就死循环了,应该就是你说的那个问题了。那就是题目设置问题不是我的代码问题了吧。
追答只能说你的代码算法是正确的,但对算法的C实现问题很多,说真话的话代码写得很是奇葩!我种题,要避免直接求阶乘,因为阶乘增值太快,几个循环便超出了系统计数范围,后面就无法正确进行下去了。我给你写一个做参考:
#include <stdio.h>谢谢!