Java - Math.pow()和Math.sqrt()的更快替代品

时间:2013-02-27 00:15:46

标签: java function math floating-accuracy pow

我的程序使用Math.pow()计算一个相对较大的双数到2的幂。后来我需要找到一个非常大的双数的平方根。问题是,我必须做超过100,000次,这需要很长时间。有没有可以加速这个过程的替代方案?感谢

编辑:大数字我的意思是在1000到10000之间(所以在计算方面可能不是那么大)。就需要花费很长时间而言,执行500次功能需要大约30秒

5 个答案:

答案 0 :(得分:9)

“2的力量”正在变平。你可以通过将数字乘以它来做得更好。

sqrt的库版本可能比你在其他地方挖掘的任何东西都要快。如果您调用C例程,则只会增加跨语言调用的开销。但是你需要准确的平方根,还是表格查找近似值呢?值是否重复很多,即您是否经常需要计算相同数字的根?如果是这样,将平方根缓存在HashMap中可能比计算它们更快。

答案 1 :(得分:7)

您不太可能找到比Java Math更好(更快)的实现。您可能有更多的运气试图改变算法中的计算方式。例如,有什么方法可以避免找到一个庞大数字的平方根?

如果这不起作用,您可以尝试使用更适合快速数学计算的语言(如Matlab)来实现它。

否则,您可以尝试在其他方面进行优化。如果稍后有用,也许您可​​以尝试缓存过去的结果。

答案 2 :(得分:1)

你的2的力量问题可以简单地通过将数字乘以它来完成。 例如,假设变量a是要提高到2的数字。它与以下相同: int a=5; int b=a*a;

答案 3 :(得分:1)

我唯一能想到的是存储速度的结果,平方根不会改变,并且~9000存储的数字不是那么多。您可能会很好地构建数据框架,这样您就可以确保最佳地搜索适当的结果。

答案 4 :(得分:0)

您可以使用x * x代替pow(x,2)。

对于平方根,首先应该看一下sqrt实现(近似方法)。

也许你可以找到更好的一个,例如Newton's method(方程sqrt(N)-x = 0)。

它还取决于所需的准确度,您可以将准确性与时间进行交易。

您还可以存储结果以避免对相同条目进行多次计算。