Cancelamento catastrófico

Cancelamento Catastrófico (ou perda de significância ou ainda cancelamento subtrativo[1][2]) é um efeito que ocorre em operações envolvendo aritmética de ponto flutuante, sendo caracterizado por um aumento substancial do erro relativo nos resultados destas. O exemplo característico deste tipo de erro é quando há a subtração de dois números muito próximos.

Gráfico de ((1+x)-1)/x calculado em sistema de numeração do tipo 'double'. Idealmente o resultado seria 1, o gráfico mostra o efeito da perda de significância na operação (1+x) quando x é pequeno. Quando x se torna menor que o épsilon de máquina, a expressão se torna nula.

Apresentação do problema geral editar

Seja x = (a - b) e X = (a - b), onde a = a(1 + Δa) e b = b(1 + Δb), e os valores Δa e Δb tidos como erros relativos de arredondamentos por armazenamento ou computações prévias. A partir dos dados, pode-se chegar a seguinte expressão[3]:

 

Deste modo, o erro relativo é grande quando:

 

e ocorre quando tem-se o cancelamento catastrófico. Assim, só existe um cancelamento catastrófico quando existirem erros nos dados.

Exemplo editar

Considere os números racionais x e y com dez dígitos:

 
 

O resultado exato de sua subtração é dado por:

 

Se esta subtração for feita com apenas 5 dígitos na mantissa, os resultados obtidos serão:

 
 
 

O resultado desta operação de diferença em ponto flutuante é de:

 

Vemos que mesmo possuindo cinco dígitos, os últimos três dígitos não têm significância alguma. Calculando-se o erro relativo:

 

O erro gerado acima possui um valor maior que o esperado.[4] Este tipo de erro é denominado cancelamento catastrófico, e pode ser evitado em várias situações.

Outro exemplo editar

Seja a função dada por

 

cuja aproximação de Taylor é dada por:

 

Pelo critério de Leibniz[5] aplicado à série de taylor de f(x) dentro do intervalo -10-7≤ x ≤ 10-7, o valor de f(x) poderia ser aproximado por 0.5 com quatorze dígitos significativos. No entanto, o gráfico do resultado obtido usando uma precisão Double IEEE 754 é:

 
Cancelamento catastrófico 2

Para explicar tal fenômeno, consideremos   e uma precisão de 16 dígitos decimais, tem-se:

  •  
Valor de ponto flutuante mais próximo com resposta exata para 16 casas decimais
  •  
Estimação imprecisa da resposta exata (6,05 . 10 -17)
  •  
80% maior que a resposta exata (0,5)

Vemos que os 16 dígitos são insuficientes para aproximar o valor de f(x). A subtração em si é exata, mas produz resultado da ordem do erro de cos(x). Assim, a subtração supervalorizou a importância do erro anterior.

Porém, cabe ressaltar que na realidade o problema não está na subtração em si, mas no arredondamento anterior a ela. Logo, uma alteração na equação pode tornar o cálculo numericamente estável.

Por exemplo, se usarmos a identidade trigonométrica 1-cos(x)=2sen²(x/2) para reescrever f(x) na forma[3]:

 

e  , chega-se a   , que é o resultado que esperaríamos encontrar.

Teorema da perda de precisão[6] editar

Considere x e y números positivos, normalizados em ponto flutuante com representação binária, com x > y e

 
 

Então, no mínimo p e no máximo q dígitos binários são perdidos na subtração de x por y.[7]

Exemplo editar

Considere a expressão abaixo:

 

Espera-se que haja uma perda de significância para valores de x muito pequenos. Para solucionar esse problema, usa-se uma fórmula alternativa, escrevendo o seno em forma de série de Taylor:

 

Sendo assim, calculamos y por:

 

Tendo valores muito pequenos de x, podemos usar uma série truncada, pois os termos de alta ordem acabam sendo desprezíveis. Usando o teorema da perda de precisão, e estabelecendo que a perda seja de no máximo um bit binário (q=1) na subtração acima, tem-se:

 

