5

重複の可能性:
Double.NaN == Double.NaNがfalseを返すのはなぜですか?

NaN ="NaN"は「数字ではない」を表します。「Nan」は、浮動小数点演算に未定義の結果を生成させる入力パラメーターがある場合に生成されます。たとえば、0.0を0.0で割った値は算術的に定義されていません。負の数の平方根を取ることも定義されていません。

JavaでNaN定数を使おうとしていました

public class NaNDemo {
    public static void main(String s[]) {
        double x = Double.NaN;
        double y = Double.NaN;

        System.out.println((x == y));
        System.out.println("x=" + x);
        System.out.println("y=" + y);
    }
}

出力

false
x=NaN
y=NaN

では、なぜx == yがfalseなのですか?

4

4 に答える 4

3

NaNは概念であり、値や数値ではありません。その概念は複数の非実数値(虚数、0/0など)を表すことができるため、特定のNaNが他のNaNと等しいと言っても意味がありません。

同様Double::NEGATIVE_INFINITYに、無限大も数ではないので、それがそれ自体に等しいとは言えません。

于 2012-09-28T04:12:11.197 に答える
1

等号演算子==は、いずれかのオペランドがNaNの場合にfalseを返します。

JSLはNaNについて次のように述べています。

  • 数値比較演算子<、<=、>、および> =は、いずれかまたは両方のオペランドがNaN(§15.20.1)の場合にfalseを返します。
  • 等号演算子==は、いずれかのオペランドがNaNの場合にfalseを返します。
  • 特に、xまたはyがNaNの場合、(x = y)はfalseになります。
  • 不等式演算子!=は、いずれかのオペランドがNaN(§15.21.1)の場合にtrueを返します。

特に、xがNaNである場合に限り、x!=xは真になります。

于 2012-09-28T04:13:15.933 に答える
0

2つのNaN値を互いに等しくすることはできません。それらがどの未定義の値を表しているのかわかりません。また、それらがどのように表されているのかもわかりません。

JLSで引用されているように-

特別な番号NaN (not-a-number)は順序付けられておらず、次の文字が含まれています。

  • 数値比較演算子<、<=、>、および> =は、いずれかまたは両方のオペランドがNaNの場合、常にfalseを返します。
  • 等号演算子==は、いずれかのオペランドがNaNの場合にfalseを返します。
  • 不等式演算子!=は、いずれかのオペランドがNaNの場合にtrueを返します。

これらを次のように定義すると:-

    Double a = new Double(Double.NaN);
    Double b = new Double(Double.NaN);

    if (a == b) {
        System.out.println("true");   /** You will get true **/
    }
于 2012-09-28T04:11:16.807 に答える
0

NaN --not-a-numberは、NAN number.socantequalで操作を行う場合には意味がありません。

于 2012-09-28T04:21:01.140 に答える