开发者

BigInteger.pow() with a BigInteger

开发者 https://www.devze.com 2023-01-08 23:05 出处:网络
I am tying to throw an exception when a BigInteger is greater than Integer.MAX_VALUE. It will not allow me to throw that exception for the exponent case.I am not sure how to get it to throw an excepti

I am tying to throw an exception when a BigInteger is greater than Integer.MAX_VALUE. It will not allow me to throw that exception for the exponent case. I am not sure how to get it to throw an exception when the biginteger value is too large to pass into the BigInteger.pow() method.

Thanks in advance.

here is the toPostfix method:

public BigInteger evalPostfix(String postfix){
    BigInteger a, b;
    Stack stack = new Stack();

        for(int i=0; i<postfix.length(); 开发者_高级运维i++){
            if(this.isOp(postfix.charAt(0)))
                throw new ArithmeticException("Malformed Postfix Expression");
            switch(postfix.charAt(i)){
                case '+':
                    a = (BigInteger)stack.pop();
                    b = (BigInteger)stack.pop();
                    stack.push(b.add(a));
                    break;
                case '-':
                    a = (BigInteger)stack.pop();
                    b = (BigInteger)stack.pop();
                    stack.push(b.subtract(a));
                    break;
                case '*':
                    a = (BigInteger)stack.pop();
                    b = (BigInteger)stack.pop();
                    stack.push(b.multiply(a));
                    break;
                case '/':
                    a = (BigInteger)stack.pop();
                    b = (BigInteger)stack.pop();
                    if(a == BigInteger.valueOf(0)){
                        throw new ArithmeticException("Cannot divide by 0");
                    }else{
                        stack.push(b.divide(a));
                    }
                    break;
                case '%':
                    a = (BigInteger)stack.pop();
                    b = (BigInteger)stack.pop();
                    stack.push(b.mod(a));
                    break;
                case '^':
                    a = (BigInteger)stack.pop();
                    b = (BigInteger)stack.pop();
                    if(b.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) > 0)
                        throw new ArithmeticException("BigInteger value is too large");
                    stack.push(a.pow(b.intValue()));
                    break;
                default:
                    if(this.numbers.get(postfix.substring(i, i+1)) == null)
                        throw new NullPointerException(postfix.substring(i, i+1) + " is not mapped to any value");
                    stack.push(this.numbers.get(postfix.substring(i,i+1)));
            }
        }

    return (BigInteger)stack.pop();
}


The way it is written, it should throw ArithmeticException("Negative Exponent Error") if the exponent is greater than Integer.MAX_VALUE. What happens when you try it?


You're popping the stack in the wrong order. The exponent will be on top of the stack, not under the mantissa. You have the same problem in subtraction, division, and modulus, and it wouldn't hurt to do it the same way for addition and multiplication either. In every case it should be b = stack.pop(); then a = stack.pop(). And if you declare the stack as Stack stack = new Stack() you won' t need all those typecasts.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号