[英]Power to n implementation that produces wrong results for negative 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;
}
在这里我假设对于负指数的情况我简单地计算x^n
然后返回1/(x^n)
因为例如2^(-3) = 1/(2^3)
问题:
代码在以下情况下失败:
pow(2.00000, -2147483648)
output 是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;
}
结果是正确的!
那么这些方法之间有什么区别呢? 我期待他们是等价的,但他们不是
Math.abs(n)
仍然是一个int
,后来它被赋值给一个long
,因此, -2147483648
-2147483648
这在Math.abs(int)
的文档中有说明)。 对于负边界,循环不执行迭代。
Math.abs((long)n)
可以解决这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.