1

我想使用 cl-olefs 包。但我发现它包含植物形态依赖函数 double-float-from-bits。

所以我想编写函数 double-float-from-bits 可以独立地在任何植物上运行。但我不知道如何实现它。

或者是否有一些独立的功能,例如可以替换为
cl-olefs 包的 double-float-from-bits 。

4

1 回答 1

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 的表示;要求不那么严格。此外,没有可移植表达无穷大或非数字的方法,我选择不支持次正规数。

此外,可能存在小的舍入误差,具体取决于您的实施。

于 2013-09-04T06:26:21.970 回答