Evitando erros de ponto flutuante em Python
No reino da programação, é essencial entender as complexidades dos cálculos de ponto flutuante, pois eles podem introduzir erros inesperados se não forem tratados adequadamente. Este artigo explora um exemplo prático que destaca as armadilhas da aritmética de ponto flutuante.
O problema da raiz quadrada
Considere uma função Python projetada para aproximar raízes quadradas:
def sqrt(num):
root = 0.0
while root * root Usando esta função, encontramos resultados surpreendentes:
>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998
A aritmética de ponto flutuante explica essas imprecisões. Ao representar números fracionários, os computadores os armazenam como uma combinação de número inteiro e expoente. Devido às limitações nesta representação, certos valores decimais não podem ser representados com exatidão, levando a aproximações.
Compreendendo o erro
No código acima, o problema está no incremento usado para aumentar o valor raiz. Embora pretendamos adicionar um valor de 0,01, o valor real armazenado no registro de ponto flutuante é ligeiramente diferente e maior que 0,01.
Endereçando o erro
Para evitar erros de ponto flutuante, várias abordagens podem ser empregadas:
- Usando o Módulo Decimal:
O O módulo decimal em Python fornece aritmética decimal mais precisa. Ao substituir float por Decimal no código, obtemos resultados mais precisos:
from decimal import Decimal as D
def sqrt(num):
root = D(0)
while root * root
Now, the function returns precise results, such as:
```
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
```
- Usando incrementos de ponto não flutuante:
Se usar o módulo Decimal não for uma opção, outra abordagem é usar valores de ponto flutuante que sejam exatamente representáveis em binário, como 1/2**J. Isso envolve código mais complexo, mas garante incrementos precisos. - Empregamento de técnicas de análise numérica:
A análise numérica oferece métodos especializados para lidar com cálculos matemáticos complexos. Técnicas como o método de Newton podem fornecer aproximações precisas de raiz quadrada.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3