以Integer.MIN_值为指数的Java pow实现

以Integer.MIN_值为指数的Java pow实现,java,pow,Java,Pow,我正在用Java实现一个pow函数,我想知道如何处理Integer.MIN_值作为指数?我们只是把它当作一个特例吗 因为我试着将结果与标准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

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

因为我试着将结果与标准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_值是否是一种特殊情况,在这种情况下,我必须使用if语句来检查它

  if(exp == Integer.MIN_VALUE && base > 1) return 0.0;
根据这条线:

exp *= -1;

看来这可能是个特例。当然,在没有这种特殊情况的情况下,有很多方法可以实现这一点,但是因为
-1*Integer.MIN\u VALUE
不能存储在int中,如果不单独处理它,您将得到一个bug。

是的,您遇到的问题是
Integer.MIN\u VALUE*-1==Integer.MIN\u VALUE
。你可以在特殊情况下处理它,也可以用另一种方式处理它。事实上,一种可能的解决方案是,当它为正时,使
exp
为负,而不是相反;您只需在我的系统上使用
-exp
而不是
exp

-2147483648
2147483647
分别用于
Integer.MIN_值
Integer.MAX_值
。因此,你应该看到问题所在

exp *= -1;

好吧,真正的问题是,因为符号不会在MIN_值上翻转,所以符号会级联到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;
}
公共双myPow(双x,整数n){
双结果=1.00000;
布尔负=假;

如果(n),它实际上取决于您注释掉的实现…
(-1)*Integer.MIN\u VALUE==Integer.MIN\u VALUE
。因此,在这种情况下,您的
while
循环不会运行。因此,在这种情况下,如果我将其赋值并强制转换为long,会有帮助吗?每个系统都会有这些值。它是独立于平台的。如果生成-exp,则无法正确使用位移位?因为ext>=1最终将以-1而不是0结束,所以我们将必须使用exp/=2。我认为使用无符号右移时,负exp将变成正exp,但它不起作用,因为我尝试了它。你可以让它起作用,只是需要一些思考。不过,我不认为我应该给你答案。是你做一个翻转exp=~exp+1,然后做一个无符号右移,然后再做一次翻转吗p=~exp+1?呃,这是一种可能性,当然。