NaNの振る舞い
java.lang.Mathのソースを覗いてたら
if (a != a) return a;が出てきて、なんだこれはと思ってしまった。
そうだったこの話前に一度出てきたことあったんだった。忘れてたのでメモ。
しくみは以下の通り
浮動小数型ののNaNに対して関係演算子・等価演算子を適用すると、結果は常にfalseになる。ただし、!=だけ例外でtrueになる(たぶん==と!=の結果が常に相補的になるように)。
なので、浮動小数型の変数がNaNかどうかを検査するためには、次のコードでは間違い。
float a = Float.NaN;正しくは、Float#isNaN()・Double#isNaN()を使う。
if (a == Float.NaN) {
System.out.println("NaNです");
} else {
System.out.println("NaNではありません");
}→NaNではありません
「プログラミング言語Java 第4版」179ページあたりに記載あり。