2012-09-28 15 views
5

Eventuali duplicati:
Why does Double.NaN==Double.NaN return false?NaN Magia costante in Java

NaN = "nan" sta per "non un numero". "Nan" viene prodotto se un'operazione in virgola mobile ha alcuni parametri di input che fanno sì che l'operazione produca risultati non definiti. Ad esempio, 0.0 diviso per 0.0 è aritmeticamente indefinito. Anche la radice quadrata di un numero negativo è indefinita.

Stavo cercando di utilizzare NaN Costante in Java

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

uscita

false 
x=NaN 
y=NaN 

Allora perché x == y è falso?

+2

Dai un'occhiata a http://stackoverflow.com/a/471314/751634 –

+0

o più direttamente, http://stackoverflow.com/questions/8819738/why-does-double-nan-double-nan-return ovvero falsi. – AerandiR

+0

Grazie @ jenoosia, Questo è quello che stavo cercando –

risposta

3

NaN è un concetto, non un valore o un numero. Poiché questo concetto può rappresentare più valori numerici non reali (immaginario, 0/0, ecc.) Non ha senso affermare che qualsiasi NaN particolare è uguale a qualsiasi altro NaN.

Analogamente non si può dire che Double::NEGATIVE_INFINITY sia uguale a se stesso, poiché l'infinito non è un numero.

0

Due NaN valori non possono essere uguali tra loro .. Voi non sapete che cosa valore indefinito che rappresentano .. E anche non sapere come vengono rappresentati ..

Come citato in JLS -

il numero speciale NaN (not-a-number) è ordinata ed ha le seguenti caratteri:

  • gli operatori di confronto numerici <, < =,> e> = restituiscono sempre false se uno o entrambi gli operandi sono NaN.
  • L'operatore di uguaglianza == restituisce false se uno degli operandi è NaN.
  • L'operatore di disuguaglianza! = Restituisce true se uno degli operandi è NaN.

Se li definiscono in questo modo: -

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

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

questo non è proprio corretto, è equivalente al valore restituito da Double.longBitsToDouble (0x7ff8000000000000L). – CloudyMarble

+0

@MeNoMore .. Per quale parte stai dicendo questo .. Immagino per la seconda riga -> Non sai quale valore indefinito rappresentano .. Potresti avere ragione, perché non ne sono sicuro .. –

+0

Intendevo anche la parte di rappresentazione -> "non sai come sono rappresentati". non si può ora portare al NaN, ma Java dichiara il loro valore e puoi mostrare loro che otterrai NaN, che è la loro rappresentazione. – CloudyMarble

1

L'operatore di uguaglianza == restituisce false se uno degli operandi è NaN.

JSL Sayes circa NaN:

  • Gli operatori di confronto numerico <, < =,> e> = return false se uno o entrambi gli operandi sono NaN (§15.20.1).
  • L'operatore di uguaglianza == restituisce false se uno degli operandi è NaN.
  • In particolare, (x = y) sarà falso se x o y è NaN.
  • L'operatore di disuguaglianza! = Restituisce true se uno degli operandi è NaN (§15.21.1).

In particolare, x! = X è vero se e solo se x è NaN.

0

NaN - non un numero non ha senso quando si esegue un'operazione con numero NAN.non può essere uguale.