summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jvm/clojure/lang/Numbers.java4
-rw-r--r--test/clojure/test_clojure/numbers.clj6
2 files changed, 9 insertions, 1 deletions
diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java
index 39962dbb..545bb727 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 ced4dbde..301f6e4a 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))))
+