[movitz-cvs] CVS update: movitz/losp/muerte/integers.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Fri Jul 30 22:10:59 UTC 2004


Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv6080

Modified Files:
	integers.lisp 
Log Message:
Improved ratio support in +, -, truncate, and compare.

Date: Fri Jul 30 15:10:59 2004
Author: ffjeld

Index: movitz/losp/muerte/integers.lisp
diff -u movitz/losp/muerte/integers.lisp:1.88 movitz/losp/muerte/integers.lisp:1.89
--- movitz/losp/muerte/integers.lisp:1.88	Fri Jul 30 14:06:27 2004
+++ movitz/losp/muerte/integers.lisp	Fri Jul 30 15:10:59 2004
@@ -9,7 +9,7 @@
 ;;;; Created at:    Wed Nov  8 18:44:57 2000
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: integers.lisp,v 1.88 2004/07/30 21:06:27 ffjeld Exp $
+;;;; $Id: integers.lisp,v 1.89 2004/07/30 22:10:59 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -690,14 +690,10 @@
 		 (- x (- y)))
 		(((integer * -1) (integer * -1))
 		 (%negatef (+ (- x) (- y)) x y))
-		((ratio t)
-		 (make-rational (+ (* (ratio-numerator x) (denominator y))
-				   (* (numerator y) (ratio-denominator x)))
-				(* (ratio-denominator x) (denominator y))))
-		((integer ratio)
-		 (make-rational (+ (* x (denominator y))
-				   (* (ratio-numerator y) x))
-				(denominator y)))
+		((rational rational)
+		 (/ (+ (* (numerator x) (denominator y))
+		       (* (numerator y) (denominator x)))
+		    (* (denominator x) (denominator y))))
 		)))
 	(do-it)))
    (t (&rest terms)
@@ -728,7 +724,10 @@
 			(:testb 7 :cl)
 			(:jnz '(:sub-program (not-a-number)
 				(:compile-form (:result-mode :ignore)
-				 (error 'type-error :expected-type 'number :datum x))))
+				 (if (ratio-p x)
+				     (make-rational (- (ratio-numerator x))
+				      (ratio-denominator x))
+				   (error 'type-error :expected-type 'number :datum x)))))
 			(:movl (:eax ,movitz:+other-type-offset+) :ecx)
 			(:cmpb ,(movitz:tag :bignum) :cl)
 			(:jne 'not-a-number)
@@ -834,6 +833,10 @@
 		 (%negatef (+ (- minuend) subtrahend) minuend subtrahend))
 		(((integer * -1) (integer * -1))
 		 (+ minuend (- subtrahend)))
+		((rational rational)
+		 (/ (- (* (numerator minuend) (denominator subtrahend))
+		       (* (numerator subtrahend) (denominator minuend)))
+		    (* (denominator minuend) (denominator subtrahend))))
 		)))
 	(do-it)))
    (t (minuend &rest subtrahends)
@@ -1218,7 +1221,12 @@
    (t (number divisor)
       (number-double-dispatch (number divisor)
 	((t (eql 1))
-	 (values number 0))
+	 (if (not (ratio-p number))
+	     (values number 0)
+	   (multiple-value-bind (q r)
+	       (truncate (ratio-numerator number)
+			 (ratio-denominator number))
+	     (values q (make-rational r (ratio-denominator number))))))
 	((fixnum fixnum)
 	 (with-inline-assembly (:returns :multiple-values)
 	   (:compile-form (:result-mode :eax) number)





More information about the Movitz-cvs mailing list