对 n 的幂执行会产生负指数的错误结果

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)

结果是正确的!

那么执行这些方法有什么区别呢?我原以为它们是等价的,但事实并非如此

har*_*old 5

Math.abs(n)仍然是 an int,并且只有在之后才将其分配给 a long,因此, 的绝对值再次-2147483648-2147483648(这在的文档Math.abs(int)中已注明)。对于负界,循环不执行迭代。

Math.abs((long)n)将解决这个问题。

  • @Spektre 所以结果为零,这是吉姆所期望的。这不是一个错误,而是结果类型的固有限制。 (2认同)