1

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

因为标准sin并且cos不允许这样做。

4

2 回答 2

13

泰勒展开式(或更准确地说,麦克劳伦展开式,即关于 x=0 的泰勒展开式)不是进行此计算的好方法。大多数计算机使用CORDIC 算法——它的优点是在有限次数的迭代中收敛到任意精度,并且只需要非常简单的数学运算。

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

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

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

该算法的 java 实现可以在这个较早的答案中找到。看看它如何与泰勒展开进行比较会很有趣......

编辑 本文比较了 CORDIS 和 Taylor 展开的收敛性,并得出结论,当您在缩减域中工作时,Taylor 更快(因此在将 x 带入 [0 pi/2] 之后)。它还有一个相当简洁的重新表述,可以解决很多舍入错误 - 使其比对术语的强力评估更准确。

于 2013-11-05T20:33:45.027 回答
9

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

在此处输入图像描述

在此处输入图像描述

于 2013-11-05T20:12:02.450 回答