10

Common Lisp で無限大または非数 (NAN) を表す実装に依存しない方法はありますか? double float で、正と負の両方の値を持つ必要があります。SBCL では、

(apropos "INFINITY")

含む

SB-EXT:DOUBLE-FLOAT-NEGATIVE-INFINITY (bound)
SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY (bound)

しかし、すべての実装で利用できるようにする必要があります。私は、すべてのプラットフォームで実行され、無限と NAN の表現が必要な、作成するパッケージへの補遺があります。別のライブラリの関数でも十分です。

私はiee-floatsロードされ、それは今私のライブラリの一部です. 数値が NaN かどうかを検出する関数と、数値が無限大かどうかを検出する関数があります。私は NaN をテストしていませんが、私の無限関数は倍精度浮動小数点数である必要があります。SBCLSB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITYは機能しますが、実装に依存しないようにする必要があります。

4

3 に答える 3

13

Infinity の Common Lisp セクションに関するRosetta Code のエントリには、次のように書かれています。

Common Lisp は無限値を指定しません。ただし、一部の実装では、IEEE 無限をサポートしている場合があります。たとえば、CMUCL はIEEE Special Valuesをサポートしています。Common Lisp は、実装が正の (および負の) 値のほとんど (および最小) を持つ定数を定義することを指定しています。これらは実装によって異なる場合があります。

Cliki には、役立つ可能性のあるieee-floatsパッケージがリストされています (ただし、 についての内容に注意してください:infinity)。

IEEE-Floatsは、float 型と double-float 型の値を、IEEE 754 (プロセッサやネットワーク プロトコルで一般的に使用される) で定義されているバイナリ形式表現との間で変換する方法を提供します。

ライブラリは、一般的な 32 ビットおよび 64 ビット形式のエンコードおよびデコード関数と、他の形式の同様の関数を定義するためのマクロを定義します。デフォルトの関数は、NaN や無限大の特殊なケースを検出しませんが、検出する関数を生成できます。その場合、キーワード :not-a-number、:positive-infinity、および :negative-infinity を使用してそれらを表します。

サポートしたい実装でいくつかのIEEE値を見つけ、クロスプラットフォームの互換性レイヤーを作成するのが最善のように思えます[もちろん、公開して他のユーザーと共有する必要があります:)]。

于 2013-10-14T15:34:33.807 に答える
2

GSLLを (quicklisp で) ロードするとgsl:+positive-infinity+gsl:+negative-infinity+、 、さらには がありgsl:+nan+ます。これらは、GSLL がインストール可能な場所ならどこでも動作するはずです。

于 2013-10-18T16:26:04.883 に答える