Jim*_*Jim 0 java algorithm math division exponent
在以下(简单的)pow(x, n)
方法实现中,完全忽略任何优化方法,我发现以下问题:
public double pow(double x, int n) {
boolean negative = n < 0;
long power = Math.abs(n);
double ans = 1.0;
for(long i = 0; i < power; i++) {
ans = ans * x;
}
return negative ? 1.0/ans: ans;
}
Run Code Online (Sandbox Code Playgroud)
在这里,我假设对于负指数的情况,我只需计算x^n
然后返回,1/(x^n)
因为例如2^(-3) = 1/(2^3)
问题:
代码在以下情况下失败:
pow(2.00000, -2147483648)
输出是1.00000
,而预期的正确结果是0.00000
如果我将代码更改如下:
public double pow(double x, int n) {
long power = n;
if(power < 0) {
x = 1 / x;
power = -power;
}
double ans = 1.0;
for(long i = 0; i < power; i++) {
ans = ans * x;
}
return ans;
}
Run Code Online (Sandbox Code Playgroud)
结果是正确的!
那么执行这些方法有什么区别呢?我原以为它们是等价的,但事实并非如此
Math.abs(n)
仍然是 an int
,并且只有在之后才将其分配给 a long
,因此, 的绝对值再次-2147483648
是-2147483648
(这在的文档Math.abs(int)
中已注明)。对于负界,循环不执行迭代。
Math.abs((long)n)
将解决这个问题。