2

我正在用 Java 实现一个 pow 函数,我想知道我们如何处理 Integer.MIN_VALUE 作为指数?我们只是把它当作一个特例吗?

因为我试图将结果与标准 Java.lang.Math API 进行比较,我得到了几个不同的结果。以下是对比清单

//this will print "1.0 vs 0.0"
System.out.println(pow(2,Integer.MIN_VALUE) + " vs " + Math.pow(2,Integer.MIN_VALUE));

//this will print "1.0 vs 1.0"
System.out.println(pow(1,Integer.MIN_VALUE) + " vs " + Math.pow(1,Integer.MIN_VALUE));

public double pow(double base, int exp){
     double result = 1.0;
     boolean pos = false;

     if(exp == 0) return result;
     if(exp > 0){
         pos = true;
         exp *= -1;
     }

     while(exp > 0){
        if((exp & 1) == 1){
           result *= base;
        }
        base *= base;
        exp /= 2;
     }
     if(!pos){
        result = 1/result;
     }
     return result;
}

所以我想知道 Integer.MIN_VALUE 是否是一种特殊情况,我必须有一个 if 语句来检查它。

  if(exp == Integer.MIN_VALUE && base > 1) return 0.0;
4

4 回答 4

2

基于此行:

exp *= -1;

看来这可能是一个特例。没有这种特殊情况,当然有办法实现这一点,但由于-1 * Integer.MIN_VALUE不能存储在 int 中,如果不单独处理,就会出现错误。

于 2012-12-10T22:25:03.003 回答
0

在我的系统上,我有

-2147483648
2147483647

对于Integer.MIN_VALUEInteger.MAX_VALUE分别。所以你应该看到问题所在

exp *= -1;
于 2012-12-10T22:27:26.940 回答
0

是的,你遇到的问题是Integer.MIN_VALUE * -1 == Integer.MIN_VALUE。您可以对其进行特殊处理,也可以以另一种方式处理它。实际上,一种可能的解决方案是在积极的时候将其设为exp消极,而不是相反。你只需要使用-exp而不是exp.

于 2012-12-10T22:25:45.203 回答
0

好吧,真正的问题是,由于符号没有在 MIN_VALUE 上翻转,符号级联到 exp/2。并且适用“负功率”案例。如果我们拆分它,它会更容易:

    public double myPow(double x, int n) {
    double result = 1.00000;
    boolean negative = false;
    
    if(n <0) {
        negative = true;
        n= -n;
    }
    
    result=power(x,n);
    if(negative) {
        result = 1/result;
    }
    return result;
}

private double power(double a, int n) {
    if(n ==0 || a==1) return 1;// a^0 = 1, 1^n = 1
    double x=power(a,n/2);
    
    if(n%2 == 0) return x*x;
    else return a*x*x;
}
于 2020-07-16T16:07:40.833 回答