... |
... |
@@ -1824,50 +1824,27 @@ the end of the stream." |
1824
|
1824
|
(t (error _"Internal error in floating point reader.")))))
|
1825
|
1825
|
|
1826
|
1826
|
(defun make-float-aux (number divisor float-format stream)
|
1827
|
|
- (let ((ratio (/ number divisor))
|
1828
|
|
- result)
|
1829
|
|
- (handler-case
|
1830
|
|
- (progn
|
1831
|
|
- (setf result (coerce ratio float-format))
|
1832
|
|
- #+nil
|
1833
|
|
- (when (and (zerop result) (not (zerop number)))
|
1834
|
|
- ;; The number we've read is so small that it gets
|
1835
|
|
- ;; converted to 0.0, but is not actually zero. In this
|
1836
|
|
- ;; case, we want to round such small numbers to
|
1837
|
|
- ;; least-positive-foo-float. If it's still too small, we
|
1838
|
|
- ;; want to signal an error saying that we can't really
|
1839
|
|
- ;; convert it because the exponent is too small.
|
1840
|
|
- ;; See CLHS 2.3.1.1.
|
1841
|
|
- (let ((float-limit (ecase float-format
|
1842
|
|
- ((short-float single-float)
|
1843
|
|
- least-positive-single-float)
|
1844
|
|
- (double-float
|
1845
|
|
- least-positive-double-float)
|
1846
|
|
- #+double-double
|
1847
|
|
- (double-double-float
|
1848
|
|
- ext:least-positive-double-double-float))))
|
1849
|
|
- (if (>= (* 2 ratio) float-limit)
|
1850
|
|
- (setf result float-limit)
|
1851
|
|
- (error _"Underflow"))))
|
1852
|
|
- result)
|
1853
|
|
- (floating-point-underflow (c)
|
1854
|
|
- (describe c)
|
1855
|
|
- ;; Got an underflow. Resignal it with the same
|
1856
|
|
- ;; operation/operands, but allowing a restart to set the value
|
1857
|
|
- ;; to 0.
|
1858
|
|
- (restart-case
|
1859
|
|
- (error 'floating-point-underflow
|
1860
|
|
- :operation (arithmetic-error-operation c)
|
1861
|
|
- :operands (arithmetic-error-operands c))
|
1862
|
|
- (return-zero ()
|
1863
|
|
- :report (lambda (stream)
|
1864
|
|
- (format stream _"Return ~A for ~A"
|
1865
|
|
- (coerce 0 float-format)
|
1866
|
|
- (read-buffer-to-string)))
|
1867
|
|
- (setf result (coerce 0 float-format)))))
|
1868
|
|
- (error ()
|
1869
|
|
- (%reader-error stream _"Number not representable as a ~S: ~S"
|
1870
|
|
- float-format (read-buffer-to-string))))))
|
|
1827
|
+ (handler-case
|
|
1828
|
+ (let ((ratio (/ number divisor)))
|
|
1829
|
+ (coerce ratio float-format))
|
|
1830
|
+ (floating-point-underflow (c)
|
|
1831
|
+ (describe c)
|
|
1832
|
+ ;; Got an underflow. Resignal it with the same
|
|
1833
|
+ ;; operation/operands, but allowing a restart to set the value
|
|
1834
|
+ ;; to 0.
|
|
1835
|
+ (restart-case
|
|
1836
|
+ (error 'floating-point-underflow
|
|
1837
|
+ :operation (arithmetic-error-operation c)
|
|
1838
|
+ :operands (arithmetic-error-operands c))
|
|
1839
|
+ (return-zero ()
|
|
1840
|
+ :report (lambda (stream)
|
|
1841
|
+ (format stream _"Return ~A for ~A"
|
|
1842
|
+ (coerce 0 float-format)
|
|
1843
|
+ (read-buffer-to-string)))
|
|
1844
|
+ (setf result (coerce 0 float-format)))))
|
|
1845
|
+ (error ()
|
|
1846
|
+ (%reader-error stream _"Number not representable as a ~S: ~S"
|
|
1847
|
+ float-format (read-buffer-to-string))))))
|
1871
|
1848
|
|
1872
|
1849
|
|
1873
|
1850
|
(defun make-ratio (stream)
|