- Seja
Descreve 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 enunciado dá a função
e pede que eu descreva um algoritmo para calcular
num sistema de ponto flutuante de modo que o erro relativo do resultado seja da ordem do erro da representação (ou seja, da ordem do erro de arredondamento do sistema, que denotarei por
).\n
Informações/requisitos explícitos:
Informações/requisitos explícitos:
Não tenho que usar nenhuma implementação específica; preciso descrever passos numéricos e justificar por que o erro relativo fica da ordem de
.
Passo 2
Por que o cálculo direto é perigoso (intuição e exemplo): se eu calcular diretamente
posso ter cancelamento catastrófico quando
e
são quase iguais. Vamos ver um caso concreto: para
pequeno, usando expansão em série,
Com
e
obtemos, para
pequeno,
logo
Ou seja,
e
são ambos próximos de
e a diferença é da ordem de
— muito menor que os termos que estou subtraindo. Num sistema de ponto flutuante, se
e
são representados com erro relativo
(cada um com erro da ordem de
), o erro absoluto na subtração pode ser da ordem de
, e a divisão desse erro absoluto pelo valor pequeno
pode amplificar o erro relativo em cerca de
. Em outras palavras: o cálculo direto pode dar um erro relativo enorme quando
é pequeno.
Passo 3
Ideia chave para evitar cancelamento: manipular algebricamente a expressão para eliminar a subtração de duas quantidades quase iguais. Faço a racionalização:
Esta forma evita subtrair duas raízes próximas: o numerador é
(que posso calcular diretamente) e o denominador é soma de duas raízes (não há cancelamento na soma). Para
pequeno, o denominador é aproximadamente
, então o resultado é aproximadamente
calculado sem perda por cancelamento.
Passo 4
Algoritmo numérico estável (estrutura e operações em ponto flutuante). Vou escrever uma versão com dois ramos para evitar overflow quando
for muito grande e para evitar cancelamento quando
for pequeno. Denoto por
a operação em ponto flutuante (cada operação aritmética ou raiz produz um erro relativo
). Seja
.
-
Calcule
.\n -
Se
(caso pequeno — evita cancelamento): - compute
. (isto é ) - compute
. - compute
. (representa ) - compute
. (representa ) - compute
. - compute
. - compute
. - compute
. - devolver
.
- compute
-
Se
(caso moderado/grande — evita overflow do termo e mantém boa precisão): - compute
. - compute
. (isto é ) - compute
. - compute
. - compute
. - compute
. - compute
. - compute
. - devolver
.
- compute
Observações sobre os ramos:
- No ramo 2 (pequeno), uso a forma racionalizada
, que evita subtração de duas raízes quase iguais. - No ramo 3 (grande), fatorizei
para evitar cálculo direto de que poderia overflow: usando . Para grande isso dá diferença de ordem , sem cancelamento. - Em implementações reais escolha o limiar (aqui usei
) de acordo com formato (por exemplo em double pode ser diferente); o princípio é ter um critério que distingue “pequeno” (onde é muito menor que 1) de “grande” (onde pode causar overflow).
Passo 5
Análise rápida do erro (por que a ordem do erro final é
) — argumento heurístico e compreensível:
- Modelo de arredondamento: cada operação elementar (multiplicação, adição, raiz) devolve o valor exato multiplicado por
com . - No ramo pequeno, as quantidades intermediárias são:
calculado com erro relativo ; e têm erros relativos ; as raízes , têm erro relativo ; a soma tem erro absoluto . Como é do mesmo tamanho de ordem quando é pequeno, seu erro relativo também é . O quociente junta erros relativos de numerador e denominador, resultando num erro relativo final que é uma soma de algumas constantes vezes . Em primeira ordem (desprezando termos ), obtemos . - No ramo grande, calculamos
e depois raízes de e ; aí é pequeno, as operações são bem condicionadas e o produto final por introduz apenas um fator de arredondamento adicional. Novamente a acumulação de erros é uma soma de poucos termos do tipo com , logo o erro relativo final é . - Em suma: cada passo é numericamente estável (não há divisão por quantidades muito menores que a magnitude dos operandos), e o número de operações é pequeno; assim o erro relativo final fica limitado por uma pequena constante vezes
. Isso satisfaz o requisito “erro relativo da ordem do erro da representação”.
Passo 6
Casos extremos e recomendações práticas:
- Se houver risco de overflow em
(por exemplo ), use aritmética estendida / escala (dividir por um fator de potência de 2, calcular e remultiplicar) ou detecte e trate overflow separadamente. O algoritmo acima evita a maior parte dos problemas porque no ramo grande eu trabalho com . - Em implementações reais, prefira usar as funções de biblioteca (por exemplo, multiplicação, soma, sqrt) e verificar se
está em intervalos seguros; escolha limiares testados para o tipo de ponto flutuante (single/double/long double). - Teste o algoritmo em valores de
muito pequenos (por exemplo em double) e muito grandes para confirmar estabilidade e ausência de overflow.
Resposta
Se
: calcular
Se
: calcular
Este algoritmo evita cancelamento e overflow na prática; o erro relativo final é
(ordem do erro de representação).