2012-09-28 22 views
5

Duplicar posibles:
Why does Double.NaN==Double.NaN return false?NaN magia constante en Java

NaN = "NaN" significa "no es un número". "Nan" se produce si una operación de coma flotante tiene algunos parámetros de entrada que hacen que la operación produzca un resultado indefinido. Por ejemplo, 0.0 dividido por 0.0 es aritméticamente indefinido. Tomar la raíz cuadrada de un número negativo tampoco está definido.

yo estaba tratando de utilizar NaN constante en 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); 
    } 
} 

salida

false 
x=NaN 
y=NaN 

Entonces, ¿por x == y es falsa?

+2

Eche un vistazo a http://stackoverflow.com/a/471314/751634 –

+0

O más directamente, http://stackoverflow.com/questions/8819738/why-does-double-nan-double-nan-return -falso. – AerandiR

+0

Gracias @ jenoosia, Esto es lo que estaba buscando –

Respuesta

3

NaN es un concepto, no un valor o un número. Como ese concepto puede representar múltiples valores de números no reales (imaginario, 0/0, etc.) no tiene sentido decir que un NaN en particular sea igual a cualquier otro NaN.

De forma similar, no se puede decir que Double::NEGATIVE_INFINITY es igual a sí mismo, ya que el infinito tampoco es un número.

0

Dos NaN valores no pueden ser iguales entre sí .. usted no sabe qué valor indefinido que representan .. Y también que no saben cómo se representan ..

Como se cita en JLS -

el número especial NaN (not-a-number) es desordenada y tiene los siguientes caracteres:

  • los operadores de comparación numéricos <, < =,> y> = siempre devuelve falso si uno o ambos operandos son NaN.
  • El operador de igualdad == devuelve falso si cualquiera de los operandos es NaN.
  • El operador de desigualdad! = Devuelve verdadero si el operando es NaN.

Si ellos definen así: -

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

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

esto no es realmente correcto, Es equivalente al valor devuelto por Double.longBitsToDouble (0x7ff8000000000000L). – CloudyMarble

+0

@MeNoMore .. Por lo que estás diciendo ... supongo que para la segunda línea -> No sabes qué valor indefinido representan ... Puede que tengas razón, porque no estoy seguro de esto ... –

+0

Me refería a la parte de representación también -> "usted no sabe cómo están representados". puede que ahora no tengas plomo al NaN, pero Java declara su valor y puedes mostrarles que obtendrás NaN, que es su representación. – CloudyMarble

1

El operador de igualdad == devuelve falso si cualquier operando es NaN.

JSL Sayes sobre Nan:

  • Los operadores de comparación numérica <, < =,> y> = return false si uno o ambos operandos son NaN (§15.20.1).
  • El operador de igualdad == devuelve falso si cualquiera de los operandos es NaN.
  • En particular, (x = y) será falso si x o y es NaN.
  • El operador de desigualdad! = Devuelve verdadero si cualquiera de los operandos es NaN (§15.21.1).

En particular, x! = X es verdadero si y solo si x es NaN.

0

NaN - not-a-number no tiene ningún sentido cuando se realiza una operación con número NAN. No es igual.