这将是一个难以回答的问题,我联系了作者,但仍然没有回复我会在这里试一试: 在包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时崩溃。
答案 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))