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.
This commit is contained in:
parent
1ad3b05213
commit
e368f9e22b
|
@ -1724,6 +1724,12 @@
|
||||||
(eqv? (/ 1 -2) -1/2)
|
(eqv? (/ 1 -2) -1/2)
|
||||||
(eqv? (/ 1/2 -2) -1/4)
|
(eqv? (/ 1/2 -2) -1/4)
|
||||||
(eqv? (/ 1 -1/2) -2)
|
(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.0 2) 0.5)
|
||||||
(fl~= (/ 1 2.0) 0.5)
|
(fl~= (/ 1 2.0) 0.5)
|
||||||
(eqv? (/ 0 2.0) 0)
|
(eqv? (/ 0 2.0) 0)
|
||||||
|
|
|
@ -86,7 +86,7 @@
|
||||||
(define schoolbook-intquotient (schemeop2 "(cs)ss_trunc"))
|
(define schoolbook-intquotient (schemeop2 "(cs)ss_trunc"))
|
||||||
(define schoolbook-intquotient-remainder (schemeop2 "(cs)ss_trunc_rem"))
|
(define schoolbook-intquotient-remainder (schemeop2 "(cs)ss_trunc_rem"))
|
||||||
(define schoolbook-intremainder (schemeop2 "(cs)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 exgcd (schemeop2 "(cs)gcd"))
|
||||||
|
|
||||||
(define $flsin (cflop1 "(cs)sin"))
|
(define $flsin (cflop1 "(cs)sin"))
|
||||||
|
@ -2562,7 +2562,15 @@
|
||||||
[(ratnum?)
|
[(ratnum?)
|
||||||
(type-case x
|
(type-case x
|
||||||
[(fixnum? bignum?)
|
[(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?)
|
[(ratnum?)
|
||||||
(integer/ (* ($ratio-numerator x) ($ratio-denominator y))
|
(integer/ (* ($ratio-numerator x) ($ratio-denominator y))
|
||||||
(* ($ratio-denominator x) ($ratio-numerator y)))]
|
(* ($ratio-denominator x) ($ratio-numerator y)))]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user