Common lisp 表示与实现无关的无穷大和NAN

Common lisp 表示与实现无关的无穷大和NAN,common-lisp,infinity,Common Lisp,Infinity,在公共Lisp中是否存在表示无穷大或不表示数字(NAN)的独立于实现的方法?它需要是一个双浮点数,同时具有正值和负值。在SBCL中 (apropos "INFINITY") 包括 SB-EXT:DOUBLE-FLOAT-NEGATIVE-INFINITY (bound) SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY (bound) 但我需要它在所有实现中都可用。我要编写一个在所有平台上运行的包的附录,它需要无穷大和NAN的表示。即使来自另一个库的函数也足够了 我

在公共Lisp中是否存在表示无穷大或不表示数字(NAN)的独立于实现的方法?它需要是一个双浮点数,同时具有正值和负值。在SBCL中

(apropos "INFINITY")
包括

SB-EXT:DOUBLE-FLOAT-NEGATIVE-INFINITY (bound)
SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY (bound)
但我需要它在所有实现中都可用。我要编写一个在所有平台上运行的包的附录,它需要无穷大和NAN的表示。即使来自另一个库的函数也足够了

我加载了
iee float
,它现在是我库的一部分。我有一个函数检测一个数是否为NaN,还有一个函数检测一个数是否为无穷大;我还没有测试NaN,但是我的无穷大函数需要数字是双浮点数。SBCL的
SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY
可以工作,但我需要它独立于实现。

Rosetta代码在

Common Lisp不指定无穷大值。一些实现 但是,可能支持IEEE infinity。例如,CMUCL 支持。CommonLisp确实指定了 实现定义为最大(和最小)正(和 负)值。这些可能因实现而异

Cliki列出了一个可能有帮助的包(但请注意它所说的
:infinity
):

提供一种转换类型为float和的值的方法 根据定义,在二进制格式表示之间进行双浮点运算 由IEEE 754(处理器和网络通常使用 协议)

该库定义了的编码和解码函数 常见的32位和64位格式,以及用于定义类似格式的宏 用于其他格式的函数。默认功能不检测故障 NaN或无穷大的特殊情况,但可以生成函数 在这种情况下,关键字:not-a-number, :正无穷大和:负无穷大用于表示它们

听起来最好的方法是在您想要支持的实现中找到一些IEEE值,并编写一个跨平台兼容层[当然,您应该发布并与其他人共享:)。

如果您加载(在quicklisp中),您已经
gsl:+正无穷大+
gsl:+负无穷大+
,甚至
gsl:+nan+
。这些应该可以在GSLL可安装的任何地方使用。

以下要求禁用浮点陷阱,但是……由于您正在处理这些值,您仍然需要禁用陷阱。即从标准中考虑这个GEM:“实现依赖于浮点陷阱是否发生,以及它们是否被启用或禁用。因此,一致代码可以为该条件建立处理程序,但不能依赖于其被信号化。”
@user2862490我标记了答案,因为我实际上只是在谷歌上快速搜索一些可能的解决方案,所以任何拥有至少100个声誉的人都可以编辑它)。希望我们能在这方面取得一些合作成果。谢谢。。。。。是否出于好奇,只是加载每个实现,然后找到双浮点无穷大表示,一个简单的if-acl-then-infinity=“something”if-sbcl-then-infinity=“something”类型thing@user2862490你是在问跨平台库会是什么样子吗?它的定义可能类似于
(defconstant common number:+positive infinity+#+sbcl SB-EXT:DOUBLE-FLOAT-positive-infinity+lispworks lispworks:pos infinity…
。(LispWorks的位只是一个例子;我不知道无限是否或如何在那里表示。)然后人们可以在他们的代码中使用
公共数字:+正无限+
,它将在所有受支持的实现中工作。从我的?。。。“我的无穷大函数需要数字是双浮点数……SBCL的SB-EXT:double-float-POSITIVE-infinity可以工作,但我需要它独立于实现“如果GSLL能够满足这个要求,我会很高兴。我一直在寻找一个借口来包含它……还有任何减少GSLL加载时间的方法我不会一直加载它,因为它太大了,但我希望一直加载它。我在ASDF中看到一个bug,它会重新编译我加载的所有内容。也许这就是导致加载时间过长的原因?在任何情况下,您都可以使用save lisp创建一个世界,并在其中使用GSLL死亡,然后您的加载时间不超过SBCL的加载时间。
(eval-when (:compile-toplevel :load-toplevel :execute)
  #+sbcl (sb-int:set-floating-point-modes :traps nil)
  #+cmucl (ext:set-floating-point-modes :traps nil)
  #+linux (cffi:foreign-funcall "fedisableexcept" :int -1))

(defconstant +double+inf+ (* 2 most-positive-double-float))
(defconstant +double-inf+ (* 2 most-negative-double-float))
(defconstant +double-nan+ (/ 0d0 0d0))