java - 正弦在Java中是如何实现的?

标签 java math trigonometry

<分区>

关于 Java 中的正弦函数的快速问题。有谁知道这个值是如何计算的? I found this question about sin in Java ,但这是在问为什么 sin 函数没有包含在 native 代码中。我问的是完全不同的东西。我想知道该功能是如何实现的。 (因为它被包装在 native 代码中,所以我看不到它。)

他们是否简单地从泰勒级数展开中实现了它:

sin(x) = x - (x^3)/3! + (x^5)/5! - O(x^7)

我无法查看 Math.sine() 函数的代码,因为它包含在 native 代码中。

最佳答案

可以找到实现here (*).

sin 函数由 13 次多项式逼近。也就是形状上的一个函数

c12x12 + c11x11 + ... + c1 x1 + c0x0

在区间 [0,π/4] 上

算法描述如下:

33 * Algorithm
34 *      1. Since sin(-x) = -sin(x), we need only to consider positive x.
35 *      2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
36 *      3. sin(x) is approximated by a polynomial of degree 13 on
37 *         [0,pi/4]
38 *                               3            13
39 *              sin(x) ~ x + S1*x + ... + S6*x
40 *         where
41 *
42 *      |sin(x)         2     4     6     8     10     12  |     -58
43 *      |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x  +S6*x   )| <= 2
44 *      |  x                                               |
45 *
46 *      4. sin(x+y) = sin(x) + sin'(x')*y
47 *                  ~ sin(x) + (1-x*x/2)*y
48 *         For better accuracy, let
49 *                   3      2      2      2      2
50 *              r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
51 *         then                   3    2
52 *              sin(x) = x + (S1*x + (x *(r-y/2)+y))
53 */

(*) 免责声明:在这里谈论 OpenJDK

关于java - 正弦在Java中是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26146190/

相关文章:

python - 为 Python 安装 Bigfloat

c# - XNA动态音频的C#环绕弧度角

javascript - 用极坐标画正方形

c++ - 音频单位样本值范围

java - 日期对话框在涉及 12 月时强制关闭

java - 如何将无状态 EJB 方法公开为 MBean(在 Jboss 上)?

java - 对于序列中的每个成员,确定它是否是完全平方数

math - 代数表示代码

java - Uploadcare:获取文件组信息时出错

java - JGroups ipAddress 已在魔力 map 中;请确保所有 key 都是唯一的