diff --git a/opt/bignum.c b/opt/bignum.c index 82c96bdc..e69d6582 100644 --- a/opt/bignum.c +++ b/opt/bignum.c @@ -1521,7 +1521,8 @@ sexp sexp_compare (sexp ctx, sexp a, sexp b) { break; #if SEXP_USE_RATIOS case SEXP_NUM_FLO_RAT: - r = sexp_make_fixnum((sexp_sint_t)(sexp_flonum_value(a) - sexp_ratio_to_double(b))); + f = sexp_flonum_value(a) - sexp_ratio_to_double(b); + r = sexp_make_fixnum(f > 0.0 ? 1 : f == 0.0 ? 0 : -1); break; case SEXP_NUM_FIX_RAT: case SEXP_NUM_BIG_RAT: diff --git a/tests/numeric-tests.scm b/tests/numeric-tests.scm index f221d64e..5f720e78 100644 --- a/tests/numeric-tests.scm +++ b/tests/numeric-tests.scm @@ -119,4 +119,14 @@ (-18446744078004518913 -18446744069414584321 79228162514264337597838917632 4294967296 -1)) (sign-combinations (+ 1 (expt 2 64)) (expt 2 32))) +(cond-expand + (ratios + (test #t (< 1/2 1.0)) + (test #t (< 1.0 3/2)) + (test #t (< 1/2 1.5)) + (test #t (< 1/2 2.0)) + (test 1.0 (max 1/2 1.0))) + (else + #f)) + (test-end)