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

ええ、あなたはその問題を抱えていInteger.MIN_VALUE * -1 == Integer.MIN_VALUEます。特別な場合もあれば、別の方法で対処することもできます。確かに、考えられる解決策の1つexpは、正の場合はその逆ではなく、負にすることです。-expの代わりに使用しますexp

于 2012-12-10T22:25:45.203 に答える
0

私のシステムには

-2147483648
2147483647

Integer.MIN_VALUEInteger.MAX_VALUEそれぞれ。だからあなたは行に問題を見るはずです

exp *= -1;
于 2012-12-10T22:27:26.940 に答える