我的程序使用Math.pow()
计算一个相对较大的双数到2的幂。后来我需要找到一个非常大的双数的平方根。问题是,我必须做超过100,000次,这需要很长时间。有没有可以加速这个过程的替代方案?感谢
编辑:大数字我的意思是在1000到10000之间(所以在计算方面可能不是那么大)。就需要花费很长时间而言,执行500次功能需要大约30秒
答案 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)。
它还取决于所需的准确度,您可以将准确性与时间进行交易。
您还可以存储结果以避免对相同条目进行多次计算。