NaNの振る舞い

java.lang.Mathのソースを覗いてたら

if (a != a) return a;
が出てきて、なんだこれはと思ってしまった。
そうだったこの話前に一度出てきたことあったんだった。忘れてたのでメモ。

しくみは以下の通り

浮動小数型ののNaNに対して関係演算子・等価演算子を適用すると、結果は常にfalseになる。ただし、!=だけ例外でtrueになる(たぶん==と!=の結果が常に相補的になるように)。
なので、浮動小数型の変数がNaNかどうかを検査するためには、次のコードでは間違い。

float a = Float.NaN;
if (a == Float.NaN) {
System.out.println("NaNです");
} else {
System.out.println("NaNではありません");
}

→NaNではありません

正しくは、Float#isNaN()・Double#isNaN()を使う。
プログラミング言語Java 第4版」179ページあたりに記載あり。