如何在java中以一定的精度计算正弦和余弦函数?
因为标准sin
和cos
不允许这样做。
答案 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)