Cancelamento catastrófico

Origem: Wikipédia, a enciclopédia livre.
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.

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.

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

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 | editar código-fonte]

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 | editar código-fonte]

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
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 | editar código-fonte]

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 | editar código-fonte]

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 | editar código-fonte]

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 | editar código-fonte]

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 | editar código-fonte]

Ligações externas[editar | editar código-fonte]

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.