关于使用泰勒级数计算 sin(x) 的问题

Issue regarding calculation of sin(x) using Taylor series

我试图在不使用预定义函数的情况下计算 sin(x) 的值。 相反,我正在尝试使用泰勒级数来计算它。

问题是程序会为较小的 x 值(准确地说小于 10)生成正确的值。

我已经包含了该系列的 1000 次迭代,但程序仍然为较大的 x 值生成错误答案。

float e,x,p=2;
int a;
float sum1;

cout<<"enter the value x for sinx"<<endl;
cin>>x;
e=x;
sum1=x;

for(a=1;a<1000;a++)
{   
    x=x*(e/p)*(e/(p+1))*(-1);   //MULTIPLYING PREVIOUS TERM to -1*e/p * e/p+1 to get the next term.
    sum1=sum1+x;
    p=p+2;
}
cout<<sum1<<endl;

return 0;

对于较大的 x 值(例如 x=100),我得到的是 NaN(不是数字错误),这对我来说很好。 但问题在于我得到的结果像 sin(25)=278.2 尽管我包含了 1000 次泰勒级数迭代。

这是示例输出。

请帮忙!! ,我很想知道出了什么问题。

虽然 sin(x) 的泰勒级数收敛(因为最终分母中的阶乘大于分子中的指数),对于 [=19 的适度值=]x,在商变得很小之前,所涉及的值变得非常大。在每个浮点乘法、除法、加法和减法中,都存在舍入误差。舍入误差大致与所涉及的值成正比。 (在 float 常用的格式中,它们的平均值超过结果大小的 2−24 倍。)

对于 1000 个项,循环中的 x 增长到至少 5.726•109,因此该项的误差可能约为 5.726•109•2−24 ≈ 341。所以最终结果278.2并不意外。

如果改成double,误差会小一些(大约2−53而不是2−24 ),当输入值在 25 左右时,你会得到更好的结果。但是,随着输入值的增加,错误会再次增加。