Introdução
Neste laboratório, você aprenderá como verificar se um valor double em Java representa infinito positivo ou negativo. Esta é uma habilidade crucial ao lidar com cálculos de ponto flutuante que podem produzir resultados fora da faixa numérica padrão, como aqueles que envolvem divisão por zero.
Através de exercícios práticos, você utilizará o método Double.isInfinite() para identificar valores infinitos, explorará como a divisão por zero pode levar ao infinito e entenderá a distinção entre valores infinitos e NaN (Not-a-Number).
Usar Double.isInfinite() para Verificação
Nesta etapa, aprenderemos como verificar se um valor double em Java representa infinito positivo ou negativo. Isso é particularmente útil ao lidar com cálculos que podem resultar em valores fora da faixa normal de números de ponto flutuante, como a divisão por zero.
Java fornece um método embutido chamado isInfinite() na classe Double especificamente para este propósito.
Vamos criar um programa Java simples para demonstrar como usar Double.isInfinite().
Abra o arquivo
HelloJava.javano editor WebIDE, caso ainda não esteja aberto. Você deve estar no diretório~/project.Substitua todo o conteúdo do arquivo pelo seguinte código:
public class HelloJava { public static void main(String[] args) { double positiveInfinity = Double.POSITIVE_INFINITY; double negativeInfinity = Double.NEGATIVE_INFINITY; double finiteNumber = 10.0; System.out.println("Is positiveInfinity infinite? " + Double.isInfinite(positiveInfinity)); System.out.println("Is negativeInfinity infinite? " + Double.isInfinite(negativeInfinity)); System.out.println("Is finiteNumber infinite? " + Double.isInfinite(finiteNumber)); } }Vamos analisar as novas partes deste código:
double positiveInfinity = Double.POSITIVE_INFINITY;: Esta linha declara uma variáveldoublee atribui a ela o valor especial que representa infinito positivo.double negativeInfinity = Double.NEGATIVE_INFINITY;: Esta linha declara uma variáveldoublee atribui a ela o valor especial que representa infinito negativo.double finiteNumber = 10.0;: Isso declara uma variáveldoubleregular com um valor finito.System.out.println("Is positiveInfinity infinite? " + Double.isInfinite(positiveInfinity));: Esta linha chama o métodoDouble.isInfinite()compositiveInfinitycomo argumento. O método retornatruese o valor for infinito (positivo ou negativo) efalsecaso contrário. O resultado é então impresso no console.- As duas próximas linhas
System.out.printlnfazem o mesmo paranegativeInfinityefiniteNumber.
Salve o arquivo (Ctrl+S ou Cmd+S).
Agora, vamos compilar nosso programa. Abra o Terminal na parte inferior do WebIDE e certifique-se de estar no diretório
~/project. Execute o seguinte comando:javac HelloJava.javaSe a compilação for bem-sucedida, você não verá nenhuma saída.
Finalmente, execute o programa compilado usando o comando
java:java HelloJavaVocê deve ver uma saída semelhante a esta:
Is positiveInfinity infinite? true Is negativeInfinity infinite? true Is finiteNumber infinite? false
Esta saída confirma que Double.isInfinite() identifica corretamente tanto o infinito positivo quanto o negativo, enquanto retorna false para um número finito regular.
Testar com Divisão por Zero
Na etapa anterior, vimos como Double.isInfinite() funciona com valores de infinito predefinidos. Agora, vamos explorar um cenário comum onde o infinito pode surgir em cálculos: a divisão por zero.
Na aritmética padrão, a divisão por zero é indefinida. No entanto, na aritmética de ponto flutuante (que double utiliza), dividir um número diferente de zero por zero resulta em infinito positivo ou negativo, dependendo do sinal do numerador. Dividir zero por zero, ou infinito por infinito, resulta em um valor especial chamado "Not a Number" (NaN), que abordaremos na próxima etapa.
Vamos modificar nosso programa para demonstrar a divisão por zero e verificar o resultado usando Double.isInfinite().
Abra o arquivo
HelloJava.javano editor WebIDE. Você deve estar no diretório~/project.Substitua o código atual pelo seguinte:
public class HelloJava { public static void main(String[] args) { double positiveResult = 10.0 / 0.0; double negativeResult = -10.0 / 0.0; double zeroResult = 0.0 / 10.0; System.out.println("Result of 10.0 / 0.0: " + positiveResult); System.out.println("Is 10.0 / 0.0 infinite? " + Double.isInfinite(positiveResult)); System.out.println("Result of -10.0 / 0.0: " + negativeResult); System.out.println("Is -10.0 / 0.0 infinite? " + Double.isInfinite(negativeResult)); System.out.println("Result of 0.0 / 10.0: " + zeroResult); System.out.println("Is 0.0 / 10.0 infinite? " + Double.isInfinite(zeroResult)); } }Aqui está o que está acontecendo neste novo código:
double positiveResult = 10.0 / 0.0;: Dividimos um número positivo (10.0) por zero (0.0). Na aritmética de ponto flutuante, isso resulta em infinito positivo.double negativeResult = -10.0 / 0.0;: Dividimos um número negativo (-10.0) por zero (0.0). Isso resulta em infinito negativo.double zeroResult = 0.0 / 10.0;: Dividimos zero (0.0) por um número diferente de zero (10.0). Isso resulta em zero, que é um número finito.- Em seguida, imprimimos os resultados dessas divisões e usamos
Double.isInfinite()para verificar se cada resultado é infinito.
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa modificado no Terminal:
javac HelloJava.javaNovamente, nenhuma saída indica compilação bem-sucedida.
Execute o programa:
java HelloJavaVocê deve ver uma saída semelhante a esta:
Result of 10.0 / 0.0: Infinity Is 10.0 / 0.0 infinite? true Result of -10.0 / 0.0: -Infinity Is -10.0 / 0.0 infinite? true Result of 0.0 / 10.0: 0.0 Is 0.0 / 10.0 infinite? false
Isso demonstra que dividir um número de ponto flutuante diferente de zero por zero produz corretamente infinito (positivo ou negativo), e Double.isInfinite() identifica com precisão esses resultados. Dividir zero por um número diferente de zero resulta em zero, que não é infinito.
Diferenciar Infinito de NaN (Not a Number)
Nas etapas anteriores, aprendemos sobre Double.isInfinite() e como a divisão por zero pode resultar em infinito. No entanto, existe outro valor especial na aritmética de ponto flutuante chamado NaN, que significa "Not a Number" (Não é um Número). NaN representa o resultado de uma operação indefinida ou não representável, como dividir zero por zero ou calcular a raiz quadrada de um número negativo.
É importante ser capaz de diferenciar entre valores infinitos e NaN, pois eles representam diferentes tipos de resultados excepcionais. Java fornece o método Double.isNaN() para verificar se um valor double é NaN.
Vamos modificar nosso programa pela última vez para incluir um cálculo que resulta em NaN e ver como distingui-lo do infinito.
Abra o arquivo
HelloJava.javano editor WebIDE. Você deve estar no diretório~/project.Substitua o código atual pelo seguinte:
public class HelloJava { public static void main(String[] args) { double positiveInfinity = 10.0 / 0.0; double nanResult = 0.0 / 0.0; double finiteNumber = 5.0; System.out.println("Result of 10.0 / 0.0: " + positiveInfinity); System.out.println("Is 10.0 / 0.0 infinite? " + Double.isInfinite(positiveInfinity)); System.out.println("Is 10.0 / 0.0 NaN? " + Double.isNaN(positiveInfinity)); System.out.println("Result of 0.0 / 0.0: " + nanResult); System.out.println("Is 0.0 / 0.0 infinite? " + Double.isInfinite(nanResult)); System.out.println("Is 0.0 / 0.0 NaN? " + Double.isNaN(nanResult)); System.out.println("Result of 5.0: " + finiteNumber); System.out.println("Is 5.0 infinite? " + Double.isInfinite(finiteNumber)); System.out.println("Is 5.0 NaN? " + Double.isNaN(finiteNumber)); } }Aqui está uma análise das mudanças:
double positiveInfinity = 10.0 / 0.0;: Mantemos a divisão que resulta em infinito positivo.double nanResult = 0.0 / 0.0;: Esta linha realiza a divisão de zero por zero, que resulta em NaN.double finiteNumber = 5.0;: Um número finito regular para comparação.- Agora incluímos chamadas para
Double.isNaN()para cada resultado, além deDouble.isInfinite().
Salve o arquivo (Ctrl+S ou Cmd+S).
Compile o programa no Terminal:
javac HelloJava.javaExecute o programa:
java HelloJavaVocê deve ver uma saída semelhante a esta:
Result of 10.0 / 0.0: Infinity Is 10.0 / 0.0 infinite? true Is 10.0 / 0.0 NaN? false Result of 0.0 / 0.0: NaN Is 0.0 / 0.0 infinite? false Is 0.0 / 0.0 NaN? true Result of 5.0: 5.0 Is 5.0 infinite? false Is 5.0 NaN? false
Esta saída mostra claramente a diferença entre valores infinitos e NaN. Double.isInfinite() retorna true apenas para infinito positivo ou negativo, enquanto Double.isNaN() retorna true apenas para NaN. Para um número finito, ambos os métodos retornam false. Compreender essa distinção é crucial para lidar com potenciais erros e resultados inesperados em cálculos de ponto flutuante.
Resumo
Neste laboratório, aprendemos como verificar se um valor double em Java representa infinito positivo ou negativo usando o método Double.isInfinite(). Vimos como usar este método com os valores predefinidos Double.POSITIVE_INFINITY e Double.NEGATIVE_INFINITY, bem como com um número finito, para entender seu comportamento. Este método é crucial para lidar com potenciais resultados infinitos de cálculos de ponto flutuante.



