在Common Lisp中是否存在表示无穷大或无数字(NAN)的实现独立方式?它需要是双浮点数,并且具有正值和负值。在SBCL中,结果
(apropos "INFINITY")
包括
SB-EXT:DOUBLE-FLOAT-NEGATIVE-INFINITY (bound)
SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY (bound)
但我需要它在所有实现中都可用。我有一个编写包的附录,可以在所有平台上运行,它需要表示无限和NAN。即使是其他图书馆的功能也足够了。
我已加载iee-floats
,现在它已成为我图书馆的一部分。我有一个功能,可以检测数字是否为NaN,以及检测数字是否为无穷大的函数;我没有测试NaN,但是我的无限函数需要数字为双浮点数。 SBCL的SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY
有效,但我需要它独立于实现。
答案 0 :(得分:13)
Rosetta Code在Common Lisp section on Infinity上的条目说:
Common Lisp未指定无穷大值。一些实现 但是,可能会支持IEEE无限。例如,CMUCL 支持IEEE Special Values。 Common Lisp确实指明了这一点 实现定义constants最多(和最少)正(和 负值)。这些可能因实现而异。
Cliki列出了一个可能有帮助的ieee-floats包(但请注意它对:infinity
的说法):
IEEE-Floats提供了一种转换float和float类型的方法 双浮动到其定义的二进制格式表示 通过IEEE 754(处理器和网络常用) 协议)。
该库定义了编码和解码功能 常见的32位和64位格式,以及用于定义类似的宏 其他格式的功能。默认功能不检测 NaN或无穷大的特殊情况,但可以生成函数 在哪种情况下关键字:not-a-number, :正无穷大,和:负无穷大用于表示它们。
听起来你最好的可能是在你想要支持的实现中找到一些IEEE值,并编写一个跨平台的兼容层[当然,你应该发布并与其他人共享:) ]
答案 1 :(得分:2)
如果你加载GSLL(在quicklisp中),你有
gsl:+positive-infinity+
,gsl:+negative-infinity+
,甚至是gsl:+nan+
。这些应该可以安装GSLL的任何地方。
答案 2 :(得分:0)
以下要求禁用浮点陷阱,但是......因为您正在处理这些值,所以无论如何都需要禁用陷阱。即从标准中考虑这个gem:"它是依赖于实现的,是否发生浮点陷阱,以及是否或如何启用或禁用它们。因此,符合规范的代码可以为这种情况建立处理程序,但不能依赖于它的信号。"
(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))