@Blindy讨论了Java在实现时可以采取的可能方法。pow
首先,一般情况下不能重复乘法。它不适用于指数不是整数的一般情况。(的签名是 !pow
Math.pow(double, double)
在 OpenJDK 8 代码库中,的本机代码实现可以通过两种方式工作:pow
-
中的第一个实现使用幂级数。C 注释中对该方法的描述如下:e_pow.c
* Method: Let x = 2 * (1+f)
* 1. Compute and return log2(x) in two pieces:
* log2(x) = w1 + w2,
* where w1 has 53-24 = 29 bit trailing zeros.
* 2. Perform y*log2(x) = n+y' by simulating multi-precision
* arithmetic, where |y'|<=0.5.
* 3. Return x**y = 2**n*exp(y'*log2)
中的第二个实现是标准 C 库提供的函数的包装器。包装器处理边缘情况。w_pow.c
pow
现在,标准 C 库可能使用特定于 CPU 的数学指令。如果是这样,并且JDK构建(或运行时)选择了1作为第二个实现,那么Java也会使用这些指令。
但无论哪种方式,我都看不到任何使用重复乘法的特殊情况代码的痕迹。您可以放心地假设它是 .O(1)
1 - 我还没有深入研究如何进行选择。