Perda de dígitos (I)
O perigo de subtrair números próximos
Vamos lá?
Assim, como não basta comer bem para ter boa saúde, não basta ter um computador bem preciso para ter resultados de boa qualidade. Nesta aula vamos ver um exemplo disso.
- 1
- 2
- 3
Se todas as contas são super bem feitas, o resultado final será aceitável?
Sempre que possível, devemos...?
A mensagem desta aula é que para ter bons resultados não basta ter alta precisão, ou seja, não basta garantir que o erro relativo em todas as operações aritméticas seja pequeno em comparação com a unidade de arredondamento. Mesmo que isoladamente cada operação seja bem feita, o resultado final pode ser desastroso .
No exemplo do vídeo foi utilizado o sistema de ponto flutuante $\mathbb{F}(10,5,-9,9),$ capaz de armazenar apenas 5 dígitos significativos. A intenção era calcular $x = 49213 + 31.728 − 49244 = 0.728.$ Como a conta foi feita na ordem apresentada, a primeira operação foi $\fl( 49213 + 31.728) = 49245.$ Essa soma produziu um resultado numérico com erro relativo de $5.5\cdot 10^{-6}.$ Isso é bom? Depende da unidade de arredondamento.
No sistema de ponto flutuante do exemplo, como apenas 5 dígitos significativos podem ser representados, a unidade de arredondamento é $u=5\cdot 10^{-5},$ pois $\fl(1+5\cdot 10^{-5}) = \fl (1.00005) = 1.0001,$ portanto ainda maior que $1$ (se ficou com dúvida, volte à aula anterior onde isso é explicado com detalhes).
Portanto, o erro relativo de $5.5\cdot 10^{-6}$ é menor que $u,$ o que significa que sim, aquela primeira soma foi bem feita, dentro das limitações do sistema de ponto flutuante. Claro que perdemos precisão! Os três últimos dígitos (os menos significativos) foram perdidos, mas eles não importam muito para esse resultado parcial.
A segunda operação, $49245 - 49244,$ teve seu resultado exato computado. Acontece que como nessa subtração as duas parcelas são números muito próximos, a maioria dos dígitos significativos foi cancelada. Em precisão infinita isso significaria que dígitos menos importante, até esse momento, tornar-se-iam importantes. O problema é que eles já foram perdidos na conta anterior. Isso levou ao erro relativo final de $0.374,$ muitas ordens de magnitude acima da unidade de arredondamento.
Chamar esse fenômeno de um erro de cancelamento, colocando toda culpa na subtração final não parece justo. A causa do péssimo resultado final foi a perda de dígitos na adição. A subtração apenas transformou essa perda de dígitos em um problema de fato. Seria mais justo dizer dizer que subtrair números próximos é perigoso, pois pode evidenciar uma perda de dígitos significativos que eventualmente tenha acontecido antes.
O que aconteceria se tivéssemos reordenados as operações? Por exemplo, se $x$ fosse computado como $x=49213 − 49244 + 31.728$? A primeira subtração será computada de forma exata, resultando em $-31.$ Depois disso, a soma final também seria computada corretamente, produzindo o resultado final exato. A conclusão é que devemos observar a conta desejada e organizar as operações para evitar a perda de dígitos? Seria ótimo se isso fosse possível em geral, mas esse não é o caso. Em programas de computadores na maioria das vezes não é possível prever quais serão os números operados e, portanto, não é possível prever qual a ordem ótima para realizar as operações.
Para encerrar, deixo uma pergunta para refletir. Se a conta que se quer fazer não tem nenhuma subtração, mas apenas somas de números positivos, então será que estamos livres do problema de perda de dígitos significativos? A resposta fica para a próxima aula.
Para os exercícios abaixo, considere o SPF $\mathbb{F}(10,5,-99,99).$
1. Determine o resultado das operações abaixo e o erro relativo cada operação e no resultado final, quando realizada no sistema de ponto flutuante.
- $24135 + 41.439 - 24174.$
- $24135 - 24174 + 41.439.$
(a) O resultado intermediário é $24176,$ com erro relativo $1.8\cdot 10^{-5}$ e o resultado final é $24174$ com erro relativo zero nessa última operação. O erro relativo em relação ao resultado final e o ersultado correto da conta completa é $1.8\cdot 10^{-1}.$ (b) O resultao intermediário é $-39,$ com erro relativo zero e o resultado final é $2.4390$ com erro relativo também zero.
2. Seja $x = a+b-c.$ Para os valores abaixo, compute $\fl(a+b-c)$ e $\fl(b-c+a).$ Compute também os erros relativos.
- $a = 6.8271,$ $b=87211$, $c=87217$
- $a = 25112,$ $b=-25120$, $c=-8.2713$
Existe uma ordem a priori na qual o cálculo de $\fl(x)$ sofre menos os efeitos da perda de dígitos significativos?
(a) $\fl(a+b-c) = 1$ com erro relativo de $2\cdot 10^{-1}$ e $\fl(b-c+a) = 0.8271$ com o mesmo erro relativo de zero. (b) $\fl(a+b-c) = 0.2713$ com erro relativo zero e $\fl(b-c+a) = 0$ com erro relativo de $1.$