表示无限和NAN独立于实现

时间:2013-10-14 15:15:57

标签: common-lisp infinity

在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有效,但我需要它独立于实现。

3 个答案:

答案 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))