peck@SUN.COM (Jeff Peck) (08/03/89)
The value returned by floor has the wrong sign for calls of the form: (floor -q*d d), I.e.: (floor -10 5) gives [2 0] instead of [-2 0] Fix is in the last COND clause. (defun floor (number &optional divisor) "Divide DIVIDEND by DIVISOR, rounding toward minus infinity. DIVISOR defaults to 1. The remainder is produced as a second value." (cond ((and (null divisor) ; trivial case (numberp number)) (values number 0)) (t ; do the division (multiple-value-bind (q r s) (safe-idiv number divisor) (cond ((zerop s) (values 0 0)) ((plusp s) (values q r)) (t (if (zerop r) (values (- 0 q) 0) (let ((q (- 0 (+ q 1)))) (values q (- number (* q divisor)))) )))))))