Seja
f(x)=x+1+\sqrt{x^{2}+1}
Descreve o algoritmo para calcular valor da função f(x) utilizando um sistema de ponto flutuante, tal que o erro relativo do resultado será da ordem do erro da representação.

Passo 1

O enunciado dá a função
f(x)=x+1+\sqrt{x^{2}+1}
e pede um algoritmo para computá-la em um sistema de ponto flutuante de forma que o erro relativo do resultado seja da ordem do erro da representação (i.e., da ordem do unit roundoff).
Informações relevantes que o enunciado fornece ou implica:
  • Queremos um algoritmo numérico, não uma prova puramente teórica.
  • O objetivo é controlar erros de arredondamento (erro relativo da ordem do erro da representação).
  • Devemos evitar perdas de precisão (principalmente cancelamentos) que aumentem o erro acima da ordem do unit roundoff.

Passo 2

Entendendo o modelo de ponto flutuante (rápido e prático): seja u o unit roundoff (medida do erro de arredondamento, da ordem do erro da representação). Para operações aritméticas e raiz quadrada usamos o modelo padrão
\mathrm{fl}(a\\ \text{op}\\ b)=(a\\ \text{op}\\ b)(1+\delta),\qquad |\delta|\le u,
onde \mathrm{fl}(\cdot) é o resultado arredondado. Esse modelo nos permite rastrear como o erro relativo se propaga por algumas operações.

Passo 3

Identificar o perigo numérico: onde ocorre perda de precisão?
Repare a soma x+\sqrt{x^{2}+1}. Para x negativo e de grande magnitude |x|\gg1 temos
\sqrt{x^{2}+1}=|x|\sqrt{1+\tfrac{1}{x^{2}}}\approx |x|+\tfrac{1}{2|x|},
e como x é negativo, x+\sqrt{x^{2}+1}\approx -|x|+(|x|+\tfrac{1}{2|x|})=\tfrac{1}{2|x|}, ou seja, um número muito pequeno obtido pela diferença de dois números grandes — isso causa cancelamento e perda de dígitos significativos se fizermos a soma diretamente. Esse é o ponto crítico que devemos contornar.

Passo 4

A identidade algébrica que salva a situação: escrevemos
(\sqrt{x^{2}+1}+x)(\sqrt{x^{2}+1}-x)=(x^{2}+1)-x^{2}=1.
Dessa igualdade segue exatamente
\sqrt{x^{2}+1}+x=\frac{1}{\sqrt{x^{2}+1}-x}.
Isto é, em vez de calcular diretamente x+\sqrt{x^{2}+1} quando há risco de cancelamento, podemos calcular o seu recíproco por uma diferença que não cancela e depois inverter. Para x<0 a quantidade \sqrt{x^{2}+1}-x é uma soma de termos de mesma ordem (porque -x=|x| é grande e positivo), logo é computada sem grande perda de dígitos.

Passo 5

Estratégia prática: usar uma fórmula diferente dependendo do sinal de x.
  • Se x\ge 0 então x+\sqrt{x^{2}+1} é grande (≈ 2x para x grande) e pode ser computado diretamente com segurança.
  • Se x<0 então usamos a identidade acima e computamos
x+\sqrt{x^{2}+1}=\frac{1}{\sqrt{x^{2}+1}-x},
de modo a evitar o cancelamento.

Passo 6

Algoritmo passo a passo (descrito em palavras e depois em pseudocódigo):
  1. Calcular s=\sqrt{x^{2}+1}. (Recomenda-se usar uma rotina segura como \text{hypot}(x,1) se disponível, para evitar overflow/underflow ao formar x^{2}+1.)
  2. Se x\ge 0 então calcular y=x+s. Caso contrário (se x<0) calcular y=1/(s-x).
  3. Retornar f=y+1.
Explicação intuitiva: no ramo x<0 evitamos a diferença direta que causa cancelamento; no ramo x\ge0 não há cancelamento significativo e a soma é estável.

Passo 7

Análise de erro (intuitiva e com o modelo de ponto flutuante):
  • Cálculo de s=\sqrt{x^{2}+1}: com o modelo de arredondamento temos \mathrm{fl}(s)=s(1+\delta_s) com |\delta_s|\le u se a rotina de raiz/quadrado for corretamente arredondada (usar \text{hypot} reduz riscos de overflow).
  • Caso x\ge0: então calculamos y=\mathrm{fl}(x+s)=(x+s)(1+\delta_1) com |\delta_1|\le u. Assim y tem erro relativo da ordem de u. Finalmente f=\mathrm{fl}(y+1)=(y+1)(1+\delta_2) com |\delta_2|\le u. Composto, o erro relativo de f permanece da ordem u.
  • Caso x<0: primeiro calculamos t=\mathrm{fl}(s-x)=(s-x)(1+\delta_3). Aqui não há cancelamento porque s e -x têm o mesmo sinal (soma de números grandes positivos), logo t é bem representado e |\delta_3|\le u. Depois y=\mathrm{fl}(1/t)=(1/t)(1+\delta_4). Portanto y também tem erro relativo da ordem de u. Finalmente f=\mathrm{fl}(y+1) tem erro relativo da ordem de u.
    Portanto, em ambos os ramos, cada passo introduz apenas erros de arredondamento da ordem de u e a combinação mantém o erro relativo do resultado na ordem de u. Em palavras: o algoritmo é numericamente estável (erro relativo da ordem do erro da representação).

Passo 8

Observações práticas e extremos:
  • Use \text{hypot}(x,1) quando disponível em vez de calcular \sqrt{x^{2}+1} como \sqrt{x*x+1}, porque \text{hypot} evita overflow quando |x| é muito grande e reduz problemas com subnormais. Em muitos ambientes \text{hypot} é otimizada e também é corretamente arredondada.
  • O algoritmo assume arredondamento com unidade de arredondamento u e operações básicas com erro relativo ≤ u. Para sistemas exóticos (ponto flutuante não-IEEE) convém checar garantias locais.
  • Não há problema de sinal: nota que x+\sqrt{x^{2}+1}>0 para todo x, então não precisamos tratar casos adicionais de sinal do resultado.

Passo 9

Um exemplo rápido (intuitivo) para ver a melhoria: para x=-10^{8},
  • cálculo direto de x+\sqrt{x^{2}+1} faz a soma de -10^{8} com algo como 10^{8}+5\cdot10^{-9}, causando cancelamento;
  • com a fórmula alternativa calculamos s-x\approx 2\cdot10^{8} (que é grande e bem representado) e tomamos o inverso, obtendo o pequeno valor correto com precisão de arredondamento.

Resposta

Se disponível use s=\text{\text{hypot}}(x,1) senão s=\sqrt{x^{2}+1}.
\text{if } x\ge 0:\quad y = x + s
\text{else}:\quad y = \frac{1}{\,s - x\,}
\text{return } f = y + 1

Exercícios relacionados