Considere a subtração 1,000-0,999 na máquina M(2,4,-3,3).
Compare com o valor exato e explique o resultado obtido em termos de perda de significância.

Passo 1

O enunciado pede que se considere a subtração 1{,}000-0{,}999 feita na máquina M(2,4,-3,3), que tem:
  • base \beta=2;
  • precisão t=4 dígitos na mantissa (ou seja, 4 dígitos binários significativos, o primeiro sempre 1 em representação normalizada);
  • expoentes permitidos e\in\{-3,\ldots,3\}.
O que é pedido:
  • comparar o resultado obtido na máquina com o valor exato da subtração;
  • explicar o resultado em termos de perda de significância (por que o resultado da máquina difere do exato e o que aconteceu durante a operação).
Todas as informações relevantes do enunciado já estão listadas acima (não há figura nem dados adicionais).

Passo 2

Entendendo como os números são armazenados em M(2,4,-3,3).
Formato normalizado de um número não nulo nesta máquina:
x = \pm d_0.d_1 d_2 d_3 \times 2^{e},
onde cada d_i\in\{0,1\}, d_0=1 (normalização), e e está entre -3 e 3. Aqui t=4 significa exatamente quatro dígitos binários na significand a contar do d_0.
Tamanho do incremento (espacamento) entre números representáveis com um dado expoente e:
  • alterar o último dígito d_3 muda a mantissa em 2^{-3}, logo altera o valor absoluto em
\Delta = 2^{e}\cdot 2^{-3} = 2^{\,e-3}.
Exemplos úteis:
  • para e=0 (região em volta de 1) o espaçamento é \Delta=2^{-3}= \tfrac{1}{8}=0{,}125;
  • para e=-1 (região entre 0{,}5 e 1) o espaçamento é \Delta=2^{-4}=\tfrac{1}{16}=0{,}0625.
Também: a maior representação menor que 1 ocorre com mantissa 1.111_2 (todos os dígitos possíveis iguais a 1); isso vale
1{,}111_2 \times 2^{-1} = \left(1+\tfrac{7}{8}\right)\cdot 2^{-1} = \tfrac{15}{8}\cdot \tfrac{1}{2} = \tfrac{15}{16}=0{,}9375.
E o menor representável com expoente 0 é 1{,}000_2\times 2^{0}=1{,}0. Assim, há um “buraco” entre 0{,}9375 e 1{,}0 (nenhum número representável com esses parâmetros cai estritamente entre esses dois valores).

Passo 3

Representação de 1{,}000 e 0{,}999 na máquina (arredondando para o representável mais próximo — arredondamento para o mais próximo é o modo padrão que vamos assumir).
  • 1{,}000 (decimal) é exatamente representável: em binário é 1{,}0 e, em notação normalizada com t=4,
\operatorname{fl}(1{,}000)=1{,}000_2\times 2^{0}=1{,}0.
  • Para 0{,}999 precisamos ver qual representável mais próximo ela tem. Observações:
    • o maior representável menor que 1 com e=-1 e t=4 é 0{,}9375 (como calculei acima);
    • o menor representável maior ou igual a 1 é 1{,}0.
    • Distâncias:
    |0{,}999-1{,}0| = 0{,}001, \qquad |0{,}999-0{,}9375| = 0{,}0615.Portanto, 0{,}999 está estritamente entre 0{,}9375 e 1{,}0 e é muito mais próxima de 1{,}0. Assim, com arredondamento à vizinha mais próxima: \operatorname{fl}(0{,}999)=1{,}0.
(Se em vez de arredondamento se usasse truncamento/chopping, então \operatorname{fl}_{\text{chop}}(0{,}999)=0{,}9375. Vou comentar esse caso mais abaixo.)

Passo 4

Fazer a subtração na máquina (modo arredondamento para o mais próximo):
Na máquina os operandos ficam:
\operatorname{fl}(1{,}000)=1{,}0,\qquad \operatorname{fl}(0{,}999)=1{,}0.
Logo a operação na máquina dá
\operatorname{fl}(1{,}000-0{,}999)=\operatorname{fl}\big(\operatorname{fl}(1{,}000)-\operatorname{fl}(0{,}999)\big)=\operatorname{fl}(1{,}0-1{,}0)=\operatorname{fl}(0)=0{,}0.
Comparação com o valor exato:
  • Valor exato da subtração: 1{,}000-0{,}999=0{,}001.
  • Resultado na máquina (arredondamento): 0{,}0.
  • Erro absoluto: |0{,}0-0{,}001|=0{,}001.
  • Erro relativo em relação ao valor exato: \dfrac{0{,}001}{0{,}001}=1 (ou seja, 100\% de erro).

Passo 5

Interpretação em termos de perda de significância (cancelamento catastrófico), explicado didaticamente.
O que aconteceu, em linguagem simples:
  • Os dois números 1{,}000 e 0{,}999 são muito próximos. Na representação da máquina com apenas 4 bits significativos muitos dos dígitos menos significativos de 0{,}999 não cabem; após arredondar, 0{,}999 passou a ser exatamente igual a 1{,}0.
  • Ao subtrair duas representações idênticas ( 1{,}0-1{,}0) todas as cifras significativas “se cancelam” e o resultado perde completamente as casas onde estava a informação relevante (a diferença real 0{,}001 estava nas casas muito menos significativas do operando, as quais já tinham sido eliminadas pela representação).
  • Essa perda de informação durante a subtração é chamada de perda de significância ou cancelamento catastrófico: quando se subtraem números próximos, o número de dígitos significativos no resultado pode ser muito menor do que nos operandos, e erros de representação nos operandos ficam amplificados no resultado relativo.
Comentário sobre truncamento (para ver que o problema não é só “arredondar para 1”):
  • Se em vez de arredondar a máquina apenas truncasse a mantissa de 0{,}999 aos 4 dígitos (chopping), então \operatorname{fl}_{\text{chop}}(0{,}999)=0{,}9375 e a subtração daria
1{,}0-0{,}9375=0{,}0625,
que também está muito longe do exato 0{,}001. Portanto, tanto com arredondamento quanto com truncamento a subtração perde precision: no primeiro caso o resultado vira 0 (erro absoluto 0{,}001), no segundo caso o resultado é 0{,}0625 (erro absoluto 0{,}0615). Ambos os casos ilustram perda de significância.

Passo 6

Como evitar, na prática (dica breve para prova e cálculo numérico)
  • Sempre que possível, evitar subtrair dois números muito próximos; reescrever fórmulas algébricas para evitar cancelamento (ex.: usar identidades algébricas, fatorações, ou séries alternadas).
  • Usar maior precisão (aumentar t) quando operações com diferenças pequenas forem necessárias.
  • Atenção a operações intermediárias: mesmo que o resultado final precise de pouco dígito, operações intermediárias com cancelamento podem destruir a precisão.

Resposta

\operatorname{fl}(1{,}000-0{,}999)=0{,}0 (arredondamento para a vizinha mais próxima)
Valor exato: 0{,}001
Causa: perda de significância (cancelamento catastrófico) — 0{,}999 é arredondado para 1{,}0 na máquina M(2,4,-3,3), e a subtração de iguais produz zero.

Exercícios relacionados