java - 精确计算正弦和余弦函数

标签 java

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

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

最佳答案

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

另一件事要记住:你真的想从一个准确的方法开始,将参数 x 减少到 [0 pi/2] 范围内,注意符号使用简单逻辑的答案。当x变大时,麦克劳伦(泰勒)展开会震荡很长时间。

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

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

可以找到该算法的 Java 实现 in this earlier answer .看看它与泰勒展开式的比较会很有趣......

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

关于java - 精确计算正弦和余弦函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19797951/

相关文章:

java - 如何将 Eclipse 中每个打开的项目导出为自己的 JAR?

java - mac m1 无法写入核心转储。核心转储已被禁用。要启用核心转储,请在再次启动 Java 之前尝试 "ulimit -c unlimited"

java - 如何创建一个类的不同实例?

java - 无法访问的语句错误

java - 如何使用 boolean 搜索语法进行 Java 字符串匹配?

java - 将命令行参数从 Java 传递到 C++ 编码

java - 处理 "NoClassDefFoundError"吗?

java - 重构 if 语句,我必须初始化不同的对象

java - 如何将外部文件复制到当前运行的jar中?

java - 在 Swing 中画漂亮的泡泡