Como Verificar se um Número é Infinito em Java

JavaBeginner
Pratique Agora

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().

  1. Abra o arquivo HelloJava.java no editor WebIDE, caso ainda não esteja aberto. Você deve estar no diretório ~/project.

  2. 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ável double e atribui a ela o valor especial que representa infinito positivo.
    • double negativeInfinity = Double.NEGATIVE_INFINITY;: Esta linha declara uma variável double e atribui a ela o valor especial que representa infinito negativo.
    • double finiteNumber = 10.0;: Isso declara uma variável double regular com um valor finito.
    • System.out.println("Is positiveInfinity infinite? " + Double.isInfinite(positiveInfinity));: Esta linha chama o método Double.isInfinite() com positiveInfinity como argumento. O método retorna true se o valor for infinito (positivo ou negativo) e false caso contrário. O resultado é então impresso no console.
    • As duas próximas linhas System.out.println fazem o mesmo para negativeInfinity e finiteNumber.
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. 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.java
    

    Se a compilação for bem-sucedida, você não verá nenhuma saída.

  5. Finalmente, execute o programa compilado usando o comando java:

    java HelloJava
    

    Você 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().

  1. Abra o arquivo HelloJava.java no editor WebIDE. Você deve estar no diretório ~/project.

  2. 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.
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Compile o programa modificado no Terminal:

    javac HelloJava.java
    

    Novamente, nenhuma saída indica compilação bem-sucedida.

  5. Execute o programa:

    java HelloJava
    

    Você 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.

  1. Abra o arquivo HelloJava.java no editor WebIDE. Você deve estar no diretório ~/project.

  2. 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 de Double.isInfinite().
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Compile o programa no Terminal:

    javac HelloJava.java
    
  5. Execute o programa:

    java HelloJava
    

    Você 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.