Java如何计算正弦和余弦函数?

Java如何计算正弦和余弦函数?,java,c,algorithm,Java,C,Algorithm,Java如何找到正弦和余弦?我正在努力制作一个简单的平台游戏,比如超级马里奥或者卡斯特莱瓦尼亚。我尝试了一种方法,可以为我旋转一个图像,然后调整JLabel的大小以适合该图像。我发现了一个有效的算法,并且能够实现我的目标。然而,我所做的只是复制并通过任何人都能做到的算法,我想理解它背后的数学。到目前为止,除了一个部分,我已经把一切都弄清楚了。数学课上的方法是sin和cos。它们可以工作,我可以使用它们,但我不知道Java是如何获得数字的 解决这个问题的方法似乎不止一种。现在,我对Java是如何做

Java如何找到正弦和余弦?我正在努力制作一个简单的平台游戏,比如超级马里奥或者卡斯特莱瓦尼亚。我尝试了一种方法,可以为我旋转一个图像,然后调整JLabel的大小以适合该图像。我发现了一个有效的算法,并且能够实现我的目标。然而,我所做的只是复制并通过任何人都能做到的算法,我想理解它背后的数学。到目前为止,除了一个部分,我已经把一切都弄清楚了。数学课上的方法是sin和cos。它们可以工作,我可以使用它们,但我不知道Java是如何获得数字的

解决这个问题的方法似乎不止一种。现在,我对Java是如何做到这一点感兴趣的。我研究了泰勒级数,但我不确定java就是这样做的。但是如果Java确实使用泰勒级数,我想知道该算法如何始终正确(我知道这是一个近似值)。我也听说过CORDIC算法,但我对它了解不多,因为我已经将泰勒级数编程到Java中,尽管我不懂它。如果CORDIC是如何实现的,我想知道该算法如何始终正确。Java方法也可能依赖于系统,这意味着所使用的算法或代码可能因系统而异。如果这些方法依赖于系统,那么我想知道Windows是如何得到正弦和余弦的。然而,如果是CPU本身得到了答案,我想知道它使用的是什么算法(我运行的是AMD Turion II双核移动设备M520 2.29GHz)

我看过数学课的分数代码,它指向数学课。但是StrictMath类只有一条注释,没有代码。不过我注意到该方法确实使用了关键字native。快速的Google搜索表明,该关键字使java能够与支持方法依赖于系统的思想的其他语言和系统一起工作。我已经看过StrictMath类()的JavaAPI,它提到了一个叫做fdlimb的东西。链接已断开,但我可以用谷歌搜索它()

它似乎是某种用C编写的软件包。虽然我懂Java,但我从未学过C,所以我一直很难破译它。我开始查找一些关于C语言的信息,希望弄清这一点,但这是一个缓慢的过程。即使我知道C,我仍然不知道Java使用的是什么C文件。对于不同的系统,似乎有不同版本的c方法,我不知道使用哪一种。API建议它是“IEEE 754核心函数”版本(位于名称以字母e开头的文件中)。但是我在e文件中没有看到sin方法。我发现一个以k开头,我认为是内核排序,另一个以s开头,我认为是标准排序。我发现唯一与sin相似的e文件是e_sinh.c和e_asin.c,我认为它们是不同的数学函数。这就是我探索正弦和余弦的Java算法的故事


在这条线路的某个地方,一个算法被调用来获取这些数字,我想知道它是什么以及它为什么工作(java不可能凭空获取这些数字)。

JDK没有义务自己计算正弦和余弦,仅通过
Math
为您提供一些实现的接口。所以你的问题的简单答案是:它没有;它要求其他的东西来完成它,并且其他的东西依赖于平台/JDK/JVM

我所知道的所有JDK都将负担转嫁到一些本机代码上。在您的例子中,您遇到了一个对的引用,如果您想看到那里的实际实现,您只需吸收它并学习阅读该代码

一些JVM可以对此进行优化。我相信HotSpot能够识别
Math.cos()
等调用,并在可用的系统上插入硬件指令,但请不要引用我的话

从以下文件中:

默认情况下,许多数学方法只是调用StrictMath中的等效方法来实现它们。鼓励代码生成器使用特定于平台的本机库或微处理器指令(如果可用),以提供更高性能的数学方法实现。这种更高性能的实现仍然必须符合数学规范

的文档实际上提到了
fdlibm
(它限制了
StrictMath
,即所有函数必须产生与
fdlibm
产生的结果相同的结果):

为了帮助确保Java程序的可移植性,此包中某些数值函数的定义要求它们产生与某些已发布算法相同的结果。这些算法可从著名的网络库netlib获得,即“自由分发数学库”fdlibm包。这些算法是用C编程语言编写的,可以理解为所有浮点运算都是按照Java浮点运算规则执行的

但是,请注意,
Math
不需要遵从
StrictMath
。如果要保证所有平台的结果一致,请在代码中明确使用
stricmath
。还请注意,这意味着代码生成器(例如HotSpot)无权优化对硬件调用的
StrictMath
调用,除非硬件将产生与
fdlibm
完全相同的结果

在任何情况下,Java都不必自己实现这些功能(通常不会),这个问题也没有明确的答案。它取决于平台、JDK,在某些情况下还取决于JVM

至于一般的计算技术,有