0.8.3.12:
[sbcl.git] / tests / arith.pure.lisp
index bef097c..c2f0ac0 100644 (file)
 ;;; ANSI says MIN and MAX should signal TYPE-ERROR if any argument
 ;;; isn't REAL. SBCL 0.7.7 didn't in the 1-arg case. (reported as a
 ;;; bug in CMU CL on #lisp IRC by lrasinen 2002-09-01)
-#||
-
-FIXME: These tests would be good to have. But although, in
-sbcl-0.7.7.2x, (NULL (IGNORE-ERRORS (MIN 1 #(1 2 3)))) returns T, the
-ASSERTion fails, probably in something related to bug #194.
-
 (assert (null (ignore-errors (min '(1 2 3)))))
 (assert (= (min -1) -1))
 (assert (null (ignore-errors (min 1 #(1 2 3)))))
@@ -72,4 +66,20 @@ ASSERTion fails, probably in something related to bug #194.
 (assert (= (max -1 10.0) 10.0))
 (assert (null (ignore-errors (max 3 #'max))))
 (assert (= (max -3 0) 0))
-||#
+
+;;; (CEILING x 2^k) was optimized incorrectly
+(loop for divisor in '(-4 4)
+   for ceiler = (compile nil `(lambda (x)
+                                (declare (fixnum x))
+                                (declare (optimize (speed 3)))
+                                (ceiling x ,divisor)))
+   do (loop for i from -5 to 5
+         for exact-q = (/ i divisor)
+         do (multiple-value-bind (q r)
+                (funcall ceiler i)
+              (assert (= (+ (* q divisor) r) i))
+              (assert (<= exact-q q))
+              (assert (< q (1+ exact-q))))))
+
+;; CEILING had a corner case, spotted by Paul Dietz
+(assert (= (ceiling most-negative-fixnum (1+ most-positive-fixnum)) -1))