繁体   English   中英

为负指数产生错误结果的 power to n 实现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM