O código a seguir foi implementado na linguagem Python 3, onde todas as variáveis/números estão representados em precisão dupla:
Linhas de código | Para que serve |
---|---|
from math import sqrt | Permite utilizar o comando sqrt posteriormente |
|
Calcula
|
|
Calcula d |
|
Calcula raíz quadrada de
|
print(x) | Imprime na tela o valor de x |
Ao executá-lo, não houve resultado impresso na tela, e sim a mensagem a seguir
ValueError: math domain error
Explique detalhadamente porque não foi encontrado como resposta.
ValueError: math domain error
Explique detalhadamente porque não foi encontrado
Passo 1
Beleza, então o enunciado diz que a gente tem um código Python assim (com ponto-flutuante de precisão dupla) que faz:
from math import sqrt
q = 0.1 * 0.2 / 0.2
d = 1 - (10 * q)
x = sqrt(d)
print(x)
Em vez de imprimir
Para resolver, vamos precisar entender como números decimais ficam “um pouquinho” diferentes em binário e como isso faz
0
, o Python reclama ValueError: math domain error
. Isso é material de aritmética de ponto-flutuante (erros de representação em binário) e de domínio da função raiz quadrada.Para resolver, vamos precisar entender como números decimais ficam “um pouquinho” diferentes em binário e como isso faz
d
ficar ligeiramente negativo.Passo 2
Calcular
q = 0.1 * 0.2 / 0.2
em ponto-flutuante.- Primeiro,
não é representado exatamente em binário; na prática, ele vira algo como
- Quando multiplicamos por
, outro valor não exato, obtemos
- Dividindo isso por
(≈ 0.2000000000000000111…), a conta fica
Logo, embora matematicamente
fosse
, em ponto-flutuante ele acaba sendo
Passo 3
Agora calculamos
Substituindo o
aproximado:
Ou seja,
não é zero, e sim um número negativo bem pequenininho (em torno de
).
Passo 4
A função . Como nosso
ficou ligeramente negativo, o Python dispara
sqrt(d)
só aceita
ValueError: math domain error
porque a raiz quadrada de número negativo não está definida nos Reais.
Resposta
Não apareceu
porque, por causa da imprecisão da representação em ponto-flutuante, o valor interno de
virou um número negativo muito pequeno em vez de exatamente zero. Aí
sqrt(d)
reclama de domínio e não retorna 0.