精确计算正弦和余弦函数

时间:2013-11-05 20:09:09

标签: java

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

因为标准sincos不允许这样做。

2 个答案:

答案 0 :(得分:11)

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

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

这意味着,除其他外,您需要知道pi的值至少为您所需答案的位数,再加上需要多少位数才能减少x(因为如果x = 1000000,你需要另外6位pi才能在缩小域中得到足够精确的答案。)

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

可以找到算法的java实现in this earlier answer。看看它与泰勒扩张的比较会很有趣......

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

答案 1 :(得分:9)

您可以使用 sin cos Taylor series扩展来计算它们的任意精度:

enter image description here

enter image description here