我想使用cl-olefs软件包。但是我发现它依赖于一个与植体形式相关的函数double-float-from-bits。
所以我想编写函数double-float-from-bits可以独立地在任何工厂形式上运行。 但我不知道如何实施它。
还是有一些独立的函数,比如double-float-from-bits,可以替换为
cl-olefs包。
答案 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;要求不那么严格。此外,没有办法可移植地表达无穷大或不是数字,我选择不支持次正规。
此外,根据您的实施情况,可能会出现小的舍入错误。