Java 自定义数学函数与提供的数学函数?

Java 自定义数学函数与提供的数学函数?,java,math,calculator,trigonometry,exponent,Java,Math,Calculator,Trigonometry,Exponent,我基本上是在制作一个Java程序,它必须在每一帧中快速运行大量计算,目标是至少30 f/s。这些函数主要是三角函数和幂函数。 我要问的问题是: 哪个更快:使用Java数学函数已经提供的函数?或者编写自己的函数来运行?内置的数学函数将非常难以击败,因为它们中的大多数都有特殊的JVM魔力,使它们使用硬件内部函数。可以想象,通过大量的工作来牺牲准确性,您可以打败其中一些函数,但如果不是这样,您就不太可能打败数学实用程序。您将希望使用java.lang.Math函数,因为它们中的大多数函数都是在JVM中

我基本上是在制作一个Java程序,它必须在每一帧中快速运行大量计算,目标是至少30 f/s。这些函数主要是三角函数和幂函数。 我要问的问题是:
哪个更快:使用Java数学函数已经提供的函数?或者编写自己的函数来运行?

内置的数学函数将非常难以击败,因为它们中的大多数都有特殊的JVM魔力,使它们使用硬件内部函数。可以想象,通过大量的工作来牺牲准确性,您可以打败其中一些函数,但如果不是这样,您就不太可能打败数学实用程序。

您将希望使用java.lang.Math函数,因为它们中的大多数函数都是在JVM中本机运行的。您可以看到源代码。

许多非常聪明和有资格的人在多年来投入了大量精力,使数学函数尽可能快速准确地工作。因此,除非你比他们都聪明,并且有多年的空闲时间花在这上面,否则你不太可能做得更好

它们中的大多数也是本地的——实际上它们不是Java语言。因此,用Java编写更快的版本是完全不可能的。当你开始编写自己的程序时,最好是混合使用C语言和汇编语言;你需要知道你将要运行的任何硬件的所有怪癖

此外,目前的实现经过多年的测试,全世界数百万人都在以某种方式使用Java。您将无法访问相同的测试程序,因此您的函数将自动比标准函数更容易出错。这是不可避免的


那么您还在考虑编写自己的函数吗?

一个可能的选项是缓存值。如果您知道您只需要一组固定的值,或者如果您可以在没有完美准确性的情况下逃脱,那么这可以节省大量时间。假设你想画很多圆,预先计算每个度的sin和cos值。然后在绘制时使用这些值。大多数圆圈都足够小,以至于你看不到它们之间的区别,而那些非常大的小圆圈可以使用库来完成


一定要测试这是否值得。在我5岁的macbook上,我每秒可以对cos进行一百万次评估。

如果你能承受1e-15ish的相对误差,或者更像1e-13ish的Powdoull,double,你可以试试这个,如果你经常称它为:


正如一些人所说,如果你想保持类似的1-ulp-ish精度,通常很难在纯java中击败java.lang.Math,但双精度中的精度稍低一点通常是完全可以忍受的,而且仍然比使用浮点计算时的精度高很多,客观的答案是,这取决于你能做得多好,等等。作为一般经验法则,为一种语言提供的数学函数库总是比你提供的要快,因为他们可以选择以您无法使用的方式进行优化,除非您是在汇编程序中编写自己的。即使java.lang.Math没有您需要的函数,也可以肯定其他人已经解决了相同的问题并编写了一个。事实上,NIH综合症是软件开发中常见的反模式,与之密切相关。即使不是本机的方法也可能是固有的,即Java代码永远不会运行,在运行时被JVM替换为更高效的代码。虽然我同意一般评估,根据程序员的技能和对函数的限制,创建自定义函数实现可能不一定需要很多工作。较低的精度只是一种可能的权衡,其他人只支持有限的参数范围[在三角函数的情况下特别有用],而不必处理特殊情况[对pow非常有用,这会导致许多特殊情况]。