如何实现CCL :: DOUBLE-FLOAT-FROM-BITS功能

时间:2013-09-04 05:38:05

标签: common-lisp

我想使用cl-olefs软件包。但是我发现它依赖于一个与植体形式相关的函数double-float-from-bits。

所以我想编写函数double-float-from-bits可以独立地在任何工厂形式上运行。 但我不知道如何实施它。

还是有一些独立的函数,比如double-float-from-bits,可以替换为
cl-olefs包。

1 个答案:

答案 0 :(得分:4)

这些方面的东西。这不是非常有效,但应该非常便携。

(defun double-float-from-bits (high low)
  (let* ((negative (not (zerop (logand high #x80000000))))
         (mant (+ low (* #x100000000 (logand high #xfffff))))
         (exbits (logand (ash high -20) #x7ff))
         (ex (coerce (expt 2 (- exbits 1075)) 'double-float))
         (base (coerce (+ #x10000000000000 mant) 'double-float)))
    (cond ((and (zerop exbits)
                (zerop mant))
           (if negative -0.0 0.0))
          ((zerop exbits)
           'subnormal)
          ((and (= #x7ff exbits)
                (zerop mant))
           (if negative 'negative-infinity 'positive-infinity))
          ((= #x7ff exbits)
           'not-a-number)
          (negative
           (- (* base ex)))
          (t
           (* base ex)))))

请注意,Common Lisp规范不要求内部浮点表示为IEEE 754;要求不那么严格。此外,没有办法可移植地表达无穷大或不是数字,我选择不支持次正规。

此外,根据您的实施情况,可能会出现小的舍入错误。