包RCL和Inf

时间:2010-07-21 15:21:09

标签: common-lisp

这将是一个难以回答的问题,我联系了作者,但仍然没有回复我会在这里试一试: 在包RCL(http://common-lisp.net/project/rcl/)示例中:

(in-package :rcl)
(r-init)

(r "/" 1 5)
RCL> 0.2d0

(r "print" (r% "/" 1 5))
RCL> ;R# [1] 0.2
0.2d0

以上是可以的,但是

(r "/" 1 0)
RCL>> #<a FLOATING-POINT-OVERFLOW> 

(r "print" (r% "/" 1 0))
RCL>> ;R# [1] Inf
#<a FLOATING-POINT-OVERFLOW> 

(r "log" 0)

如何解决这个问题,以便当R达到inf值时,我的Lisp不会中断,只是给出一个消息,即计算inf值;以上是一个简单的例子,但有时我们在统计过程中除以零,但不会使结果无效,R返回最终值(如优化期间),但不幸的是,这会在使用RCL时崩溃。

1 个答案:

答案 0 :(得分:3)

好的我得到了我在这里发布的作者的答案: 对IEEE浮点无穷大的支持取决于平台。以下Lisps工作,至少在这个系统上(MacOSX):

<强> SBCL

R> (r "/" 1 0)
.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY
R> (r "log" 0)
.SB-EXT:DOUBLE-FLOAT-NEGATIVE-INFINITY

Allegro CL

R> (r "/" 1 0)
.EXCL:*INFINITY-DOUBLE*
R> (r "log" 0)
.EXCL:*NEGATIVE-INFINITY-DOUBLE*

<强> LispWorks

R> (r "/" 1 0)
+1D++0 #| +1D++0 is double-float plus-infinity
R> (r "log" 0)
-1D++0 #| -1D++0 is double-float minus-infinity

CMUCL 没有(X86:SIGFPE-HANDLER,没有启用异常),但我认为这可以修复(http://common-lisp.net/project/cmucl/doc/cmu-user/extensions.html#float-traps)。

ECL 是我尝试的最后一个,它显然是你使用的那个(我得到了相同的FLOATING-POINT-OVERFLOW例外)。它似乎也允许使用SI:TRAP-FPE禁用溢出检查,这可能是您所需要的(以下示例来自http://www.lispforum.com/viewtopic.php?f=2&t=386):

(let* ((bits (si::trap-fpe 'last nil)))
   (prog1 (/ 1.0 0.0)
     (si::trap-fpe bits t)))
.SI:SINGLE-FLOAT-POSITIVE-INFINITY

这也适用于

(handler-case (r "/" 2 0)
  (floating-point-overflow () nil))