Java中如何实现正弦函数?

3

关于Java中的正弦函数,我有一个快速问题。有人知道该值是如何计算的吗? 我找到了这个关于Java中sin函数的问题, 但那是在问为什么sin函数没有被包装在本地代码中。我问的完全不同。我想知道该函数是如何实现的。(由于它被包装在本地代码中,我无法看到它。)

他们是否只是从泰勒级数展开式中实现它:

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

我无法查看Math.sine()函数的代码,因为它被包装在本地代码中。


Math.PI是一个常量。 - Elliott Frisch
1
尝试在Google上搜索“fdlibm源代码”。StrictMath中的sin(x)定义应该使用与该库相同的算法。对于非严格数学,sin可能会使用计算机浮点处理器上的某些内容(取决于硬件),因此您需要查找硬件信息以找出确切的算法。 - ajb
1
在此处搜索 sin here - Sergey Kalinichenko
@Sal 请查看此链接:https://dev59.com/Q2Qm5IYBdhLWcg3wswtv - Alboz
另外,我认为数学家们长期以来一直在计算出类似于多项式的近似系数来处理这种事情。Babbage的差分引擎将使用此方法生成对数和三角函数表。如果你曾经到过加利福尼亚州北部,请去山景城的计算机历史博物馆参观——他们实际上已经建造了一台工作中的差分引擎并提供演示。 - ajb
显示剩余3条评论
1个回答

9
实现可以在这里(*)找到。
sin函数是用一个13次多项式逼近的。也就是说,在区间[0,π/4]上的形状为:
c12x12 + c11x11 + ... + c1x1 + c0x0 该算法的描述如下:
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


2
我认为sin是一种内在的方法,因此如果可用,它可能直接调用sin CPU指令,并且该代码不太可能被运行。 - assylias
+1. 如果不是的话,我会感到惊讶的 :-) - aioobe
实际上,除非您的JVM有一个选项来放宽Java规范的合规性,否则它可能无法使用内置函数--Java规范要求以这种精确度和方式实现sin。如果您的硬件具有更准确的内置快速sin指令,则无法在不违反严格合规性的情况下使用它。 - Chris Dodd
@ChrisDodd 这取决于您是使用 StrictMath.sin 还是 Math.sin。前者要求以精确的方式实现;后者则没有这个要求。 - ajb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接