c语言初学者,这道题目不会做,可以运行,但算的结果不对,题目如下,求大神帮我看看哪里错了,感激不尽

已知求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);
}

你的代码算法逻辑没有错误。但在x较大时,由于h不断增大,for(i=1;i<=2*h-1;i++) k*=i;的运行结果使k很快溢出,所以得不到最后的正确结果。if(fabs(j)<pow(10,-5)) break;与无法满足而进入while死循环。在x较小时应该是正确的。追问

不好意思,还是不太明白,k很快溢出是啥意思?我试过了sin(1.57)的值,明显不对啊,也只累加了一项,在x较小的时候貌似也不满足。你能运行一下试试看吗?我该怎么改?

追答

不知道你那里的sin(1.57)是多少,刚试了一下我这里是对的,而且其他3个x值也是对的。但x=2.2时就溢出了。看图片:

追问

嗯,我也试了一下,答案对了,但是x大于大概2π/3的时候就死循环了,应该就是你说的那个问题了。那就是题目设置问题不是我的代码问题了吧。

追答

只能说你的代码算法是正确的,但对算法的C实现问题很多,说真话的话代码写得很是奇葩!我种题,要避免直接求阶乘,因为阶乘增值太快,几个循环便超出了系统计数范围,后面就无法正确进行下去了。我给你写一个做参考:

#include <stdio.h>
#include "math.h"
int main(void){
    double x,t,s;
    int i,k;
    printf("Input x(R:)...\nx=");
    scanf("%lf",&x);
    x=fmod(x,6.28318530717958);//对x模2π,不要让它太大
    for(s=k=0,t=x,i=1;t>1.0E-5;i+=2,k++){
        t/=i;//以下本可以一次完成的分开写也是为了尽量避免大乘积
        s += (i+1)%4 ? t : -t;
        t*=x;
        t/=(i+1);
        t*=x;
    }
    printf("sin(%f)≈%g  %d times\n",x,s,k);
    return 0;
}

追问

谢谢!

温馨提示:答案为网友推荐,仅供参考
相似回答