無限大 - lisp-cookbook-ja/common-lisp GitHub Wiki

数値

ANSI CLでは、無限大の表現について規定はされていませんが、処理系によってサポートしているものがあり、単/倍精度浮動小数点数の正負の無限大として用意されていることが多いようです。 FIXME

(defconstant ∞
  #+allegro   excl:*infinity-double*
  #+sbcl      sb-ext:double-float-positive-infinity
  #+(or lispworks clozure) +1D++0
  )

(defconstant -∞
  #+allegro   excl:*negative-infinity-double*
  #+sbcl      sb-ext:double-float-negative-infinity
  #+(or lispworks clozure) -1D++0
  )
(< -∞ ∞)
;=>  T

(max ∞ 1 2 3 4 5)
;allegro cl=>  #.EXCL:*INFINITY-DOUBLE*
;sbcl      =>  #.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY
;lispworks =>  +1D++0 #| +1D++0 is double-float plus-infinity |#
;clozure =>  1D++0
(exp (* 1 -∞))
;allegro cl>>> error:EXP operation on (#.*NEGATIVE-INFINITY-DOUBLE*) resulted in floating point underflow.
;lispworks =>  0.0D0
;sbcl      =>  0.0d0
;clozure   =>  0.0D0
(exp (* -1 -∞))
;lispworks  =>  +1D++0 #| +1D++0 is double-float plus-infinity |#
;allegro cl >>> error:EXP operation on (#.*INFINITY-DOUBLE*) resulted in floating point overflow.
;sbcl       =>  #.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY
;clozure =>  1D++0
(- ∞ ∞)
;allegro cl=>  #.*NAN-DOUBLE*
;sbcl      >>> error:arithmetic error FLOATING-POINT-INVALID-OPERATION signalled
;lispworks =>  1D+-0 #| 1D+-0 is double-float not-a-number |#
;clozure  >>> error: FLOATING-POINT-INVALID-OPERATION detected performing - on (1D++0 1D++0)

注記

LispWorksや、Clozure CLでは、1E++0、-1L++0等の表記もサポートされています。