在我的Java程序中,我经常需要计算a^b,其中a ≥ 0且0 ≤ b < 1。我对Math.pow(a, b)
的速度不满意。是否有任何算法可能比Math.pow
更快(以某种精度代价)?
在我的Java程序中,我经常需要计算a^b,其中a ≥ 0且0 ≤ b < 1。我对Math.pow(a, b)
的速度不满意。是否有任何算法可能比Math.pow
更快(以某种精度代价)?
你需要精确的结果还是只需要一个近似值?
如果需要精确的结果:那很困难。
如果你只需要一个近似值:可以尝试使用N次根算法进行不动点迭代,在维基百科上有描述。
然后,你可以根据你的应用程序需要使用尽可能多的时钟周期来进行第N次根的近似值计算。但我猜想,Math.pow
已经为你实现了这些功能。如果你想要更快地运行它,你需要投入一些严肃的努力。即使在C语言中(我比Java更擅长),编写一个真正快速的版本也不是一件容易的事情(如果我一直在做n次根计算,并且它们是绝对的瓶颈,我会采用多线程和如果可能的话,使用SIMD/AVX指令进行大量的工作,甚至使用OpenCL/CUDA)。
exp(b*log(a))
或其基数2变体可能会得到更快的结果。这在某些情况下会产生明显的浮点错误,但避免了更专业版本的pow
包含的减少这些错误的开销。 - Lutz Lehmann