これは純粋に好奇心からです。
私はこのようなことをしました:
public static void main(String args[]) throws Exception {
System.out.println(Double.NaN==Double.NaN);
}
出力はfalse
です。これは返すべきではありませんtrue
か?
なぜそうなのですか?
これは純粋に好奇心からです。
私はこのようなことをしました:
public static void main(String args[]) throws Exception {
System.out.println(Double.NaN==Double.NaN);
}
出力はfalse
です。これは返すべきではありませんtrue
か?
なぜそうなのですか?
Java言語仕様から:
浮動小数点演算子は例外を生成しません (§11)。オーバーフローする演算は符号付き無限大を生成し、アンダーフローする演算は非正規化値または符号付きゼロを生成し、数学的に明確な結果を持たない演算は NaN を生成します。オペランドとして NaN を使用するすべての数値演算は、結果として NaN を生成します。すでに説明したように、NaN は順序付けされていないため、1 つまたは 2 つの NaN を含む数値比較演算は false を返し、NaN を含む != 比較は true を返します (x が NaN の場合の x!=x を含む)。
ここで重要な文は次のとおりです。
そのため、1 つまたは 2 つの NaN を含む数値比較演算は false を返します
2 つの Double を比較する#compareTo(Double)
には、このメソッドを使用することをお勧めNaN
しXXX_INFINITY
ます。
2 つの Double オブジェクトを数値的に比較します。このメソッドによって実行される比較が、Java 言語の数値比較演算子 (<、<=、==、>=、>) によって実行される比較と異なる点が 2 つあります (プリミティブ double 値に適用される場合)。
このメソッドでは、Double.NaN はそれ自体と等しく、他のすべての double 値 (Double.POSITIVE_INFINITY を含む) より大きいと見なされます。このメソッドでは、0.0d は -0.0d より大きいと見なされます。これにより、このメソッドによって適用される Double オブジェクトの自然順序付けが equals と一致することが保証されます。
public static void main(String[] args) {
Double d = new Double(Double.NaN);
System.out.println(d.compareTo(Double.NaN) == 0);//returns true
}