Introducción
En este laboratorio, aprenderás cómo verificar si un número de punto flotante es "Not a Number" (NaN) en Java. Exploraremos el método Double.isNaN(), entenderemos cómo se generan los valores NaN a través de operaciones de punto flotante y consideraremos cómo manejar entradas que no son de punto flotante en el contexto de las comprobaciones de NaN. Al final de este laboratorio, estarás capacitado para detectar y gestionar de manera confiable los valores NaN en tus programas Java.
Utiliza Double.isNaN() para la comprobación
En este paso, aprenderemos cómo verificar si un número de punto flotante es "Not a Number" (NaN) en Java utilizando el método Double.isNaN().
Los números de punto flotante en las computadoras a veces pueden resultar en un valor especial llamado NaN. Esto sucede cuando el resultado de un cálculo es indefinido o no se puede representar como un número estándar. Por ejemplo, dividir cero entre cero o calcular la raíz cuadrada de un número negativo puede resultar en NaN.
Es importante poder detectar los valores NaN en tus programas porque se comportan de manera diferente a los números regulares. Por ejemplo, comparar un valor NaN con cualquier otro número (incluso con otro NaN) utilizando operadores de comparación estándar (==, <, >) siempre dará como resultado false.
Java proporciona un método específico para comprobar si un valor es NaN: Double.isNaN(). Este método toma un valor double como entrada y devuelve true si el valor es NaN y false en caso contrario.
Vamos a crear un sencillo programa de Java para demostrar cómo utilizar Double.isNaN().
Abre el archivo
HelloJava.javaen el editor WebIDE.Reemplaza el código existente con el siguiente:
public class CheckNaN { public static void main(String[] args) { double result1 = 0.0 / 0.0; // This will result in NaN double result2 = 10.0 / 2.0; // This is a regular number System.out.println("Is result1 NaN? " + Double.isNaN(result1)); System.out.println("Is result2 NaN? " + Double.isNaN(result2)); } }En este código:
- Declaramos dos variables
double,result1yresult2. result1se le asigna el resultado de0.0 / 0.0, que es una forma indeterminada y producirá NaN.result2se le asigna el resultado de10.0 / 2.0, que es un número estándar (5.0).- Luego utilizamos
Double.isNaN()para comprobar siresult1yresult2son NaN y mostramos los resultados.
- Declaramos dos variables
Guarda el archivo (Ctrl+S o Cmd+S).
Ahora, necesitamos compilar este nuevo programa. Dado que cambiamos el nombre de la clase a
CheckNaN, necesitamos compilarCheckNaN.java. Abre la Terminal y ejecuta:javac CheckNaN.javaSi la compilación es exitosa, no deberías ver ninguna salida.
Finalmente, ejecuta el programa compilado:
java CheckNaNDeberías ver una salida similar a esta:
Is result1 NaN? true Is result2 NaN? falseEsta salida confirma que
Double.isNaN()identificó correctamenteresult1como NaN yresult2como un número regular.
Utilizar Double.isNaN() es la forma correcta y confiable de comprobar si un valor es NaN en Java. No se recomienda confiar en una comparación directa (== Double.NaN) porque, como se mencionó anteriormente, NaN == NaN se evalúa como false.
Probar con operaciones de punto flotante
En este paso, exploraremos más ejemplos de operaciones de punto flotante que pueden resultar en NaN y practicaremos el uso de Double.isNaN() para comprobarlos. Comprender qué operaciones producen NaN es crucial para escribir código Java robusto que maneje los posibles errores de manera elegante.
Además de dividir cero entre cero, otras operaciones que involucren infinito o funciones matemáticas inválidas también pueden producir NaN. Java tiene representaciones especiales para el infinito positivo y negativo (Double.POSITIVE_INFINITY y Double.NEGATIVE_INFINITY).
Modifiquemos nuestro programa CheckNaN.java para probar algunos de estos casos.
Abra el archivo
CheckNaN.javaen el editor WebIDE.Reemplace el código existente con el siguiente:
public class CheckNaN { public static void main(String[] args) { double result1 = 0.0 / 0.0; // NaN double result2 = Math.sqrt(-1.0); // NaN (square root of a negative number) double result3 = Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY; // NaN double result4 = 10.0 / 0.0; // Positive Infinity double result5 = -10.0 / 0.0; // Negative Infinity double result6 = 5.0; // Regular number System.out.println("Is result1 NaN? " + Double.isNaN(result1)); System.out.println("Is result2 NaN? " + Double.isNaN(result2)); System.out.println("Is result3 NaN? " + Double.isNaN(result3)); System.out.println("Is result4 NaN? " + Double.isNaN(result4)); System.out.println("Is result5 NaN? " + Double.isNaN(result5)); System.out.println("Is result6 NaN? " + Double.isNaN(result6)); } }En este código actualizado:
result1sigue siendo0.0 / 0.0.result2utilizaMath.sqrt(-1.0), que es matemáticamente indefinido para números reales y resulta en NaN.result3resta infinito positivo de infinito positivo, otra forma indeterminada que resulta en NaN.result4yresult5demuestran la división entre cero, que resulta en infinito positivo o negativo, no en NaN.result6es un número simple para comparación.
Guarde el archivo (Ctrl+S o Cmd+S).
Compile el programa modificado en la Terminal:
javac CheckNaN.javaNuevamente, la ausencia de salida indica una compilación exitosa.
Ejecute el programa:
java CheckNaNDebería ver una salida similar a esta:
Is result1 NaN? true Is result2 NaN? true Is result3 NaN? true Is result4 NaN? false Is result5 NaN? false Is result6 NaN? falseEsta salida muestra que
Double.isNaN()identificó correctamente las tres operaciones que resultan en NaN, y también identificó correctamente los valores de infinito y el número regular como no NaN.
Al probar con estas diferentes operaciones de punto flotante, obtendrá una mejor comprensión de cuándo puede ocurrir NaN y cómo utilizar Double.isNaN() para manejar estos casos en sus programas.
Manejar entradas no de punto flotante
En los pasos anteriores, nos centramos en cómo las operaciones de punto flotante pueden resultar en NaN. Sin embargo, a veces es posible recibir una entrada que no es un número válido en absoluto, como texto. Cuando se intenta convertir esa entrada en un número de punto flotante, también puede causar problemas.
Si bien Double.isNaN() está específicamente diseñado para comprobar el resultado de cálculos de punto flotante, también es importante manejar los casos en los que la entrada inicial no se puede analizar como un número. Java proporciona métodos para analizar cadenas en números, y estos métodos pueden lanzar excepciones si la entrada no es válida.
Vamos a crear un nuevo programa que intente analizar la entrada del usuario como un valor double y luego compruebe si el valor analizado es NaN.
Crea un nuevo archivo en el directorio
~/projectllamadoParseAndCheck.java. Puedes hacer esto haciendo clic derecho en el Explorador de archivos y seleccionando "Nuevo archivo", luego escribiendoParseAndCheck.java.Abre el archivo
ParseAndCheck.javaen el editor WebIDE y agrega el siguiente código:import java.util.Scanner; public class ParseAndCheck { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a floating-point number or an expression (e.g., 0.0/0.0): "); String input = scanner.nextLine(); try { double value = Double.parseDouble(input); if (Double.isNaN(value)) { System.out.println("The input resulted in NaN."); } else { System.out.println("The input is a valid number: " + value); } } catch (NumberFormatException e) { System.out.println("Invalid input: Could not parse as a number."); } finally { scanner.close(); } } }Analicemos este código:
- Importamos la clase
Scannerpara leer la entrada del usuario. - Pedimos al usuario que ingrese una cadena.
- Utilizamos un bloque
try-catchpara manejar posibles errores durante el análisis. Double.parseDouble(input)intenta convertir la cadena de entrada en un valordouble. Si la cadena no tiene un formato de número válido (por ejemplo, "hello"), lanzará unaNumberFormatException.- Dentro del bloque
try, si el análisis es exitoso, luego usamosDouble.isNaN(value)para comprobar si el valordoubleresultante es NaN. - El bloque
catchcaptura laNumberFormatExceptiony muestra un mensaje de error si la entrada no se pudo analizar. - El bloque
finallyasegura que el scanner se cierre.
- Importamos la clase
Guarda el archivo (Ctrl+S o Cmd+S).
Compila el programa en la Terminal:
javac ParseAndCheck.javaEjecuta el programa:
java ParseAndCheckEl programa te pedirá una entrada. Intenta ingresar diferentes valores:
Ingresa
5.5:Enter a floating-point number or an expression (e.g., 0.0/0.0): 5.5 The input is a valid number: 5.5Ingresa
0.0/0.0:Enter a floating-point number or an expression (e.g., 0.0/0.0): 0.0/0.0 Invalid input: Could not parse as a number.(Nota:
parseDoubleno puede evaluar expresiones matemáticas directamente. Solo analiza representaciones de cadenas de números.)Ingresa
NaN:Enter a floating-point number or an expression (e.g., 0.0/0.0): NaN The input resulted in NaN.Ingresa
hello:Enter a floating-point number or an expression (e.g., 0.0/0.0): hello Invalid input: Could not parse as a number.
Este paso demuestra cómo combinar el análisis de entrada con la comprobación Double.isNaN() para manejar varios tipos de entrada, incluyendo números válidos, la cadena "NaN" y formatos de números no válidos. Este es un enfoque más completo para tratar con posibles problemas al trabajar con números de punto flotante de fuentes externas.
Resumen
En este laboratorio, aprendimos cómo comprobar si un número de punto flotante es "Not a Number" (NaN) en Java. Descubrimos que NaN es un valor especial que resulta de cálculos indefinidos o no representables, y que los operadores de comparación estándar no funcionan de manera confiable con NaN.
Nos centramos específicamente en el uso del método Double.isNaN(), que es la forma estándar y recomendada para detectar con precisión valores NaN en Java. Demostramos su uso con ejemplos que involucran operaciones de punto flotante que producen NaN y resultados numéricos normales.



