アカウント名:
パスワード:
数学的に、というならば NaN はそもそも「値」ではなく、大小や等しいという概念もない状態なので比較はできないでしょう。(*1)
計算機としては NaN == NaN の評価値は N/A としたいところですが、Java の比較演算子の評価は true/false の値しか持たず、これをそれぞれ true or not 的な扱いで適用しているので結果的に false となっているのだと思います。
Javascript のような処理系でも比較演算子が NaN のような第三値となることはないみたいですね。
SQL では null 比較を = ではなく is や is not で行うというところにも目を向けると面白いかもしれません。
*1)これに対して Infinity, -Infinity は(やはり値ではありませんが)比較可能な状態です。
本当はNaNは比較さえできないものなので、比較を含めてなんらかの処理を行った段階で例外を起こす(Signaling NaN)か、そうでなければ(QuietNaNであれば)仕方ないのでNaN!=NaNとなるのがIEEE754的な標準です。これは数学ではなく工学規格でありますが。
あと全然関係ないですが言語系やプロセッサとかエミュレータを書く人間にとってはNaNのビットパターンが複数取りうることが非常に面倒だったりします。C的に
union{int i;float f;} u1, u2; u1.i=0x7f800001; u2.i = 0x7f800002;
と宣言した後u1.i>u2.i, u1.f>u2.f, u1.fu2.f とかがどういう扱いになるかとか。無駄に奥が深い。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
物事のやり方は一つではない -- Perlな人
N/A (スコア:0)
数学的に、というならば NaN はそもそも「値」ではなく、大小や等しいという概念もない状態なので比較はできないでしょう。(*1)
計算機としては NaN == NaN の評価値は N/A としたいところですが、Java の比較演算子の評価は true/false の値しか持たず、これをそれぞれ true or not 的な扱いで適用しているので結果的に false となっているのだと思います。
Javascript のような処理系でも比較演算子が NaN のような第三値となることはないみたいですね。
SQL では null 比較を = ではなく is や is not で行うというところにも目を向けると面白いかもしれません。
*1)
これに対して Infinity, -Infinity は(やはり値ではありませんが)比較可能な状態です。
Re:N/A (スコア:2)
本当はNaNは比較さえできないものなので、比較を含めてなんらかの処理を行った段階で例外を起こす(Signaling NaN)か、そうでなければ(QuietNaNであれば)仕方ないのでNaN!=NaNとなるのがIEEE754的な標準です。これは数学ではなく工学規格でありますが。
あと全然関係ないですが言語系やプロセッサとかエミュレータを書く人間にとってはNaNのビットパターンが複数取りうることが非常に面倒だったりします。C的に
union{int i;float f;} u1, u2; u1.i=0x7f800001; u2.i = 0x7f800002;
と宣言した後u1.i>u2.i, u1.f>u2.f, u1.fu2.f とかがどういう扱いになるかとか。無駄に奥が深い。
-- Takehiro TOMINAGA // may the source be with you!