我正在用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;
答案 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_VALUE
和Integer.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;
}