これらの線に沿った何か。これは非常に効率的ではありませんが、かなり移植性があるはずです。
(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 のものである必要はないことに注意してください。要件は少し厳しくありません。さらに、無限大または非数を移植可能に表現する手段がないため、サブノーマルをサポートしないことにしました。
また、実装によっては、小さな丸め誤差が生じる場合があります。