1. ホーム
  2. java

[解決済み] Double.NaN==Double.NaNはなぜfalseを返すのですか?

2022-04-25 13:20:08

質問

OCPJPの問題集を勉強していたら、こんな変なコードを見つけました。

public static void main(String a[]) {
    System.out.println(Double.NaN==Double.NaN);
    System.out.println(Double.NaN!=Double.NaN);
}

コードを実行すると、こうなりました。

false
true

出力はどうなっていますか false と同じに見える2つのものを比較するとき?そのとき NaN の意味は?

どのように解決するのですか?

NaNとは、「数字ではない」という意味です。

Java言語仕様書(JLS)第3版によると :

オーバーフローする演算は符号付き無限大を、アンダーフローする演算は非正規化された値または符号付きゼロを、数学的に明確な結果を持たない演算はNaNを生成する。オペランドに NaN を持つすべての数値演算は、結果として NaN を生成する。既に述べたように、NaNは順序性がないため、1つまたは2つのNaNを含む数値比較演算は false と、任意の != NaN を含む比較は true を含む。 x!=x いつ x がNaNである場合。