* fixed bug: Tests for the (VECTOR T) type gave the wrong answer
when given a vector displaced to an adjustable array. (reported
by Utz-Uwe Haus)
+ * bug fix: derivation of float boundaries from numbers outside the
+ appropriate float range (reported by John Wiseman)
* improvements to DOCUMENTATION for TYPE and STRUCTURE doc-types:
allow condition class objects as arguments to DOCUMENTATION and
(SETF DOCUMENTATION); only find and set documentation for
;;; defined range. Quite useful if we want to convert some type of
;;; bounded integer into a float.
(macrolet
- ((frob (fun type)
+ ((frob (fun type most-negative most-positive)
(let ((aux-name (symbolicate fun "-DERIVE-TYPE-AUX")))
`(progn
- (defun ,aux-name (num)
- ;; When converting a number to a float, the limits are
- ;; the same.
- (let* ((lo (bound-func (lambda (x)
- (coerce x ',type))
- (numeric-type-low num)))
- (hi (bound-func (lambda (x)
- (coerce x ',type))
- (numeric-type-high num))))
- (specifier-type `(,',type ,(or lo '*) ,(or hi '*)))))
-
- (defoptimizer (,fun derive-type) ((num))
- (one-arg-derive-type num #',aux-name #',fun))))))
- (frob %single-float single-float)
- (frob %double-float double-float))
+ (defun ,aux-name (num)
+ ;; When converting a number to a float, the limits are
+ ;; the same.
+ (let* ((lo (bound-func (lambda (x)
+ (if (< x ,most-negative)
+ ,most-negative
+ (coerce x ',type)))
+ (numeric-type-low num)))
+ (hi (bound-func (lambda (x)
+ (if (< ,most-positive x )
+ ,most-positive
+ (coerce x ',type)))
+ (numeric-type-high num))))
+ (specifier-type `(,',type ,(or lo '*) ,(or hi '*)))))
+
+ (defoptimizer (,fun derive-type) ((num))
+ (one-arg-derive-type num #',aux-name #',fun))))))
+ (frob %single-float single-float
+ most-negative-single-float most-positive-single-float)
+ (frob %double-float double-float
+ most-negative-double-float most-positive-double-float))
) ; PROGN
\f
;;;; float contagion
;; Reported by John Wiseman, sbcl-devel
;; Subject: [Sbcl-devel] float type derivation bug?
;; Date: Tue, 4 Apr 2006 15:28:15 -0700
-(with-test (:name (:type-derivation :float-bounds)
- :fails-on :sbcl)
+(with-test (:name (:type-derivation :float-bounds))
(compile nil '(lambda (bits)
(let* ((s (if (= (ash bits -31) 0) 1 -1))
(e (logand (ash bits -23) #xff))