Como Verificar se um Número Está Próximo de Outro em Python

PythonBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como verificar se um número está próximo de outro em Python, abordando os desafios das comparações de números de ponto flutuante. Você começará entendendo o conceito de proximidade numérica e sua importância devido à maneira como os computadores representam números de ponto flutuante, o que pode levar a resultados inesperados ao compará-los quanto à igualdade. Um script Python ilustrará esse conceito calculando 0.1 + 0.2 e comparando o resultado com 0.3, demonstrando o potencial de desigualdade devido à representação de ponto flutuante.

O laboratório então o guiará através do cálculo da diferença absoluta entre dois números como uma abordagem para determinar a proximidade. Finalmente, você aprenderá como usar a função math.isclose() para comparações mais robustas de números de ponto flutuante, levando em consideração tanto as tolerâncias relativas quanto as absolutas.

Entenda a Proximidade Numérica

Nesta etapa, exploraremos o conceito de proximidade numérica e sua importância na programação, especialmente ao lidar com números de ponto flutuante. Devido à maneira como os computadores representam números de ponto flutuante, eles são frequentemente aproximações de números reais. Isso pode levar a resultados inesperados ao compará-los quanto à igualdade.

A proximidade numérica nos ajuda a determinar se dois números estão "suficientemente próximos" para serem considerados iguais, mesmo que não sejam exatamente os mesmos. Isso é particularmente útil ao lidar com cálculos que envolvem aritmética de ponto flutuante.

Vamos começar criando um script Python para ilustrar esse conceito.

  1. Abra o editor VS Code no ambiente LabEx.

  2. Crie um novo arquivo chamado proximity.py no diretório ~/project.

    ~/project/proximity.py
    
  3. Adicione o seguinte código a proximity.py:

    ## proximity.py
    
    num1 = 0.1 + 0.2
    num2 = 0.3
    
    print(f"num1 is: {num1}")
    print(f"num2 is: {num2}")
    
    if num1 == num2:
        print("num1 and num2 are equal")
    else:
        print("num1 and num2 are not equal")
    

    Este script calcula 0.1 + 0.2 e compara o resultado com 0.3.

  4. Salve o arquivo e execute-o usando o seguinte comando no terminal:

    python ~/project/proximity.py
    

    Você deve ver uma saída semelhante a esta:

    num1 is: 0.30000000000000004
    num2 is: 0.3
    num1 and num2 are not equal
    

    Como você pode ver, num1 e num2 não são exatamente iguais devido à representação de ponto flutuante, embora matematicamente devessem ser. É aqui que o conceito de proximidade numérica se torna importante. Nas próximas etapas, exploraremos maneiras de lidar com essa situação.

Calcular a Diferença Absoluta

Nesta etapa, aprenderemos como calcular a diferença absoluta entre dois números. A diferença absoluta é a magnitude da diferença entre dois números, independentemente de sua ordem. Em outras palavras, é a diferença positiva entre dois números.

Podemos usar a função abs() em Python para calcular a diferença absoluta. A função abs() retorna o valor absoluto de um número.

Vamos modificar o script proximity.py da etapa anterior para calcular a diferença absoluta entre num1 e num2.

  1. Abra o arquivo proximity.py no diretório ~/project usando o editor VS Code.

  2. Modifique o código para calcular a diferença absoluta:

    ## proximity.py
    
    num1 = 0.1 + 0.2
    num2 = 0.3
    
    print(f"num1 is: {num1}")
    print(f"num2 is: {num2}")
    
    absolute_difference = abs(num1 - num2)
    print(f"The absolute difference between num1 and num2 is: {absolute_difference}")
    
    if absolute_difference < 0.00001:  ## Using a small tolerance
        print("num1 and num2 are approximately equal")
    else:
        print("num1 and num2 are not approximately equal")
    

    Neste código, calculamos a diferença absoluta entre num1 e num2 usando a função abs(). Em seguida, comparamos a diferença absoluta com um pequeno valor de tolerância (0.00001 neste caso). Se a diferença absoluta for menor que a tolerância, consideramos que os números são aproximadamente iguais.

  3. Salve o arquivo e execute-o usando o seguinte comando no terminal:

    python ~/project/proximity.py
    

    Você deve ver uma saída semelhante a esta:

    num1 is: 0.30000000000000004
    num2 is: 0.3
    The absolute difference between num1 and num2 is: 4.440892098500626e-17
    num1 and num2 are approximately equal
    

    Agora, o script identifica corretamente que num1 e num2 são aproximadamente iguais, considerando a diferença absoluta e um valor de tolerância. Essa abordagem é mais robusta do que comparar diretamente números de ponto flutuante quanto à igualdade.

Use math.isclose() para Floats

Nesta etapa, aprenderemos como usar a função math.isclose() para comparar números de ponto flutuante quanto à igualdade aproximada. A função math.isclose() é uma maneira mais robusta e recomendada de comparar números de ponto flutuante do que usar uma tolerância fixa.

A função math.isclose() recebe dois números como entrada e retorna True se eles estiverem próximos um do outro dentro de uma tolerância especificada, e False caso contrário. Ela fornece dois parâmetros de tolerância: rel_tol (tolerância relativa) e abs_tol (tolerância absoluta).

Vamos modificar o script proximity.py da etapa anterior para usar a função math.isclose().

  1. Abra o arquivo proximity.py no diretório ~/project usando o editor VS Code.

  2. Modifique o código para usar math.isclose():

    ## proximity.py
    
    import math
    
    num1 = 0.1 + 0.2
    num2 = 0.3
    
    print(f"num1 is: {num1}")
    print(f"num2 is: {num2}")
    
    if math.isclose(num1, num2):
        print("num1 and num2 are approximately equal")
    else:
        print("num1 and num2 are not approximately equal")
    

    Neste código, importamos o módulo math e usamos a função math.isclose() para comparar num1 e num2. Usamos os valores padrão para rel_tol e abs_tol, que são adequados para a maioria dos casos.

  3. Salve o arquivo e execute-o usando o seguinte comando no terminal:

    python ~/project/proximity.py
    

    Você deve ver uma saída semelhante a esta:

    num1 is: 0.30000000000000004
    num2 is: 0.3
    num1 and num2 are approximately equal
    

    O script agora identifica corretamente que num1 e num2 são aproximadamente iguais usando a função math.isclose(). Esta é a maneira recomendada de comparar números de ponto flutuante quanto à igualdade aproximada em Python.

Resumo

Neste laboratório, começamos explorando o conceito de proximidade numérica e sua importância ao comparar números de ponto flutuante em Python. Devido à forma como os computadores representam esses números, as comparações diretas de igualdade podem ser pouco confiáveis. Criamos um script proximity.py para demonstrar esse problema, onde 0.1 + 0.2 foi comparado a 0.3, revelando que eles não são exatamente iguais devido à representação de ponto flutuante.

O laboratório então introduziu a necessidade de métodos alternativos para determinar se dois números são "suficientemente próximos" para serem considerados iguais, preparando o terreno para explorar técnicas como o cálculo da diferença absoluta em etapas subsequentes (conteúdo truncado).