Perda de significância

Origem: Wikipédia, a enciclopédia livre.

Perda de Significância é um efeito indesejado em cálculos utilizando aritmética de ponto flutuante. Ele acontece quando uma operação entre dois números representados em aritmética de ponto flutuante provoca um aumento no erro relativo, por exemplo, subtrair dois números aproximadamente iguais (conhecido como cancelamento catastrófico). O efeito reduz o número de dígitos de significância do resultado. Maneiras de evitar este efeito são estudadas em Análise Numérica.

Demonstração do problema[editar | editar código-fonte]

O efeito pode ser demonstrado com números decimais. O exemplo a seguir demonstra perda de significância para um número decimal com ponto flutuante com 10 dígitos de significância:

Considere o número decimal:

   0.1234567891234567890

Uma representação de ponto flutuante deste número em um máquina que mantém 10 dígitos de ponto flutuante seria:

   0.1234567891

Que é relativamente similar – a diferença é muito pequena em comparação com qualquer um dos números.

Agora calcule:

   0.1234567891234567890 − 0.1234567890

A resposta, aproximada em 10 dígitos é:

   0.0000000001234567890

Todavia, em uma máquina com 10 dígitos de ponto flutuante, o cálculo resulta em:

   0.1234567891 − 0.1234567890 = 0.0000000001

Mesmo que os números originais sejam precisos em todos os primeiros 10 dígitos de significância, sua diferença em ponto flutuante é apenas precisa em seu primeiro dígito diferente de zero. Isto resulta em perda de significância.

Soluções alternativas[editar | editar código-fonte]

É possível fazer cálculos usando uma representação fracionária de números racionais e manter todos os dígitos de significância, mas isto é frequentemente mais demorado do que aritmética de ponto flutuante. Além do que, é mais comum que o problema seja apenas adiado: E se a informação for apenas disponível em dez dígitos? O mesmo efeito irá ocorrer.

Uma das partes mais importantes de análise numérica é evitar, ou minimizar, a perda de significância em cálculos. Se o problema subjacente é bem posto, deveríamos encontrar um algoritmo estável ao resolvê-lo. A arte é achá-lo.

Perda de significância em bits[editar | editar código-fonte]

Sendo x e y números de ponto flutuante,positivos e normalizados.

Na subtração x – y , r bits significantes são perdidos onde:

para p e q positivos e inteiros.

Instabilidade em equações quadráticas[editar | editar código-fonte]

Por exemplo, considere a equação quadrática:

,

com duas soluções exatas:

Esta fórmula pode nem sempre produzir um resultado preciso. Por exemplo, quando c é muito pequeno, a perda de significância pode ocorrer em no cálculo de ambas as raízes, dependendo do sinal de b.

O caso: , , servirá para ilustrar o problema:

Nos teremos:

Em Aritmética real, as raízes são:

Em aritmética de ponto flutuante com 10 dígitos:

Perceba que a solução de maior magnitude é precisa em 10 dígitos, mas o primeiro dígito da solução de menor magnitude está errado.

Por causa da subtração na equação quadrática, isto não constitui um algoritmo estável para calcular duas raízes.

Um algoritmo melhor[editar | editar código-fonte]

Um algoritmo melhor para resolver equações quadráticas é baseado em duas observações: que uma solução é sempre mais precisa quando a outra não é, e que dada uma solução quadrática, a outra é facilmente achada.

Se:

e

Então temos a identidade (uma das fórmulas de Viète para um polinomial de segundo grau)

.

As fórmulas acima (1) e (2) funcionam perfeitamente para uma equação quadrática cujo coeficiente ‘b’ é negativo (b<0). Se ‘b’ é negativo, então ‘-b’ na fórmula é um valor positivo, uma vês que -(-b) é igual a ‘b’. Por isso, nos podemos evitar subtrações e as perdas de dígitos de significância causadas por elas. Mas se o coeficiente ‘b’ é positivo, então nos precisaremos utilizar ou conjunto diferente de fórmulas. O segundo conjunto de fórmulas que é válido para encontrarmos raízes quando o coeficiente ‘b’ é positivo são:


e

Nas fórmulas (3)e (4), quando ‘b’ é positivo, a fórmula converte-se em valores negativos, uma vez que –(+b) é igual a –b. Agora, como indicam as fórmulas, (-b) é subtraído pela raiz quadrada de (b*b – 4*a*c), Então isto é basicamente uma operação de adição. Em nosso exemplo, o coeficiente ‘b’ da equação quadrática é positivo. Por isso, precisamos usar uma segunda fórmula i.e. formula (3) e (4).

O algoritmo é como se segue. Utilize a fórmula quadrática para achar a solução de maior magnitude, que não sofre com perda de precisão. Então use sua identidade para calcular a segunda raiz. Uma vês que nenhuma subtração é envolvida, não ocorre perda de precisão.

Aplicando este algoritmo em nosso problema, e usando aritmética de ponto flutuante de 10 dígitos, a solução de maior magnitude, como antes, é A outra solução é portanto:

Que é preciso. Todavia, permanece mais uma possível fonte de cancelamentos quando calculamos e de fato isto pode levar a perda de metade das figuras de significância: para corrigir isto, deve ser calculado com precisão duas vezes maior do que a precisão do resultado final [1] (veja equação quadrática para mais detalhes).

Ver também[editar | editar código-fonte]

Referências[editar | editar código-fonte]

  1. Higham, Nicholas (2002). Accuracy and Stability of Numerical Algorithms (2 ed). [S.l.]: SIAM. 10 páginas