使用Integer.MIN_VALUE作为指数的Java pow实现

时间:2012-12-10 22:18:04

标签: java pow

我正在用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 个答案:

答案 0 :(得分:2)

基于这一行:

exp *= -1;
似乎它可能必须是一个特例。在没有这种特殊情况的情况下,肯定有一些方法可以实现这一点,但由于-1 * Integer.MIN_VALUE无法存储在int中,如果不单独处理它,就会出现错误。

答案 1 :(得分:0)

是的,你遇到的问题是Integer.MIN_VALUE * -1 == Integer.MIN_VALUE。你可以特殊情况,或者你可以用另一种方式处理它。实际上,一种可能的解决方案是在exp为正面时使其为负,而不是相反;您只需使用-exp代替exp

答案 2 :(得分:0)

在我的系统上我有

-2147483648
2147483647

分别为Integer.MIN_VALUEInteger.MAX_VALUE。所以你应该在行

中看到问题
exp *= -1;

答案 3 :(得分: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;
}