tooltiptext sirve que personalizar para example java floating-point nan

sirve - ¿Java es nan cómo funciona?



para que sirve tooltiptext en java (5)

De la especificación del lenguaje Java :

La prueba de igualdad de punto flotante se realiza de acuerdo con las reglas de la norma IEEE 754:

  • Si cualquiera de los operandos es NaN, entonces el resultado de == es falso pero el resultado de! = Es verdadero. De hecho, la prueba x! = X es verdadera si y solo si el valor de x es NaN. (Los métodos Float.isNaN y Double.isNaN también se pueden usar para probar si un valor es NaN).

  • El cero positivo y el cero negativo se consideran iguales. Por lo tanto, -0.0 == 0.0 es verdadero, por ejemplo.

  • De lo contrario, dos valores de punto flotante distintos se consideran desiguales por los operadores de igualdad. En particular, hay un valor que representa el infinito positivo y un valor que representa el infinito negativo; cada uno se compara igual solo a sí mismo, y cada uno se compara desigual con todos los demás valores.

Estaba mirando el código fuente de openjdk-1.7.0_25 y he visto este método:

/** * Returns {@code true} if the specified number is a * Not-a-Number (NaN) value, {@code false} otherwise. * * @param v the value to be tested. * @return {@code true} if the argument is NaN; * {@code false} otherwise. */ static public boolean isNaN(float v) { return (v != v); }

¿No puedo entender cómo funciona, cuando este método puede devolver true ?


Ese método puede devolver verdadero para ciertas operaciones, por ejemplo:

System.out.println(Float.isNaN(0.0f / 0.0f)); System.out.println(Double.isNaN(Math.sqrt(-1)));

Básicamente, NaN representa un valor indefinido. El valor de 0.0 / 0.0 es NaN , y Nan != NaN . Puede parecer lógico porque Math.sqrt(-1) también te da NaN .

Ver el javadoc de Double.NaN :

Es equivalente al valor devuelto por Double.longBitsToDouble(0x7ff8000000000000L)

Y luego Double.longBitsToDouble() :

Si el argumento es cualquier valor en el rango de 0x7ff0000000000001L a 0x7fffffffffffffffL o en el rango de 0xfff0000000000001L a 0xffffffffffffffffL , el resultado es un NaN . Ninguna operación de punto flotante IEEE 754 proporcionada por Java puede distinguir entre dos valores de NaN del mismo tipo con diferentes patrones de bits.


Por lo que sé, el Source no es igual a nada. Por lo tanto, cuando se pasa float v , nunca es igual a sí mismo.


Porque solo NaN compara falso consigo mismo. Por lo tanto, se volverá verdadero cuando pases NaN al método.

Una comparación con un NaN siempre devuelve un resultado desordenado incluso cuando se compara con sí mismo. ... Los predicados de igualdad y desigualdad no son de señalización, por lo que x = x devolver falso se puede usar para probar si x es un NaN silencioso.

Source

No se trata solo de Java, también es válido para todos los lenguajes que siguen el estándar IEEE754.

Pregunta relacionada: ¿Por qué Double.NaN == Double.NaN devuelve false?


Simple ... ¡ Nan es siempre ! = NaN , estos valores no son iguales a nada. Ver this

Como ya se ha descrito, NaN no está ordenada, por lo que una operación de comparación numérica que involucra uno o dos NaN devuelve falso y cualquier comparación con NaN devuelve verdadero, incluyendo x! = X cuando x es NaN .

Entonces, pruebe si v != v es suficiente para determinar si el value es NaN o no.