Introdução
Neste laboratório, você aprenderá como verificar se um número de ponto flutuante é "Not a Number" (NaN) em Java. Exploraremos o método Double.isNaN(), entenderemos como os valores NaN são gerados através de operações de ponto flutuante e consideraremos como lidar com entradas que não são de ponto flutuante no contexto de verificações NaN. Ao final deste laboratório, você estará apto a detectar e gerenciar de forma confiável valores NaN em seus programas Java.
Usar Double.isNaN() para Verificação
Nesta etapa, aprenderemos como verificar se um número de ponto flutuante é "Not a Number" (NaN) em Java usando o método Double.isNaN().
Números de ponto flutuante em computadores podem, às vezes, resultar em um valor especial chamado NaN. Isso acontece quando o resultado de um cálculo é indefinido ou não pode ser representado como um número padrão. Por exemplo, dividir zero por zero ou tirar a raiz quadrada de um número negativo pode resultar em NaN.
É importante ser capaz de detectar valores NaN em seus programas porque eles se comportam de forma diferente dos números regulares. Por exemplo, comparar um valor NaN com qualquer outro número (mesmo outro NaN) usando operadores de comparação padrão (==, <, >) sempre resultará em false.
Java fornece um método específico para verificar NaN: Double.isNaN(). Este método recebe um valor double como entrada e retorna true se o valor for NaN, e false caso contrário.
Vamos criar um programa Java simples para demonstrar como usar Double.isNaN().
Abra o arquivo
HelloJava.javano editor WebIDE.Substitua o código existente pelo seguinte:
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)); } }Neste código:
- Declaramos duas variáveis
double,result1eresult2. result1recebe o resultado de0.0 / 0.0, que é uma forma indeterminada e produzirá NaN.result2recebe o resultado de10.0 / 2.0, que é um número padrão (5.0).- Em seguida, usamos
Double.isNaN()para verificar seresult1eresult2são NaN e imprimimos os resultados.
- Declaramos duas variáveis
Salve o arquivo (Ctrl+S ou Cmd+S).
Agora, precisamos compilar este novo programa. Como mudamos o nome da classe para
CheckNaN, precisamos compilarCheckNaN.java. Abra o Terminal e execute:javac CheckNaN.javaSe a compilação for bem-sucedida, você não deverá ver nenhuma saída.
Finalmente, execute o programa compilado:
java CheckNaNVocê deverá ver uma saída semelhante a esta:
Is result1 NaN? true Is result2 NaN? falseEsta saída confirma que
Double.isNaN()identificou corretamenteresult1como NaN eresult2como um número regular.
Usar Double.isNaN() é a maneira correta e confiável de verificar valores NaN em Java. Confiar na comparação direta (== Double.NaN) não é recomendado porque, como mencionado anteriormente, NaN == NaN avalia como false.
Testar com Operações de Ponto Flutuante
Nesta etapa, exploraremos mais exemplos de operações de ponto flutuante que podem resultar em NaN e praticaremos o uso de Double.isNaN() para verificá-los. Entender quais operações produzem NaN é crucial para escrever código Java robusto que lida com erros potenciais de forma adequada.
Além de dividir zero por zero, outras operações envolvendo infinito ou funções matemáticas inválidas também podem produzir NaN. Java tem representações especiais para infinito positivo e negativo (Double.POSITIVE_INFINITY e Double.NEGATIVE_INFINITY).
Vamos modificar nosso programa CheckNaN.java para testar alguns desses casos.
Abra o arquivo
CheckNaN.javano editor WebIDE.Substitua o código existente pelo seguinte:
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)); } }Neste código atualizado:
result1ainda é0.0 / 0.0.result2usaMath.sqrt(-1.0), que é matematicamente indefinido para números reais e resulta em NaN.result3subtrai infinito positivo de infinito positivo, outra forma indeterminada resultando em NaN.result4eresult5demonstram a divisão por zero, que resulta em infinito positivo ou negativo, não NaN.result6é um número simples para comparação.
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa modificado no Terminal:
javac CheckNaN.javaNovamente, nenhuma saída indica compilação bem-sucedida.
Execute o programa:
java CheckNaNVocê deverá ver uma saída semelhante 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 saída mostra que
Double.isNaN()identificou corretamente as três operações que resultam em NaN, enquanto identifica corretamente os valores de infinito e o número regular como não NaN.
Ao testar com essas diferentes operações de ponto flutuante, você obtém uma melhor compreensão de quando NaN pode ocorrer e como usar Double.isNaN() para lidar com esses casos em seus programas.
Lidar com Entradas Não-Ponto Flutuante
Nas etapas anteriores, focamos em como as operações de ponto flutuante podem resultar em NaN. No entanto, às vezes você pode receber uma entrada que não é um número válido, como texto. Quando você tenta converter essa entrada em um número de ponto flutuante, isso também pode levar a problemas.
Embora Double.isNaN() seja especificamente para verificar o resultado de cálculos de ponto flutuante, também é importante lidar com casos em que a entrada inicial não pode ser analisada como um número. Java fornece métodos para analisar strings em números, e esses métodos podem lançar exceções se a entrada for inválida.
Vamos criar um novo programa que tenta analisar a entrada do usuário como um double e, em seguida, verifica se o valor analisado é NaN.
Crie um novo arquivo no diretório
~/projectchamadoParseAndCheck.java. Você pode fazer isso clicando com o botão direito no File Explorer e selecionando "New File", em seguida, digitandoParseAndCheck.java.Abra o arquivo
ParseAndCheck.javano editor WebIDE e adicione o seguinte 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(); } } }Vamos detalhar este código:
- Importamos a classe
Scannerpara ler a entrada do usuário. - Solicitamos ao usuário que insira uma string.
- Usamos um bloco
try-catchpara lidar com possíveis erros durante a análise. Double.parseDouble(input)tenta converter a string de entrada em umdouble. Se a string não for um formato de número válido (por exemplo, "hello"), ela lançará umNumberFormatException.- Dentro do bloco
try, se a análise for bem-sucedida, usamosDouble.isNaN(value)para verificar se odoubleresultante é NaN. - O bloco
catchcaptura oNumberFormatExceptione imprime uma mensagem de erro se a entrada não puder ser analisada. - O bloco
finallygarante que o scanner seja fechado.
- Importamos a classe
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa no Terminal:
javac ParseAndCheck.javaExecute o programa:
java ParseAndCheckO programa solicitará que você insira uma entrada. Tente inserir valores diferentes:
Insira
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.5Insira
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.(Observação:
parseDoublenão pode avaliar expressões matemáticas diretamente. Ele apenas analisa representações de string de números.)Insira
NaN:Enter a floating-point number or an expression (e.g., 0.0/0.0): NaN The input resulted in NaN.Insira
hello:Enter a floating-point number or an expression (e.g., 0.0/0.0): hello Invalid input: Could not parse as a number.
Esta etapa demonstra como combinar a análise de entrada com a verificação Double.isNaN() para lidar com vários tipos de entrada, incluindo números válidos, a string "NaN" e formatos de número inválidos. Esta é uma abordagem mais completa para lidar com possíveis problemas ao trabalhar com números de ponto flutuante de fontes externas.
Resumo
Neste laboratório, aprendemos como verificar se um número de ponto flutuante é "Not a Number" (NaN) em Java. Descobrimos que NaN é um valor especial resultante de cálculos indefinidos ou não representáveis, e que os operadores de comparação padrão não funcionam de forma confiável com NaN.
Focamos especificamente no uso do método Double.isNaN(), que é a maneira padrão e recomendada de detectar com precisão valores NaN em Java. Demonstramos seu uso com exemplos envolvendo operações de ponto flutuante que produzem NaN e resultados numéricos regulares.



