我正在尝试不使用预定义函数来计算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次迭代。
这是示例输出。
请帮助!! ,我很好奇知道出了什么问题。
答案 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。但是,输入值较大时,误差将再次增加。