Cancelamento catastrófico - Catastrophic cancellation

Na análise numérica , o cancelamento catastrófico é o fenômeno que subtrair boas aproximações de dois números próximos pode resultar em uma péssima aproximação da diferença dos números originais.

Por exemplo, suponha que você tenha dois pinos de madeira, um longo e o outro longo. Se você medi-los com uma régua que é boa apenas até o centímetro, pode obter aproximações e . Dependendo de suas necessidades, essas podem ser boas aproximações, em erro relativo , dos comprimentos verdadeiros: as aproximações apresentam erros de menos de 2% dos comprimentos verdadeiros ,.

No entanto, se você subtrair os comprimentos aproximados , obterá , embora a verdadeira diferença entre os comprimentos seja . A diferença das aproximações,, está com erro de 100% da magnitude da diferença dos valores verdadeiros ,.

O cancelamento catastrófico pode acontecer mesmo se a diferença for calculada exatamente, como no exemplo acima - não é uma propriedade de nenhum tipo particular de aritmética como a aritmética de ponto flutuante ; em vez disso, é inerente à subtração, quando as entradas são as próprias aproximações. De fato, na aritmética de ponto flutuante, quando as entradas estão próximas o suficiente, a diferença de ponto flutuante é calculada exatamente, pelo lema de Sterbenz - não há erro de arredondamento introduzido pela operação de subtração de ponto flutuante.

Análise formal

Formalmente, o cancelamento catastrófico acontece porque a subtração é mal condicionada nas entradas próximas: mesmo se as aproximações e tiverem pequenos erros relativos e de valores verdadeiros e , respectivamente, o erro relativo da diferença aproximada da diferença verdadeira é inversamente proporcional à diferença verdadeira:

Assim, o erro relativo da diferença exata das aproximações da diferença dos números verdadeiros é

que pode ser arbitrariamente grande se as entradas verdadeiras e forem próximas.

Em algoritmos numéricos

Subtrair os números próximos na aritmética de ponto flutuante nem sempre causa um cancelamento catastrófico, ou mesmo qualquer erro - pelo lema de Sterbenz , se os números forem próximos o suficiente, a diferença de ponto flutuante é exata. Mas o cancelamento pode amplificar erros nas entradas que surgiram de arredondamento em outra aritmética de ponto flutuante.

Exemplo: diferença de quadrados

Dados os números e , a tentativa ingênua de calcular a função matemática pela aritmética de ponto flutuante está sujeita a um cancelamento catastrófico quando e estão próximos em magnitude, porque a subtração irá ampliar os erros de arredondamento no quadrado. A fatoração alternativa , avaliada pela aritmética de ponto flutuante , evita o cancelamento catastrófico porque evita a introdução de erro de arredondamento que leva à subtração.

Por exemplo, se e , então o verdadeiro valor da diferença é . Na aritmética IEEE 754 binary64 , avaliar a fatoração alternativa dá o resultado correto exatamente (sem arredondamento), mas avaliar a expressão ingênua dá o número de ponto flutuante mais próximo de , do qual apenas metade dos dígitos estão corretos e a outra metade (sublinhado) são lixo.

Exemplo: arco seno complexo

Ao calcular a função de arco seno complexo , pode-se ficar tentado a usar a fórmula logarítmica diretamente:

No entanto, suponha que seja . Então e ; chame a diferença entre eles - uma diferença muito pequena, quase zero. Se é avaliado em aritmética de ponto flutuante, dando

com qualquer erro , onde denota arredondamento de ponto flutuante, então computando a diferença

de dois números próximos, ambos muito próximos de , pode amplificar o erro em uma entrada por um fator de - um fator muito grande porque era quase zero. Por exemplo, if , o valor verdadeiro de é aproximadamente , mas usando a fórmula logarítmica ingênua na aritmética IEEE 754 binary64 pode resultar , com apenas cinco dos dezesseis dígitos corretos e o restante (sublinhado) todo lixo.

No caso de for , usar a identidade evita o cancelamento porque mas , então a subtração é efetivamente adicionada com o mesmo sinal que não cancela.

Exemplo: conversão Radix

As constantes numéricas em programas de software são frequentemente escritas em decimal, como no fragmento C double x = 1.000000000000001;para declarar e inicializar uma variável binária64 IEEE 754 chamada x. No entanto, não é um número de ponto flutuante binário64; o mais próximo, que será inicializado neste fragmento, é . Embora a conversão de raiz de ponto flutuante decimal para ponto flutuante binário incorra apenas em um pequeno erro relativo, o cancelamento catastrófico pode amplificá-lo para um muito maior: x

double x = 1.000000000000001;  // rounded to 1 + 5*2^{-52}
double y = 1.000000000000002;  // rounded to 1 + 9*2^{-52}
double z = y - x;              // difference is exactly 4*2^{-52}

A diferença é . Os erros relativos de partir e de partir são ambos abaixo e a subtração de ponto flutuante é calculado exatamente pela Sterbenz lema. xyy - x

Mas mesmo que as entradas sejam boas aproximações, e mesmo que a subtração seja calculada exatamente, a diferença das aproximações tem um erro relativo de mais da diferença dos valores originais escritos em decimal: o cancelamento catastrófico amplificou um pequeno erro na conversão da raiz em um grande erro na saída.

Cancelamento benigno

O cancelamento às vezes é útil e desejável em algoritmos numéricos. Por exemplo, os algoritmos 2Sum e Fast2Sum dependem desse cancelamento após um erro de arredondamento para calcular exatamente qual foi o erro em uma operação de adição de ponto flutuante como um número de ponto flutuante em si.

A função , se avaliada ingenuamente em pontos , perderá a maioria dos dígitos de no arredondamento . No entanto, a função em si é bem condicionada nas entradas próximas . Reescrevendo como

explora o cancelamento para evitar o erro do avaliado diretamente. Isso funciona porque o cancelamento no numerador e o cancelamento no denominador se contrapõem; a função é bem condicionada perto de zero, o que dá uma boa aproximação de e, portanto, dá uma boa aproximação de .

Referências