精确计算正弦和余弦函数

lap*_*ots 1 java

如何在java中以一定的精度计算正弦和余弦函数?

因为标准sin而且cos不允许这样做.

Flo*_*ris 11

泰勒展开(或更恰当地说,Maclauren展开,即泰勒关于x = 0)不是进行此计算的好方法.大多数计算机使用CORDIC算法 - 它具有在有限数量的迭代中收敛到任意精度的优点,并且只需要非常简单的数学运算.

另外要记住的是:你真的想以一种准确的方式开始将参数减少x到[0 pi/2]的范围内,使用简单的逻辑来处理答案的符号.当x变大时,Maclauren(泰勒)扩展将振荡很长一段时间.

这意味着,除了其他方面之外,您需要知道pi至少所需答案的位数的值,再加上需要减少多少位数x(因为如果x = 1000000,则需要另外6位数的pi只是为了在缩小的域中获得足够准确的答案).

最终,您的结果精度数字将低于计算精度 - 根据上面的来源,64位双精度数字会增加48次迭代算法的精度(大约1 ^ 2 ^ 48精度).由于double的有效位数是53位,所以实际上并不太糟糕(在计算中使用的精度的5位内).

在此前面的答案中可以找到该算法的java实现.看看它与泰勒扩张的比较会很有趣......

编辑 本文比较了CORDIS与泰勒扩展的收敛性,并得出结论,当你在缩减域中工作时泰勒更快(所以在将x带入[0 pi/2]之后).它还有一个相当简洁的重新制定,可以解决许多舍入误差 - 使其比对条款的蛮力评估更准确.


ars*_*jii 9

你可以使用sincos泰勒级数展开来计算它们的任意精度:

在此输入图像描述

在此输入图像描述

  • 如果您决定使用此表达式,请执行以下两项操作:1)将参数"x"减少到域[0 pi/2]; 2)分别计算术语然后将它们组合起来(加上它们),从最小的数字开始.它会提高你的准确性. (3认同)
  • @Floris当然可以,但它使用不提供cos或sin的任意精度库将问题简化为基本操作,例如java.math.BigDecimal - http://docs.oracle.com/javase/6/文档/api/java/math/BigDecimal.html。 (2认同)
  • @ user1432980你可以积累这些值,即有一个变量用于"x"幂,另一个变量用于阶乘分母.在每次迭代中,您可以适当地相乘,而不是在每次迭代时重新找到`pow(x,n)`和`n!`. (2认同)