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
q=0.1 * 0.2 / 0.2 Calcula q
d=1-(10 * q) Calcula d
x= sqrt (d) Calcula raíz quadrada de d
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 x=0 como resposta.

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 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.
  1. Primeiro, 0.1 approx 0.1000000000000000055511151231ldots não é representado exatamente em binário; na prática, ele vira algo como
0.1 * 0.2 approx 0.020000000000000004
  1. Quando multiplicamos por q approx 0.0200000000000000040.2 approx 0.10000000000000002 , outro valor não exato, obtemos
q = 0.10000000000000002
  1. Dividindo isso por (≈ 0.2000000000000000111…), a conta fica
Logo, embora matematicamente fosse , em ponto-flutuante ele acaba sendo

Passo 3

Agora calculamos
d = 1 - 10 times q
Substituindo o 10 times 0.10000000000000002 = 1.0000000000000002 aproximado:
d = 1 - 1.0000000000000002 = -0.000000000000000222044604925031308084
Ou seja, não é zero, e sim um número negativo bem pequenininho (em torno de ).

Passo 4

A função sqrt(d) só aceita . Como nosso ficou ligeramente negativo, o Python dispara
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.

Exercícios relacionados