C语言求sin(x)的近似值
sin(X)=x-(x^3/3!)+(x^5/5!)-(x^7/7!)+.....+(-1)^n[x^(2n+1)/(2n+1)!]求用C语言写代码,精度为10的-5次方...
sin(X)=x-(x^3/3!)+(x^5/5!)-(x^7/7!)+.....+(-1)^n[x^(2n+1)/(2n+1)!]求用C语言写代码,精度为10的-5次方。我写的代码如下:#include <stdio.h>#include <math.h>void main(){ int a,b,n,A,temp; float eps,c,d,sin; temp=-1; sin=0.0; c=1.0; n=0; eps=10e-6; scanf("%f",&d); do { n++; b=2*n-1; A=1; for(a=1;a<=b;a++) { A=A*a; } temp=-temp; c=pow(d,b); sin=sin+temp*c/A; }while( fabs(c/A)>=eps); printf("%f\n",sin); }用Debug检查发现在a=17之后就会出现数据溢出现象,也就是大概在|x|>3时结果就会出错,请问该如何改进算法?或者该怎样写代码?呵呵,命名上有些不足,读代码有些累,还望高手指点。
展开
展开全部
时间复杂度太大,可以讲sin(x)看做泰勒公式数列和的形式,运用后项除了前项的递推实现。参考代码如下 main()
{
int n=1;
float x;
double sum ,term;
printf("input x:");
scanf("%f",&x);
sum=x;
term=x;
do
{
term=-term*x*x/((n+1)*(n+2));
sum=sum+term;
n=n+2;
}
while (fabs(term)>=1e-5);
printf("sin(x)=%f\n",sum);
}
{
int n=1;
float x;
double sum ,term;
printf("input x:");
scanf("%f",&x);
sum=x;
term=x;
do
{
term=-term*x*x/((n+1)*(n+2));
sum=sum+term;
n=n+2;
}
while (fabs(term)>=1e-5);
printf("sin(x)=%f\n",sum);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询