2012-09-28 17 views
5

Powiel możliwe:
Why does Double.NaN==Double.NaN return false?NaN Stała Magia w Javie

NaN = "NaN" oznacza "Not a Number". "Nan" jest produkowane, jeśli operacja zmiennoprzecinkowa ma pewne parametry wejściowe, które powodują, że operacja daje pewien niezdefiniowany wynik. Na przykład 0,0 podzielone przez 0,0 jest arytmetycznie niezdefiniowane. Przyjmowanie pierwiastka kwadratowego z liczby ujemnej jest również niezdefiniowane.

starałem się używać NaN Stała w Javie

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); 
    } 
} 

Wyjście

false 
x=NaN 
y=NaN 

Więc dlaczego x == y jest fałszywy?

+2

Spójrz na http://stackoverflow.com/a/471314/751634 –

+0

Lub bardziej bezpośrednio, http://stackoverflow.com/questions/8819738/why-does-double-nan-double-nan-return -fałszywy. – AerandiR

+0

Dzięki @ jenoosia, to właśnie szukałem –

Odpowiedz

3

NaN to pojęcie, a nie wartość lub ilość. Ponieważ pojęcie to może reprezentować wiele wartości nieoryginalnych (wyobrażenie, 0/0 itd.), Nie ma sensu mówić, że jakikolwiek konkretny NaN jest równy jakiemukolwiek innemu NaN.

Podobnie nie można powiedzieć, że Double::NEGATIVE_INFINITY jest równy sobie, ponieważ nieskończoność również nie jest liczbą.

0

Dwa NaN wartości nie mogą być sobie równe .. Nie wiem co oni reprezentują wartość niezdefiniowana .. I też nie wiem, w jaki sposób są one reprezentowane ..

Jak cytowany w JLS -

specjalny numer NaN (not-a-number) jest nieuporządkowana i ma następujące znaki:

  • numeryczna operatory porównania <, < =,> i> = zawsze zwracają fałsz, jeśli jeden lub oba argumenty są NaN.
  • Operator równości == zwraca wartość false, jeśli dowolny argument to NaN.
  • Operator nierówności! = Zwraca wartość true, jeśli dowolny argument to NaN.

Jeśli je zdefiniować tak: -

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

    if (a == b) { 
     System.out.println("true"); /** You will get true **/ 
    } 
+0

to nie jest w porządku, Jest to odpowiednik wartości zwróconej przez Double.longBitsToDouble (0x7ff8000000000000L). – CloudyMarble

+0

@MeNoMore .. Dla której części mówisz to .. Chyba dla drugiej linii -> Nie wiesz, jaką nieokreśloną wartość reprezentują .. Może masz rację, ponieważ nie jestem pewien co do tego .. –

+0

Miałem na myśli także reprezentację -> "nie wiesz, jak są reprezentowani". nie możesz teraz prowadzić do NaN, ale Java deklaruje ich wartość i możesz im pokazać, że otrzymasz NaN, co jest ich reprezentacją. – CloudyMarble

1

Operator równości == zwraca wartość false, jeśli dowolny argument to NaN.

JSL Sayes o NaN:

  • numeryczna operatorów porównania <, < =,> i> = zwraca fałsz Jeżeli jeden lub oba argumenty są NaN (§15.20.1).
  • Operator równości == zwraca wartość false, jeśli dowolny argument to NaN.
  • W szczególności (x = y) będzie fałszywe, jeśli x lub y jest NaN.
  • Operator nierówności! = Zwraca prawdę, jeśli dowolny operand jest NaN (§15.21.1).

W szczególności x! = X ma wartość true wtedy i tylko wtedy, gdy x jest NaN.

0

NaN - not-a-number nie ma żadnego sensu przy wykonywaniu operacji z NAN number.so cant equal.