私は IEEE-754 委員会のメンバーでした。少し説明を手伝おうと思います。
まず、浮動小数点数は実数ではなく、浮動小数点演算は実数演算の公理を満たしていません。三分法は、浮動小数点数に適用されない実数演算の唯一の特性ではなく、最も重要な特性ですらありません。例えば:
- 加算は結合的ではありません。
- 分配法則は成立しません。
- 逆数のない浮動小数点数があります。
私は続けることができました。私たちが知っていて愛する実数演算のすべての特性を満たす固定サイズの算術型を指定することはできません。754委員会は、それらのいくつかを曲げたり壊したりすることを決定しなければなりません. これは、いくつかの非常に単純な原則によって導かれます。
- 可能な場合は、実際の算術演算の動作に一致させます。
- それができない場合は、違反をできるだけ予測可能にし、診断しやすくするように努めます。
「それは正解が間違っているという意味ではありません」というあなたのコメントに関して、これは間違っています。述語は、が より小さい(y < x)
かどうかを尋ねます。が NaN の場合、任意の浮動小数点値より小さくないため、答えは必ず偽になります。y
x
y
x
三分法は浮動小数点値には当てはまらないと述べました。ただし、保持される同様のプロパティがあります。754-2008 規格の第 5.11 項、パラグラフ 2:
4 つの相互に排他的な関係が可能です: より小さい、等しい、より大きい、順序付けされていない。最後のケースは、少なくとも 1 つのオペランドが NaN の場合に発生します。すべての NaN は、それ自体を含むすべてのものと順不同で比較します。
NaN を処理するための追加コードを作成する限り、NaN が適切に通過するようにコードを構成することは通常 (常に簡単ではありませんが) 可能ですが、常にそうであるとは限りません。そうでない場合は、追加のコードが必要になる場合がありますが、代数的閉包が浮動小数点演算にもたらした利便性を考えると、それはわずかな代償です。
補遺: 多くのコメンテーターは、NaN != NaN を採用してもおなじみの公理が維持されないように見えるという理由で、平等と三分法の再帰性を維持する方がより有用であると主張しています。私はこの観点に共感を持っていることを告白するので、この回答を再検討して、もう少し背景を説明したいと思いました.
NaN != NaN は、次の 2 つの実用的な考慮事項から生じたものであるということを、Kahan との会話から理解しました。
これx == y
は、可能な限り同等である必要がありますx - y == 0
(実際の算術の定理であるだけでなく、これにより、比較のハードウェア実装がよりスペース効率が良くなります。これは、標準が開発された時点で最も重要でした — ただし、x についてはこれに違反していることに注意してください)。 = y = 無限大であるため、それ自体では大きな理由にはなりません(x - y == 0) or (x and y are both NaN)
。
さらに重要なことにisnan( )
、NaN が 8087 算術で形式化された時点では述語がありませんでした。isnan( )
NaN 値を検出するための便利で効率的な手段をプログラマーに提供する必要がありました。これは、プログラミング言語が何年もかかるようなものを提供することに依存していませんでした。この件に関するカハン自身の文章を引用します。
NaN を取り除く方法がなければ、CRAY の不定値と同じくらい役に立たないでしょう。遭遇したらすぐに、無期限の結論に至るまで無期限に続行するよりも、計算を停止するのが最善です。そのため、NaN に対する一部の操作は、NaN 以外の結果を提供する必要があります。どの操作?… 例外は、C の述語「 x == x 」と「 x != x 」です。これらは、無限または有限の数 x ごとにそれぞれ 1 と 0 になりますが、x が非数 ( NaN ) の場合は逆になります。これらは、NaN を表す単語と述語 IsNaN(x) を欠く言語において、NaN と数値との間の単純で例外的でない唯一の区別を提供します。
これは、「Not-A-Boolean」のようなものを返すことを除外するロジックでもあることに注意してください。おそらく、このプラグマティズムは見当違いであり、標準は を要求するべきでしisnan( )
たが、世界がプログラミング言語の採用を待っている数年間、NaN を効率的かつ便利に使用することはほぼ不可能でした。それが合理的なトレードオフだったとは思えません。
率直に言うと、 NaN == NaN の結果は今は変わりません。インターネットで不平を言うよりも、それと一緒に暮らすことを学ぶ方が良い. コンテナーに適した順序関係もtotalOrder
存在する必要があると主張したい場合は、IEEE-754 (2008) で標準化された述語をお気に入りのプログラミング言語で実装することをお勧めします。それがまだないという事実は、現在の状況を動かしたカハンの懸念の正当性を物語っています.