Lidar com a Precisão de Ponto Flutuante
Nesta etapa, discutiremos como lidar com a precisão de ponto flutuante ao comparar números de ponto flutuante com zero. Devido à forma como os números de ponto flutuante são representados em computadores, eles são frequentemente sujeitos a pequenos erros de arredondamento. Isso pode levar a resultados inesperados ao compará-los diretamente com zero.
Por exemplo, um cálculo que teoricamente deveria resultar em zero pode, na verdade, produzir um número muito pequeno diferente de zero, como 1e-16 (0.0000000000000001). Comparar diretamente este número com zero usando == retornará False, o que pode não ser o resultado desejado.
Para lidar com isso, normalmente usamos um valor de tolerância (também conhecido como épsilon) para verificar se um número de ponto flutuante está "suficientemente próximo" de zero.
Vamos criar um script Python para demonstrar isso.
-
Abra o editor VS Code no ambiente LabEx.
-
Crie um novo arquivo chamado float_precision.py no diretório ~/project.
~/project/float_precision.py
-
Adicione o seguinte código a float_precision.py:
## Importando o módulo math
import math
## Definindo um valor de tolerância (épsilon)
tolerance = 1e-9 ## Um valor pequeno como 0.000000001
## Um número de ponto flutuante que está muito próximo de zero devido ao cálculo
number = 1e-10
## Comparação direta com zero (pode falhar)
if number == 0:
print("Comparação direta: número é zero")
else:
print("Comparação direta: número não é zero")
## Usando a tolerância para comparar com zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparação com tolerância: número está próximo de zero")
else:
print("Comparação com tolerância: número não está próximo de zero")
## Outro exemplo com um número ligeiramente maior
number = 1e-7
## Comparação direta com zero (falhará)
if number == 0:
print("Comparação direta: número é zero")
else:
print("Comparação direta: número não é zero")
## Usando a tolerância para comparar com zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparação com tolerância: número está próximo de zero")
else:
print("Comparação com tolerância: número não está próximo de zero")
Este script demonstra como usar a função math.isclose() com um valor de tolerância para comparar números de ponto flutuante com zero.
-
Salve o arquivo.
-
Execute o script usando o comando python no terminal:
python float_precision.py
Você deve ver a seguinte saída:
Comparação direta: número não é zero
Comparação com tolerância: número está próximo de zero
Comparação direta: número não é zero
Comparação com tolerância: número não está próximo de zero
Como você pode ver, a comparação direta falha porque o número não é exatamente zero. No entanto, ao usar um valor de tolerância com math.isclose(), a comparação identifica corretamente que o número está próximo de zero.
A função math.isclose() verifica se dois valores de ponto flutuante estão próximos um do outro dentro de uma tolerância especificada. O argumento abs_tol especifica a tolerância absoluta. Se a diferença absoluta entre os dois números for menor ou igual à tolerância, a função retorna True.
Ao usar um valor de tolerância, você pode evitar problemas causados pela precisão de ponto flutuante e garantir que suas comparações com zero sejam precisas e confiáveis.