通常的求幂问题。有2个功能。你能告诉我为什么,对于值x = 0.00001 n = 2147483647,只有第一个有效(第二个没有及时通过)?这只是一个简单的乘法。
double myPow1(double x, int n) {
if(n==1)
return x;
if(n==0)
return 1;
if(n==-1)
return 1/x;
if(n==2)
return x*x;
return myPow(myPow(x, n/2), 2)* myPow(x, n%2);
}
double myPow2(double x, int n){
double result = 1;
if (n>=0){
while (n-->=1) {
result *= x;
}
}
else {
while (n++<0) {
result /= x;
}
}
return result;
}
第一个适用于 O(log2(n)),第二个适用于 O(n)。假设您需要 2 ^ 16。第一个将计算这个 (((2 ^ 2) ^ 2) ^ 2) ^ 2。总共 4 个动作。4 = log2(16)。事实上,还有几个,但对数依赖性仍然存在。对于 2147483647,大约需要 log2(2147483647) = 31 次操作。在第二种方法中,2147483647 次乘法将是诚实的。诚然,无论那里或那里,答案都会大错特错。它只是不适合双重。double 的最小正数为 ≈ 2.2*e-308。而 0.00001 ^ 2147483647 则要少得多。