Skip to content

Commit 61778b8

Browse files
committed
CLJ-2694 Fix ratio cases due to use of Long/MIN_VALUE to defer to bigint impl
1 parent 307eb04 commit 61778b8

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/jvm/clojure/lang/Numbers.java

+4
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,10 @@ static long gcd(long u, long v){
530530
public Number divide(Number x, Number y){
531531
long n = x.longValue();
532532
long val = y.longValue();
533+
534+
if(n == Long.MIN_VALUE || val == Long.MIN_VALUE)
535+
return BIGINT_OPS.divide(x, y);
536+
533537
long gcd = gcd(n, val);
534538
if(gcd == 0)
535539
return num(0);

test/clojure/test_clojure/numbers.clj

+11-1
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,17 @@ Math/pow overflows to Infinity."
598598
(is (== (denominator 1/2) 2))
599599
(is (== (numerator 1/2) 1))
600600
(is (= (bigint (/ 100000000000000000000 3)) 33333333333333333333))
601-
(is (= (long 10000000000000000000/3) 3333333333333333333)))
601+
(is (= (long 10000000000000000000/3) 3333333333333333333))
602+
603+
;; special cases around Long/MIN_VALUE
604+
(is (= (/ 1 Long/MIN_VALUE) -1/9223372036854775808))
605+
(is (true? (< (/ 1 Long/MIN_VALUE) 0)))
606+
(is (true? (< (* 1 (/ 1 Long/MIN_VALUE)) 0)))
607+
(is (= (abs (/ 1 Long/MIN_VALUE)) 1/9223372036854775808))
608+
(is (false? (< (abs (/ 1 Long/MIN_VALUE)) 0)))
609+
(is (false? (< (* 1 (abs (/ 1 Long/MIN_VALUE))) 0)))
610+
(is (= (/ Long/MIN_VALUE -3) 9223372036854775808/3))
611+
(is (false? (< (/ Long/MIN_VALUE -3) 0))))
602612

603613
(deftest test-arbitrary-precision-subtract
604614
(are [x y] (= x y)

0 commit comments

Comments
 (0)