From e368f9e22b29cf3be52b543d39940a03092219cb Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 6 May 2021 08:08:38 -0600 Subject: [PATCH] Chez Scheme: special case for `/` on 1 or -1 and an exact rational Related to #3816, but Sam already has better changes on the way. --- racket/src/ChezScheme/mats/5_3.ms | 6 ++++++ racket/src/ChezScheme/s/5_3.ss | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/racket/src/ChezScheme/mats/5_3.ms b/racket/src/ChezScheme/mats/5_3.ms index bb77e06e3d..5017759400 100644 --- a/racket/src/ChezScheme/mats/5_3.ms +++ b/racket/src/ChezScheme/mats/5_3.ms @@ -1724,6 +1724,12 @@ (eqv? (/ 1 -2) -1/2) (eqv? (/ 1/2 -2) -1/4) (eqv? (/ 1 -1/2) -2) + (eqv? (/ 1 -1/2) -2) + (eqv? (/ -1 -1/2) 2) + (eqv? (/ 1 3/2) 2/3) + (eqv? (/ -1 3/2) -2/3) + (eqv? (/ 1 -3/2) -2/3) + (eqv? (/ -1 -3/2) 2/3) (fl~= (/ 1.0 2) 0.5) (fl~= (/ 1 2.0) 0.5) (eqv? (/ 0 2.0) 0) diff --git a/racket/src/ChezScheme/s/5_3.ss b/racket/src/ChezScheme/s/5_3.ss index 471585aee1..12a9ab66d8 100644 --- a/racket/src/ChezScheme/s/5_3.ss +++ b/racket/src/ChezScheme/s/5_3.ss @@ -86,7 +86,7 @@ (define schoolbook-intquotient (schemeop2 "(cs)ss_trunc")) (define schoolbook-intquotient-remainder (schemeop2 "(cs)ss_trunc_rem")) (define schoolbook-intremainder (schemeop2 "(cs)rem")) -(define make-ratnum (schemeop2 "(cs)s_rational")) +(define make-ratnum (schemeop2 "(cs)s_rational")) ; does not normalize, except detecting 1 as demoninator (define exgcd (schemeop2 "(cs)gcd")) (define $flsin (cflop1 "(cs)sin")) @@ -2562,7 +2562,15 @@ [(ratnum?) (type-case x [(fixnum? bignum?) - (integer/ (* x ($ratio-denominator y)) ($ratio-numerator y))] + (cond + [(eq? x 1) (if (negative? ($ratio-numerator y)) + (make-ratnum ($negate who ($ratio-denominator y)) ($negate who ($ratio-numerator y))) + (make-ratnum ($ratio-denominator y) ($ratio-numerator y)))] + [(eq? x -1) (if (negative? ($ratio-numerator y)) + (make-ratnum ($ratio-denominator y) ($negate who ($ratio-numerator y))) + (make-ratnum ($negate who ($ratio-denominator y)) ($ratio-numerator y)))] + [else + (integer/ (* x ($ratio-denominator y)) ($ratio-numerator y))])] [(ratnum?) (integer/ (* ($ratio-numerator x) ($ratio-denominator y)) (* ($ratio-denominator x) ($ratio-numerator y)))]