Raymond Toy pushed to branch master at cmucl / cmucl
Commits:
-
3acdd1b7
by Raymond Toy at 2018-02-03T08:57:28-08:00
-
62c5f3e9
by Raymond Toy at 2018-02-03T09:03:04-08:00
-
2292400e
by Raymond Toy at 2018-02-04T08:16:35-08:00
-
4e58e53c
by Raymond Toy at 2018-02-04T08:19:13-08:00
-
7b336362
by Raymond Toy at 2018-02-04T08:19:37-08:00
-
90df7817
by Raymond Toy at 2018-02-04T18:46:50+00:00
3 changed files:
Changes:
... | ... | @@ -2028,31 +2028,36 @@ |
2028 | 2028 |
(defun decode-float-exp-derive-type-aux (arg)
|
2029 | 2029 |
;; Derive the exponent part of the float. It's always an integer
|
2030 | 2030 |
;; type.
|
2031 |
- (flet ((calc-exp (x)
|
|
2032 |
- (when x
|
|
2033 |
- (nth-value 1 (decode-float x))))
|
|
2034 |
- (min-exp ()
|
|
2035 |
- ;; Use decode-float on the least positive float of the
|
|
2036 |
- ;; appropriate type to find the min exponent. If we don't
|
|
2037 |
- ;; know the actual number format, use double, which has the
|
|
2038 |
- ;; widest range (including double-double-float).
|
|
2039 |
- (nth-value 1 (decode-float (if (eq 'single-float (numeric-type-format arg))
|
|
2040 |
- least-positive-single-float
|
|
2041 |
- least-positive-double-float))))
|
|
2042 |
- (max-exp ()
|
|
2043 |
- ;; Use decode-float on the most postive number of the
|
|
2044 |
- ;; appropriate type to find the max exponent. If we don't
|
|
2045 |
- ;; know the actual number format, use double, which has the
|
|
2046 |
- ;; widest range (including double-double-float).
|
|
2047 |
- (if (eq (numeric-type-format arg) 'single-float)
|
|
2048 |
- (nth-value 1 (decode-float most-positive-single-float))
|
|
2049 |
- (nth-value 1 (decode-float most-positive-double-float)))))
|
|
2050 |
- (let* ((lo (or (bound-func #'calc-exp
|
|
2051 |
- (numeric-type-low arg))
|
|
2052 |
- (min-exp)))
|
|
2053 |
- (hi (or (bound-func #'calc-exp
|
|
2054 |
- (numeric-type-high arg))
|
|
2055 |
- (max-exp))))
|
|
2031 |
+ (labels
|
|
2032 |
+ ((calc-exp (x)
|
|
2033 |
+ (when x
|
|
2034 |
+ (bound-func #'(lambda (arg)
|
|
2035 |
+ (nth-value 1 (decode-float arg)))
|
|
2036 |
+ x)))
|
|
2037 |
+ (min-exp (interval)
|
|
2038 |
+ ;; (decode-float 0d0) returns an exponent of -1022. But
|
|
2039 |
+ ;; (decode-float least-positive-double-float returns -1073.
|
|
2040 |
+ ;; Hence, if the low value is less than this, we need to
|
|
2041 |
+ ;; return the exponent of the least positive number.
|
|
2042 |
+ (let ((least (if (eq 'single-float (numeric-type-format arg))
|
|
2043 |
+ least-positive-single-float
|
|
2044 |
+ least-positive-double-float)))
|
|
2045 |
+ (if (or (interval-contains-p 0 interval)
|
|
2046 |
+ (interval-contains-p least interval))
|
|
2047 |
+ (calc-exp least)
|
|
2048 |
+ (calc-exp (bound-value (interval-low interval))))))
|
|
2049 |
+ (max-exp (interval)
|
|
2050 |
+ ;; Use decode-float on the most postive number of the
|
|
2051 |
+ ;; appropriate type to find the max exponent. If we don't
|
|
2052 |
+ ;; know the actual number format, use double, which has the
|
|
2053 |
+ ;; widest range (including double-double-float).
|
|
2054 |
+ (or (calc-exp (bound-value (interval-high interval)))
|
|
2055 |
+ (calc-exp (if (eq 'single-float (numeric-type-format arg))
|
|
2056 |
+ most-positive-single-float
|
|
2057 |
+ most-positive-double-float)))))
|
|
2058 |
+ (let* ((interval (interval-abs (numeric-type->interval arg)))
|
|
2059 |
+ (lo (min-exp interval))
|
|
2060 |
+ (hi (max-exp interval)))
|
|
2056 | 2061 |
(specifier-type `(integer ,(or lo '*) ,(or hi '*))))))
|
2057 | 2062 |
|
2058 | 2063 |
(defun decode-float-sign-derive-type-aux (arg)
|
... | ... | @@ -28,7 +28,7 @@ |
28 | 28 |
#+double-double
|
29 | 29 |
(assert-equalp (c::specifier-type '(integer -1073 1024))
|
30 | 30 |
(c::decode-float-exp-derive-type-aux
|
31 |
- (c::specifier-type 'double-double-float)))
|
|
31 |
+ (c::specifier-type 'kernel:double-double-float)))
|
|
32 | 32 |
(assert-equalp (c::specifier-type '(integer 2 8))
|
33 | 33 |
(c::decode-float-exp-derive-type-aux
|
34 | 34 |
(c::specifier-type '(double-float 2d0 128d0)))))
|
... | ... | @@ -443,3 +443,64 @@ |
443 | 443 |
(write (read-from-string "`(,@vars ,@vars)")
|
444 | 444 |
:pretty t
|
445 | 445 |
:stream s)))))
|
446 |
+ |
|
447 |
+(define-test issue.59
|
|
448 |
+ (:tag :issues)
|
|
449 |
+ (let ((f (compile nil #'(lambda (z)
|
|
450 |
+ (declare (type (double-float -2d0 0d0) z))
|
|
451 |
+ (nth-value 2 (decode-float z))))))
|
|
452 |
+ (assert-equal -1d0 (funcall f -1d0))))
|
|
453 |
+ |
|
454 |
+(define-test issue.59.1-double
|
|
455 |
+ (:tag :issues)
|
|
456 |
+ (dolist (entry '(((-2d0 2d0) (-1073 2))
|
|
457 |
+ ((-2d0 0d0) (-1073 2))
|
|
458 |
+ ((0d0 2d0) (-1073 2))
|
|
459 |
+ ((1d0 4d0) (1 3))
|
|
460 |
+ ((-4d0 -1d0) (1 3))
|
|
461 |
+ (((0d0) (10d0)) (-1073 4))
|
|
462 |
+ ((-2f0 2f0) (-148 2))
|
|
463 |
+ ((-2f0 0f0) (-148 2))
|
|
464 |
+ ((0f0 2f0) (-148 2))
|
|
465 |
+ ((1f0 4f0) (1 3))
|
|
466 |
+ ((-4f0 -1f0) (1 3))
|
|
467 |
+ ((0f0) (10f0)) (-148 4)))
|
|
468 |
+ (destructuring-bind ((arg-lo arg-hi) (result-lo result-hi))
|
|
469 |
+ entry
|
|
470 |
+ (assert-equalp (c::specifier-type `(integer ,result-lo ,result-hi))
|
|
471 |
+ (c::decode-float-exp-derive-type-aux
|
|
472 |
+ (c::specifier-type `(double-float ,arg-lo ,arg-hi)))))))
|
|
473 |
+ |
|
474 |
+(define-test issue.59.1-double
|
|
475 |
+ (:tag :issues)
|
|
476 |
+ (dolist (entry '(((-2d0 2d0) (-1073 2))
|
|
477 |
+ ((-2d0 0d0) (-1073 2))
|
|
478 |
+ ((0d0 2d0) (-1073 2))
|
|
479 |
+ ((1d0 4d0) (1 3))
|
|
480 |
+ ((-4d0 -1d0) (1 3))
|
|
481 |
+ (((0d0) (10d0)) (-1073 4))
|
|
482 |
+ (((0.5d0) (4d0)) (0 3))))
|
|
483 |
+ (destructuring-bind ((arg-lo arg-hi) (result-lo result-hi))
|
|
484 |
+ entry
|
|
485 |
+ (assert-equalp (c::specifier-type `(integer ,result-lo ,result-hi))
|
|
486 |
+ (c::decode-float-exp-derive-type-aux
|
|
487 |
+ (c::specifier-type `(double-float ,arg-lo ,arg-hi)))
|
|
488 |
+ arg-lo
|
|
489 |
+ arg-hi))))
|
|
490 |
+ |
|
491 |
+(define-test issue.59.1-float
|
|
492 |
+ (:tag :issues)
|
|
493 |
+ (dolist (entry '(((-2f0 2f0) (-148 2))
|
|
494 |
+ ((-2f0 0f0) (-148 2))
|
|
495 |
+ ((0f0 2f0) (-148 2))
|
|
496 |
+ ((1f0 4f0) (1 3))
|
|
497 |
+ ((-4f0 -1f0) (1 3))
|
|
498 |
+ (((0f0) (10f0)) (-148 4))
|
|
499 |
+ (((0.5f0) (4f0)) (0 3))))
|
|
500 |
+ (destructuring-bind ((arg-lo arg-hi) (result-lo result-hi))
|
|
501 |
+ entry
|
|
502 |
+ (assert-equalp (c::specifier-type `(integer ,result-lo ,result-hi))
|
|
503 |
+ (c::decode-float-exp-derive-type-aux
|
|
504 |
+ (c::specifier-type `(single-float ,arg-lo ,arg-hi)))
|
|
505 |
+ arg-lo
|
|
506 |
+ arg-hi))))
|
|
\ No newline at end of file |