- Seja
Descreva o algoritmo para calcular valor da função
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
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
(o “unit roundoff”). - Operações elementares (adição, multiplicação, raiz quadrada, divisão) produzem resultados com erro relativo da ordem de
. - Podemos supor que há testes para detectar valores especiais como
, e . - Se disponível, é preferível usar a rotina numérica estável
que calcula evitando estouro e perda de precisão; caso não haja, usaremos um procedimento equivalente por escala.
- Existe um erro de arredondamento unitário que chamaremos de
Passo 2
Entendendo o problema numérico (por que pode haver erro grande):
- A expressão direta é
. - O perigo aparece quando
é negativo e é grande: então 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 . - Objetivo: eliminar o cancelamento por reformulação algébrica e ainda evitar estouro/underflow ao calcular
.
Passo 3
Uma identidade algébrica útil (a chave do truque):
- Observe que multiplicando e dividindo por
obtemos
- Conclusão prática: para valores de
negativos (quando a soma direta causa cancelamento) é vantajoso avaliar
pois aí o denominador é aproximadamente
(grande positivo quando
é grande e negativo), evitando cancelamento.
Passo 4
Como calcular
de forma estável (evitar overflow/underflow e manter precisão):
- Se a função
estiver disponível, use
pois ela é feita exatamente para computar
de maneira estável.
- Se
não existir, use escala para evitar elevar à segunda podendo causar overflow: - Seja
. - Se
, então calcule
pois não vai overflowar e a expressão é segura. - Se
, calcule
ou seja que evita o cálculo direto de muito grande e é numericamente estável. - Seja
- Essas formas asseguram que o erro relativo em
é da ordem de .
Passo 5
Tratamento de casos especiais numéricos:
- Se
for , retornar . - Se
, então . - Se
, então . Para evitar quando se calcularia , retorne diretamente. - Para valores finitos de
, aplicar as regras a seguir.
Passo 6
Descrição clara e passo a passo do algoritmo (pseudocódigo comentado):
- Testes iniciais:
- Se
é então retornar . - Se
então retornar . - Se
então retornar .
- Se
- Calcule
de forma estável: - Se existir
, faça . - Caso contrário:
- Calcule
. - Se
então . - Senão (ou seja,
) então .
- Calcule
- Se existir
- Decida a fórmula a usar:
- Se
então compute . (Aqui não há cancelamento; soma de números com mesmo sinal é estável.) - Se
então compute . (Isto evita cancelamento pois é de ordem e bem condicionado.)
- Se
- Retorne
.
Passo 7
Por que esse algoritmo tem erro relativo da ordem do erro de representação:
- Cada operação (computar
com ou pela escala, somas, subtrações e divisão) introduz erro relativo da ordem de . - Para
: e têm mesmo sinal e a soma não sofre cancelamento; portanto o erro relativo final é O( ). - Para
: usar transforma a soma cancelante em uma divisão por um número bem condicionado (aproximadamente quando é grande). Assim o resultado não perde dígitos e o erro relativo final também fica O( ). - O uso de
ou da escala evita overflow ao calcular , de modo que não introduzimos erros maiores que O( ). - Portanto, globalmente, o erro relativo do resultado obtido pelo algoritmo é da ordem de
, ou seja, da ordem do erro de representação do sistema de ponto flutuante.
Resposta
- Se
é retornar . - Se
retornar . - Se
retornar . - Calcular
de forma estável: - se disponível:
; - senão:
; se então senão .
- se disponível:
- Se
então retornar . - Se
então retornar .