diff options
-rwxr-xr-x[-rw-r--r--] | src/com/android/calculator2/CalculatorExpr.java | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/com/android/calculator2/CalculatorExpr.java b/src/com/android/calculator2/CalculatorExpr.java index 14d9236..40da4a1 100644..100755 --- a/src/com/android/calculator2/CalculatorExpr.java +++ b/src/com/android/calculator2/CalculatorExpr.java @@ -873,19 +873,25 @@ class CalculatorExpr { * Unlike the "general" case using logarithms, this handles a negative base. */ private static CR pow(CR base, BigInteger exp) { - if (exp.compareTo(BigInteger.ZERO) < 0) { - return pow(base, exp.negate()).inverse(); + BigInteger bigInteger = new BigInteger(exp.toString()); + + if (bigInteger.compareTo(BigInteger.ZERO) < 0) { + return pow(base, bigInteger.negate()).inverse(); } - if (exp.equals(BigInteger.ONE)) { + + if (bigInteger.equals(BigInteger.ONE)) { return base; } - if (exp.and(BigInteger.ONE).intValue() == 1) { - return pow(base, exp.subtract(BigInteger.ONE)).multiply(base); + + if (bigInteger.and(BigInteger.ONE).intValue() == 1) { + return pow(base, bigInteger.subtract(BigInteger.ONE)).multiply(base); } - if (exp.equals(BigInteger.ZERO)) { + + if (bigInteger.equals(BigInteger.ZERO)) { return CR.valueOf(1); } - CR tmp = pow(base, exp.shiftRight(1)); + + CR tmp = pow(base, bigInteger.shiftRight(1)); return tmp.multiply(tmp); } @@ -961,7 +967,8 @@ class CalculatorExpr { // values. That wouldn't work reliably with floating point either. BigInteger int_exp = BoundedRational.asBigInteger(exp.ratVal); if (int_exp != null) { - crVal = pow(crVal, int_exp); + BigInteger bigInteger = new BigInteger(int_exp.toString()); + crVal = pow(crVal, bigInteger); } else { crVal = crVal.ln().multiply(exp.val).exp(); } |