Sendo sen(x) > 0, o valor de x calculado é:

  para q = 1

Por fim, a expressão x - sen(x) só pode ser utilizada para |x| ≥ 1,9. Naturalmente, o pior caso (o maior erro de arredondamento) ocorre em |x| = 1,9. Para outros valores de x, outra configuração deve ser utilizada para continuar evitando a perda de mais de um dígito binário. Todavia, faz-se necessário uma análise de erro de truncamento da série, para que este não seja elevado.

Cancelamento Catastrófico em avaliação de funções matemáticas editar

Inúmeras funções matemáticas são comumente avaliadas utilizando sub-rotinas específicas, onde pode ocorrer cancelamento catastrófico. Peguemos como exemplo a avaliação da função cosseno com x = 33278,21. Note que x possui 7 dígitos de precisão. O problema que ocorre na avaliação de cos(x) é devido às rotinas empregadas que usualmente utilizam um artifício denominado redução de ordem. Este consiste no uso das identidades trigonométricas:

 
 

Onde 0 ≤ x ≤ 2π, para simplificar os cálculos.

Calculando o argumento reduzido para x = 33278,21 utilizando 7 dígitos de precisão:

 

Assim, notamos que o resultado tem apenas 3 algarismos significativos. Ao calcularmos o cosseno:

 

Este resultado pode fazer-nos concluir erroneamente que o número acima contém sete dígitos significativos. No entanto, temos que no máximo três dígitos são significativos. A rotina empregada no cálculo do cosseno não sabe que o número inicial (2,46) só tinha três dígitos de precisão e por isso calcula como se fosse 2,460000 com todos os algarismos sendo significativos.

Caso das Equações de Segundo Grau editar

Seja a equação do segundo grau:

 

Para acharmos as raízes deste tipo de equação, utilizamos a fórmula de Bhaskara:  

Porém, para casos onde   , então  . Assim, ao tentarmos determinar a segunda raiz   , tem-se um cancelamento catastrófico, pois   não é exata e a subtração leva a uma supervalorização do erro.

A inexatidão no cálculo da segunda raiz pode ser atenuada se modificarmos a expressão de maneira a evitar a subtração dos dois valores muito próximos. Assim, evitamos o cancelamento catastrófico realizando o cancelamento na própria expressão, antes de realizarmos as operações[3]:

 
 
 
 

Sendo b > 0, a segunda raiz pode ser determinada por:  

Outra fonte comum de erro é quando  . Neste caso, no entanto, nenhum rearranjo algébrico pode evitar o problema. Uma alternativa para tentar melhorar a resposta é aumentar a precisão da solução.

Veja também editar

Ligações externas editar

Referências

  1. Cláudio, Dalcídio Moraes; Marins, Jussara Maria (1994). Cálculo Numérico Computacional. Teoria e Prática 2ª ed. São Paulo: Atlas. p. 43. ISBN 85-224-1043-7 
  2. Dorn, William S.; McCracken, Daniel D (1972). Cálculo Numérico com Estudos de Casos em Fortran IV. Rio de Janeiro: Campus/Edusp. p. 129. ISBN 85-7001-018-4 
  3. a b c Higham, Nicholas (2002). Accuracy and Stability of Numerical Algorithms (2 ed). SIAM. Cap 1, p. 19
  4. L.A.Sphaier, L.S.B.Alves. Representação de Números, Erros Numéricos e Aritmética Computacional. Disponível em www.sphaier.com
  5. Geraldo Ávila. Introdução à Análise Matemática. [S.l.: s.n.] ISBN 8521201680 
  6. «Cálculo numérico». Universidade Federal do Rio Grande do Sul. Consultado em 11 de março de 2018 
  7. D. Kincaid and E. W. Cheney. Numerical Analysis: Mathematics of Scientific Computing. Brooks/Cole Publishing Company, Paci_c Grove, CA, 1990.