我想使用 cl-olefs 包。但我发现它包含植物形态依赖函数 double-float-from-bits。
所以我想编写函数 double-float-from-bits 可以独立地在任何植物上运行。但我不知道如何实现它。
或者是否有一些独立的功能,例如可以替换为
cl-olefs 包的 double-float-from-bits 。
我想使用 cl-olefs 包。但我发现它包含植物形态依赖函数 double-float-from-bits。
所以我想编写函数 double-float-from-bits 可以独立地在任何植物上运行。但我不知道如何实现它。
或者是否有一些独立的功能,例如可以替换为
cl-olefs 包的 double-float-from-bits 。
沿着这些思路。这不是非常有效,但应该非常便携。
(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 的表示;要求不那么严格。此外,没有可移植表达无穷大或非数字的方法,我选择不支持次正规数。
此外,可能存在小的舍入误差,具体取决于您的实施。