1. Seja
f(x)=\sqrt{x^{2}+1}+x .
Descreva 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 que o enunciado pede e o que temos dado:
  • Pede: descrever um algoritmo (passo a passo) para calcular o valor da função
f(x)=\sqrt{x^{2}+1}+x
num sistema de ponto flutuante, de forma que o erro relativo do resultado seja da ordem do erro da representação (ou seja, não sofrer perda de precisão por cancelamento).
  • Informações úteis que vamos usar (assumidas do enunciado / do sistema de ponto flutuante):
    • Existe um erro de arredondamento unitário que chamaremos de u (o “unit roundoff”).
    • Operações elementares (adição, multiplicação, raiz quadrada, divisão) produzem resultados com erro relativo da ordem de u.
    • Podemos supor que há testes para detectar valores especiais como \mathrm{NaN}, +\infty e -\infty.
    • Se disponível, é preferível usar a rotina numérica estável \operatorname{hypot}(x,1) que calcula \sqrt{x^2+1} evitando estouro e perda de precisão; caso não haja, usaremos um procedimento equivalente por escala.

Passo 2

Entendendo o problema numérico (por que pode haver erro grande):
  • A expressão direta é f(x)=\sqrt{x^{2}+1}+x.
  • O perigo aparece quando x é negativo e |x| é grande: então \sqrt{x^{2}+1}\approx -x e estamos somando dois números de sinais opostos e magnitudes próximas. Isso causa cancelamento (perda de dígitos significativos) e o resultado pode ter erro relativo muito maior do que u.
  • Objetivo: eliminar o cancelamento por reformulação algébrica e ainda evitar estouro/underflow ao calcular \sqrt{x^{2}+1}.

Passo 3

Uma identidade algébrica útil (a chave do truque):
  • Observe que multiplicando e dividindo por \sqrt{x^{2}+1}-x obtemos
\sqrt{x^{2}+1}+x=\frac{(\sqrt{x^{2}+1}+x)(\sqrt{x^{2}+1}-x)}{\sqrt{x^{2}+1}-x}=\frac{x^{2}+1-x^{2}}{\sqrt{x^{2}+1}-x}=\frac{1}{\sqrt{x^{2}+1}-x}.
  • Conclusão prática: para valores de x negativos (quando a soma direta causa cancelamento) é vantajoso avaliar
f(x)=\frac{1}{\sqrt{x^{2}+1}-x},
pois aí o denominador é aproximadamente -2x (grande positivo quando x é grande e negativo), evitando cancelamento.

Passo 4

Como calcular \sqrt{x^{2}+1} de forma estável (evitar overflow/underflow e manter precisão):
  • Se a função \operatorname{hypot}(x,1) estiver disponível, use
s := \operatorname{hypot}(x,1),
pois ela é feita exatamente para computar \sqrt{x^{2}+1} de maneira estável.
  • Se \operatorname{hypot} não existir, use escala para evitar elevar x à segunda podendo causar overflow:
    • Seja a:=|x|.
    • Se a\leq 1, então calcule
    s := \sqrt{1+x^{2}},pois x^{2} não vai overflowar e a expressão é segura.
    • Se a>1, calcule
    s := a\sqrt{1+\frac{1}{a^{2}}},ou seja s := |x|\cdot\sqrt{1+\frac{1}{x^{2}}},que evita o cálculo direto de x^{2} muito grande e é numericamente estável.
  • Essas formas asseguram que o erro relativo em s é da ordem de u.

Passo 5

Tratamento de casos especiais numéricos:
  • Se x for \mathrm{NaN}, retornar \mathrm{NaN}.
  • Se x=+\infty, então f(x)=+\infty.
  • Se x=-\infty, então \lim_{x\to -\infty}f(x)=0. Para evitar \infty-\infty quando se calcularia \sqrt{x^{2}+1}+x, retorne 0 diretamente.
  • Para valores finitos de x, aplicar as regras a seguir.

Passo 6

Descrição clara e passo a passo do algoritmo (pseudocódigo comentado):
  1. Testes iniciais:
    • Se x é \mathrm{NaN} então retornar \mathrm{NaN}.
    • Se x=+\infty então retornar +\infty.
    • Se x=-\infty então retornar 0.
  2. Calcule s=\sqrt{x^{2}+1} de forma estável:
    • Se existir \operatorname{hypot}, faça s := \operatorname{hypot}(x,1).
    • Caso contrário:
      • Calcule a := |x|.
      • Se a \le 1 então s := \sqrt{1+x^{2}}.
      • Senão (ou seja, a>1) então s := a\cdot\sqrt{1+\dfrac{1}{a^{2}}}.
  3. Decida a fórmula a usar:
    • Se x \ge 0 então compute y := s + x. (Aqui não há cancelamento; soma de números com mesmo sinal é estável.)
    • Se x < 0 então compute y := \dfrac{1}{s - x}. (Isto evita cancelamento pois s-x é de ordem -2x e bem condicionado.)
  4. Retorne y.

Passo 7

Por que esse algoritmo tem erro relativo da ordem do erro de representação:
  • Cada operação (computar s com \operatorname{hypot} ou pela escala, somas, subtrações e divisão) introduz erro relativo da ordem de u.
  • Para x\ge 0: s e x têm mesmo sinal e a soma s+x não sofre cancelamento; portanto o erro relativo final é O( u).
  • Para x<0: usar 1/(s-x) transforma a soma cancelante em uma divisão por um número bem condicionado (aproximadamente -2x quando |x| é grande). Assim o resultado não perde dígitos e o erro relativo final também fica O( u).
  • O uso de \operatorname{hypot} ou da escala evita overflow ao calcular \sqrt{x^{2}+1}, de modo que não introduzimos erros maiores que O( u).
  • Portanto, globalmente, o erro relativo do resultado obtido pelo algoritmo é da ordem de u, ou seja, da ordem do erro de representação do sistema de ponto flutuante.

Resposta

  1. Se x é \mathrm{NaN} retornar \mathrm{NaN}.
  2. Se x=+\infty retornar +\infty.
  3. Se x=-\infty retornar 0.
  4. Calcular s=\sqrt{x^{2}+1} de forma estável:
    • se disponível: s:=\operatorname{hypot}(x,1);
    • senão: a:=|x|; se a\le 1 então s:=\sqrt{1+x^{2}} senão s:=a\cdot\sqrt{1+\dfrac{1}{a^{2}}}.
  5. Se x\ge 0 então retornar s+x.
  6. Se x<0 então retornar \dfrac{1}{\,s-x\,}.