gpt4 book ai didi

common-lisp - 封装 RCL 和 Inf

转载 作者:行者123 更新时间:2023-12-04 06:49:46 24 4
gpt4 key购买 nike

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

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

splinter 的

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

最佳答案

好的,我从我在这里发布的作者那里得到了答案:
对 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))

关于common-lisp - 封装 RCL 和 Inf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3300900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com