Cancelamento catastróficoCancelamento 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 geralSeja 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. ExemploConsidere 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 exemploSeja 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 é: Para explicar tal fenômeno, consideremos e uma precisão de 16 dígitos decimais, tem-se:
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]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] ExemploConsidere 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 é:
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áticasInú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 GrauSeja 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émLigações externas
Referências
|
Portal di Ensiklopedia Dunia