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

时间:2018-10-27 12:48:40

标签: c++ scientific-computing

我正在尝试不使用预定义函数来计算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次迭代。

这是示例输出。

enter image description here

请帮助!! ,我很好奇知道出了什么问题。

1 个答案:

答案 0 :(得分:0)

对于 x 的适度值,当sin( x )的泰勒级数收敛时(因为最终分母中的阶乘的增长大于分子中的指数)。 ,所涉及的值在商变得很小之前就变得非常大。在每个浮点乘法,除法,加法和减法中,都有舍入误差。舍入误差与所涉及的值大致成比例。 (在float中通常使用的格式中,它们的平均值大于结果大小的2 −24 。)

对于1000个词,循环中的x至少增长到5.726•10 9 ,因此该词的错误可能约为5.726•10 9 •2 −24 ≈341。因此最终结果278.2并非意外。

如果更改为double,则错误会较小(大约2 −53 而不是2 −24 ),并且您会得到更好的结果输入值大约为25。但是,输入值较大时,误差将再次增加。