Introdução
Neste laboratório, você aprenderá como verificar se um número de ponto flutuante (float) não possui parte decimal em Python, abordando os desafios colocados pela representação de ponto flutuante. O laboratório começa explorando a imprecisão inerente dos números de ponto flutuante e seu impacto em comparações diretas. Você criará um script Python para observar como cálculos aparentemente simples como 0.1 + 0.2 podem resultar em valores ligeiramente diferentes do esperado, levando a resultados de comparação inesperados.
O laboratório então o guia por dois métodos para determinar se um float efetivamente representa um inteiro: usando o método is_integer() e comparando o float à sua conversão para inteiro. Essas técnicas fornecem soluções práticas para identificar com precisão floats sem um componente decimal, apesar das limitações da representação subjacente.
Explorar a Representação de Ponto Flutuante
Nesta etapa, você explorará como os números de ponto flutuante (floating-point numbers) são representados em Python e as potenciais implicações que essa representação pode ter em comparações numéricas. Números de ponto flutuante são usados para representar números reais (números com casas decimais) em computadores. No entanto, devido à maneira como são armazenados na memória, eles são frequentemente aproximações dos números reais reais. Isso pode levar a resultados inesperados ao realizar comparações.
Vamos começar criando um arquivo Python chamado float_representation.py em seu diretório ~/project usando o editor VS Code.
## Create a floating-point number
x = 0.1 + 0.2
## Print the value of x
print(x)
Salve o arquivo e, em seguida, execute-o usando o seguinte comando no terminal:
python float_representation.py
Você pode esperar que a saída seja 0.3, mas provavelmente verá algo como isto:
0.30000000000000004
Isso ocorre porque 0.1 e 0.2 não podem ser representados exatamente como números de ponto flutuante. O resultado da adição é um número que está muito próximo de 0.3, mas não exatamente igual a ele.
Agora, vamos ver como essa imprecisão pode afetar as comparações. Adicione o seguinte código ao seu arquivo float_representation.py:
## Create a floating-point number
x = 0.1 + 0.2
## Check if x is equal to 0.3
if x == 0.3:
print("x is equal to 0.3")
else:
print("x is not equal to 0.3")
Salve o arquivo e execute-o novamente:
python float_representation.py
Você provavelmente verá a seguinte saída:
x is not equal to 0.3
Isso ocorre porque x não é exatamente igual a 0.3 devido ao problema de representação de ponto flutuante.
Para comparar números de ponto flutuante com precisão, você deve usar um valor de tolerância. Em vez de verificar a igualdade exata, verifique se a diferença absoluta entre os dois números é menor que um pequeno valor de tolerância.
Modifique seu arquivo float_representation.py para incluir uma tolerância:
## Create a floating-point number
x = 0.1 + 0.2
## Define a tolerance value
tolerance = 1e-9 ## A small value like 0.000000001
## Check if x is approximately equal to 0.3
if abs(x - 0.3) < tolerance:
print("x is approximately equal to 0.3")
else:
print("x is not approximately equal to 0.3")
Salve o arquivo e execute-o mais uma vez:
python float_representation.py
Agora, você deve ver a seguinte saída:
x is approximately equal to 0.3
Ao usar uma tolerância, você pode comparar com precisão números de ponto flutuante, apesar da imprecisão inerente em sua representação. Este é um conceito crucial para entender ao trabalhar com números de ponto flutuante em Python e outras linguagens de programação.
Usar o Método is_integer()
Nesta etapa, você aprenderá como usar o método is_integer() para verificar se um número de ponto flutuante representa um valor inteiro. O método is_integer() é um método embutido para objetos float em Python que retorna True se o número de ponto flutuante tiver um valor inteiro (ou seja, a parte decimal é zero) e False caso contrário.
Vamos criar um novo arquivo Python chamado is_integer_example.py em seu diretório ~/project usando o editor VS Code.
## Example 1: Integer value
x = 5.0
print(x.is_integer())
## Example 2: Non-integer value
y = 3.14
print(y.is_integer())
## Example 3: Another integer value
z = -2.0
print(z.is_integer())
Salve o arquivo e execute-o usando o seguinte comando no terminal:
python is_integer_example.py
Você deve ver a seguinte saída:
True
False
True
Como você pode ver, is_integer() retorna True para 5.0 e -2.0 porque eles representam valores inteiros, e False para 3.14 porque ele tem uma parte decimal.
Agora, vamos considerar o problema de representação de ponto flutuante que discutimos na etapa anterior. Às vezes, um número que deveria ser um inteiro pode não ser representado exatamente devido à imprecisão de ponto flutuante.
Modifique seu arquivo is_integer_example.py para incluir o seguinte código:
## Example 4: Floating-point imprecision
a = 0.1 + 0.2
print(a)
print(a.is_integer())
Salve o arquivo e execute-o novamente:
python is_integer_example.py
Você provavelmente verá a seguinte saída:
0.30000000000000004
False
Embora 0.1 + 0.2 seja matematicamente igual a 0.3, a representação de ponto flutuante o torna ligeiramente diferente, então is_integer() retorna False.
Para lidar com esses casos, você pode combinar is_integer() com uma verificação de tolerância, como aprendemos na etapa anterior. No entanto, neste caso, estamos verificando se um número representa um inteiro, não se ele é igual a um valor específico.
Em resumo, o método is_integer() é uma ferramenta útil para determinar se um número de ponto flutuante representa um valor inteiro. No entanto, esteja ciente do impacto potencial da imprecisão de ponto flutuante e considere suas implicações ao usar este método.
Comparar com a Conversão int()
Nesta etapa, você explorará outra maneira de verificar se um número de ponto flutuante representa um valor inteiro: comparando-o com sua conversão para inteiro usando a função int(). A função int() trunca a parte decimal de um número de ponto flutuante, efetivamente convertendo-o para o inteiro mais próximo em direção a zero.
Vamos criar um novo arquivo Python chamado int_conversion.py em seu diretório ~/project usando o editor VS Code.
## Example 1: Integer value
x = 5.0
if x == int(x):
print("x is an integer")
else:
print("x is not an integer")
## Example 2: Non-integer value
y = 3.14
if y == int(y):
print("y is an integer")
else:
print("y is not an integer")
## Example 3: Another integer value
z = -2.0
if z == int(z):
print("z is an integer")
else:
print("z is not an integer")
Salve o arquivo e execute-o usando o seguinte comando no terminal:
python int_conversion.py
Você deve ver a seguinte saída:
x is an integer
y is not an integer
z is an integer
Essa abordagem funciona porque, se um número de ponto flutuante já representa um inteiro, convertê-lo para um inteiro usando int() não alterará seu valor. Se o número de ponto flutuante tiver uma parte decimal, a função int() a truncará, resultando em um valor diferente.
Agora, vamos considerar o problema de representação de ponto flutuante novamente. Modifique seu arquivo int_conversion.py para incluir o seguinte código:
## Example 4: Floating-point imprecision
a = 0.1 + 0.2
print(a)
if a == int(a):
print("a is an integer")
else:
print("a is not an integer")
Salve o arquivo e execute-o novamente:
python int_conversion.py
Você provavelmente verá a seguinte saída:
0.30000000000000004
a is not an integer
Como na etapa anterior, a imprecisão de ponto flutuante faz com que a seja ligeiramente diferente de 0.3 e, portanto, não seja igual à sua conversão para inteiro (que seria 0).
É importante notar que usar a conversão int() para verificar a representação de inteiros pode ser menos preciso do que usar is_integer(). is_integer() verifica se o número de ponto flutuante representa um valor inteiro, enquanto a comparação com int() verifica se o número de ponto flutuante é igual ao seu truncamento inteiro.
Em resumo, comparar um número de ponto flutuante com sua conversão para inteiro usando int() é outra maneira de verificar se ele representa um valor inteiro. No entanto, esteja ciente do impacto potencial da imprecisão de ponto flutuante e considere usar is_integer() para obter resultados mais precisos.
Resumo
Neste laboratório, você explorou as complexidades da representação de ponto flutuante em Python e seu impacto nas comparações numéricas. Você aprendeu que os números de ponto flutuante são frequentemente aproximações de números reais devido ao seu armazenamento na memória, levando a potenciais imprecisões ao realizar verificações diretas de igualdade.
Você observou que a adição de 0.1 e 0.2 pode não resultar exatamente em 0.3 e que a comparação direta usando == pode produzir resultados inesperados. O laboratório destacou a importância de entender essas limitações e a necessidade de métodos de comparação alternativos, como o uso de valores de tolerância, para avaliar com precisão a igualdade de números de ponto flutuante.



