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

C++ 关于用泰勒级数计算sin(x)的问题,c++,scientific-computing,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

我试图在不使用预定义函数的情况下计算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;
float e,x,p=2;
INTA;
浮子sum1;

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

对于1000个术语,循环中的
x
至少增长到5.726•109,因此该术语中的误差可能在5.726•109•2左右−24≈ 341因此,278.2的最终结果并不意外


如果更改为双精度
,则错误将更小(约为2−53而不是2−24),对于25左右的输入值,您将获得更好的结果。尽管如此,输入值越大,错误将再次增加。

请停止使用ALL-CAP,这被认为是大喊大叫和粗鲁的行为。您是否有兴趣查看单个项的值?这对于泰勒近似是正常的,参数越远离0,您就越需要获得足够精度的项。由于浮点表示的精度有限,它本身受到限制。如果你继续盲目地走下去。一个简单的解决方法是规范化参数,sin()在-pi/2和pi/2之间是周期性的,因此可以使用fmod()规范化较大的值。@HansPassant:From−当然,π/2到π/2只是正弦周期的一半。我想你真正的意思是,在某些情况下,罪(x)总是可以简化为罪(y)−π/2 ≤ Y≤ π/2. 但这需要的不仅仅是
fmod
;你也必须折叠。(和
fmod
仅适用于“中等”值。它是准确的,但仅适用于它给出的参数,而您不能给出π。)。非常感谢。这真的很有帮助。