Tente evitar perda de dígitos significantes no cálculo das seguintes funções:
©
, para
grande.
©
Passo 1
Beleza, aqui a questão é sobre evitar perda de dígitos significantes (aquele tal “cancelamento catastrófico”) quando a gente calcula
para
1. Das propriedades de logaritmo (especialmente
2. Da ideia de função
log1p
).3. Se quiser, da expansão em série de Taylor para
Passo 2
Primeiro vamos aplicar a propriedade de logaritmo que diz
Isso já simplifica para
Por que isso ajuda? Porque agora a gente não subtrai dois números gigantes (
e
) que ficam quase iguais quando
cresce — em vez disso, calcula um único logaritmo de algo bem próximo de 1.
Passo 3
Quando
é muito grande,
é um número muito pequenininho. Aí vale usar a função especializada
com
log1p
que faz exatamente isso sem perder precisão. Então, computacionalmente, você faz resultado = log1p(1.0/x);
e evita qualquer cancelamento.
Passo 4
Se quiser até uma aproximação teórica, dá para expandir em série de Taylor pra
em torno de
:
Substituindo
que mostra direitinho que o valor é pequeno e bem comportado numericamente.
Resposta
Reescrevendo a função de maneira estável, para
grande, temos
e, na prática numérica, use a função especializada
log1p(1.0/x)
para não perder dígitos significantes.