1

cl-olefs パッケージを使用したいのですが、plantform 依存関数 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 に答える