* subtraction (-) now understands ratnums.

This commit is contained in:
Abdulaziz Ghuloum 2007-06-12 02:49:27 +03:00
parent ca257870ce
commit e1d0d4aca6
2 changed files with 20 additions and 0 deletions

Binary file not shown.

View File

@ -386,6 +386,9 @@
(foreign-call "ikrt_fxbnminus" x y)] (foreign-call "ikrt_fxbnminus" x y)]
[(flonum? y) [(flonum? y)
($fl- (fixnum->flonum x) y)] ($fl- (fixnum->flonum x) y)]
[(ratnum? y)
(let ([n ($ratnum-n y)] [d ($ratnum-d y)])
(binary/ (binary- (binary* d x) n) d))]
[else [else
(error '- "~s is not a number" y)])] (error '- "~s is not a number" y)])]
[(bignum? x) [(bignum? x)
@ -396,6 +399,9 @@
(foreign-call "ikrt_bnbnminus" x y)] (foreign-call "ikrt_bnbnminus" x y)]
[(flonum? y) [(flonum? y)
($fl- (bignum->flonum x) y)] ($fl- (bignum->flonum x) y)]
[(ratnum? y)
(let ([n ($ratnum-n y)] [d ($ratnum-d y)])
(binary/ (binary- (binary* d x) n) d))]
[else [else
(error '- "~s is not a number" y)])] (error '- "~s is not a number" y)])]
[(flonum? x) [(flonum? x)
@ -406,8 +412,22 @@
($fl- x (bignum->flonum y))] ($fl- x (bignum->flonum y))]
[(flonum? y) [(flonum? y)
($fl- x y)] ($fl- x y)]
[(ratnum? y)
(let ([n ($ratnum-n y)] [d ($ratnum-d y)])
(binary/ (binary- (binary* d x) n) d))]
[else [else
(error '- "~s is not a number" y)])] (error '- "~s is not a number" y)])]
[(ratnum? x)
(let ([nx ($ratnum-n x)] [dx ($ratnum-d x)])
(cond
[(or (fixnum? y) (bignum? y) (flonum? y))
(binary/ (binary- nx (binary* dx y)) dx)]
[(ratnum? y)
(let ([ny ($ratnum-n y)] [dy ($ratnum-d y)])
(binary/ (binary- (binary* nx dy) (binary* ny dx))
(binary* dx dy)))]
[else
(error '- "~s is not a number" y)]))]
[else (error '- "~s is not a number" x)]))) [else (error '- "~s is not a number" x)])))
(define binary* (define binary*