diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java index 39962dbbe3..545bb727bb 100644 --- a/src/jvm/clojure/lang/Numbers.java +++ b/src/jvm/clojure/lang/Numbers.java @@ -167,7 +167,9 @@ static public Number minus(Object x, Object y){ static public Number minusP(Object x, Object y){ Ops yops = ops(y); - return ops(x).combine(yops).addP((Number)x, yops.negateP((Number)y)); + Number negativeY = yops.negateP((Number) y); + Ops negativeYOps = ops(negativeY); + return ops(x).combine(negativeYOps).addP((Number)x, negativeY); } static public Number multiply(Object x, Object y){ diff --git a/test/clojure/test_clojure/numbers.clj b/test/clojure/test_clojure/numbers.clj index ced4dbde93..301f6e4a26 100644 --- a/test/clojure/test_clojure/numbers.clj +++ b/test/clojure/test_clojure/numbers.clj @@ -481,3 +481,9 @@ Math/pow overflows to Infinity." (is (= (bigint (/ 100000000000000000000 3)) 33333333333333333333)) (is (= (long 10000000000000000000/3) 3333333333333333333))) +(deftest test-arbitrary-precision-subtract + (are [x y] (= x y) + 9223372036854775808N (-' 0 -9223372036854775808) + clojure.lang.BigInt (class (-' 0 -9223372036854775808)) + java.lang.Long (class (-' 0 -9223372036854775807)))) +