12
IEEE754 NaN値に対してfalseを返すすべての比較の根拠は何ですか?
NaN値の比較が他のすべての値と異なる動作をするのはなぜですか?つまり、演算子==、<=、> =、<、>のいずれかまたは両方の値がNaNであるすべての比較は、他のすべての値の動作とは逆に、falseを返します。 これにより数値計算がある程度簡略化されたと思いますが、他の設計上の決定について詳細に説明しているKahanによるIEEE 754のステータスに関する講義ノートでさえ、明確に述べられた理由を見つけることができませんでした。 この逸脱した動作は、単純なデータ処理を行うときに問題を引き起こしています。たとえば、Cプログラムでいくつかの実数値フィールドに対してレコードのリストを並べ替える場合、NaNを最大要素として処理する追加のコードを記述する必要があります。そうしないと、並べ替えアルゴリズムが混乱する可能性があります。 編集: これまでの答えはすべて、NaNを比較することは無意味であると主張しています。 私は同意しますが、これは正解が偽であることを意味するのではなく、幸いなことに存在しないブール値ではない(NaB)です。 したがって、比較に対してtrueまたはfalseを返すかどうかの選択は、私の見解では任意であり、一般的なデータ処理では、データ構造を考慮せずに、通常の法則(==の再帰性、<、==、>のトリコトミー)に従うと有利です。これらの法律に依存するものは混乱します。 だから私は、哲学的推論だけでなく、これらの法律を破ることのいくつかの具体的な利点を求めています。 編集2: NaNを最大にすることが悪い考えになる理由が今理解できたと思います、それは上限の計算を台無しにするでしょう。 NaN!= NaNは、次のようなループで収束を検出しないようにするために望ましい場合があります。 while (x != oldX) { oldX = x; x = better_approximation(x); } ただし、絶対的な違いを小さな制限と比較することで記述します。だから私見これはNaNで反射性を壊すための比較的弱い議論です。