Matemática Computacional
 
Resumo da matéria [Versão 3.1]


[Capítulo 1] [Capítulo 2] [Capítulo 3] [Capítulo 4] [Capítulo 5]

Capítulo I
 
Representação numérica. Teoria de erros.

A introdução da notação posicional por influência da obra de Al-Kharizmi (séc. IX) na Idade Média, permitiu um desenvolvimento considerável do cálculo na Europa Ocidental. A introdução na noção hindu de zero, abriu um conceito de representação, omisso nos milénios anteriores. A facilidade do cálculo nesta nova representação teve como consequência que a notação cumulativa greco-romana fosse progressivamente abandonada... ainda que a um ritmo medieval.
A escolha de uma base levantava ainda assim alguns problemas para a escolástica axiomática medieval.
Por exemplo, a representação de 1/3 = 0.3333 nunca poderia ser exacta na notação decimal. E se as fracções (números racionais) têm dízimas periódicas, números reais como
 2= 1.414213562373
apresentavam uma sucessão imprevisível de dígitos. A sua representação decimal estaria sempre limitada a um número finito de dígitos, e a um consequente erro.
Foi apenas no final do séc. XIX, com G. Cantor , que os números reais foram definidos como (classes de equivalência de) sucessões de Cauchy de racionais, em que a sucessão:
x0=1, x1=1.4, x2=1.41, x3=1.414, x4=1.4142, ...
é apenas um representante de todas as sucessões de racionais que convergem para o número real  2.
Esta interpretação de Cantor representou um grande avanço conceptual, permitindo ainda distinguir o infinito numerável do infinito contínuo.

É claro que a escolha da base decimal para a representação numérica é apenas uma das várias possibilidades.
Já no séc. XVII, Leibniz advogava vantagens na representação binária − que é correntemente adoptada nos computadores.
De um modo geral podemos utilizar qualquer base natural β > 1, para escrever um número real.
 
Por exemplo, em Notação Científica (normalmente β=10),

x = ± (0. a1 a2 ... an ...)β × βt
= ±  

k=1
ak βt-k
os dígitos ak variam entre 0 e β-1, e para haver unicidade de representação no expoente, a1 não deve ser nulo, sendo o zero representado à parte. Evitam-se assim várias possibilidades de representação
0.1 × β1 = 0.01 × β2 = 0.001 × β3 = 1
escolhendo apenas a primeira.
Note-se ainda que, por convenção em base decimal, 0.999 é identificado com a representação superior 1.000 (ambas as sucessões convergem para 1).

Representação em Ponto Flutuante

A menos que estivessemos na posse de uma máquina com memória infinita (... uma teórica máquina de Turing ), a representação de um número tem que ser ser finita, pelo que, consequentemente somos obrigados a considerar um número finito de dígitos na mantissa e uma limitação nos valores dos expoentes admitidos.
 
Definição: Sistema de Ponto Flutuante (também designado Vírgula Flutuante)
O sistema FP(β, n, t-, t+) é o conjunto dos números racionais
FP(β, n, t-, t+) = {0} ∪ { ± 0. a1 a2 ... an × βt : ak∈ {0,..., β-1}, a1≠ 0, t∈ {t-, ..., t+ } }
Observações:
(i) Notar que como a1 ≠ 0, o zero tem que ser representado à parte (pode ser considerado um bit, normalmente denominado zero flag, e de forma semelhante há um bit que determina o sinal, o sign flag).
(ii) Habitualmente usamos β=10, e nos computadores é usada a base β=2 (nesse caso os dígitos ai podem ser apenas 0 ou 1). Detalhes sobre a implementação nos computadores, podem ser encontrados no artigo sobre a Norma IEEE 754-1985 .
 
(iii) Definição do sistema FP na declaração de variáveis.
Nalgumas linguagens (C, Fortran, Matlab,...) a definição do sistema FP a utilizar é feita na altura da definição das variáveis. Assim, quando trabalhamos em precisão simples em C, declaramos as variáveis como float, o que significa que guardamos 4 bytes para esse número, dos quais 23 bits são para a mantissa (o que corresponde a 23 dígitos binários, e aproximadamente a 8 dígitos decimais). Quando trabalhamos em precisão dupla, declaramos as variáveis como double, o que significa que guardamos 8 bytes para esse número, dos quais 53 bits são para a mantissa (o que corresponde a 53 dígitos binários e aproximadamente a 16 dígitos decimais). Actualmente, como os problemas de armazenamento em memória foram substancialmente reduzidos, é habitual considerar a precisão dupla. Mesmo assim, devemos ter em atenção que uma matriz de dimensão 30 000 ocupará aprox. 7 Gb de memória em precisão dupla e metade em precisão simples.
 
Na passagem de números reais para o conjunto FP de números racionais,
fl: R → FP(β, n, t-, t+) ⊂ Q
ocorrem dois tipos de limitações, que levam a erros:
  • Limitações finitas no expoente (erros em que a execução é parada):
    • Overflow: Acontece se o valor do expoente t é superior a t+.
    • Underflow: Acontece se o valor do expoente t é inferior a t-.
  • Limitações finitas na mantissa (erros que iremos estudar):
    • Arredondamentos: por truncatura ou arredondamento simétrico.

Arredondamento

Dado um número, representado em notação científica
x = ± 0. a1 a2 ... an an+1 .... × βt
ao armazená-lo num sistema FP(β,n) somos obrigados a suprimir dígitos da mantissa. Para efectuar essa conversão podemos considerar dois tipos de arredondamento:
  • Arredondamento por Corte (ou Truncatura)
    flc(x) = ± 0. a1 a2 ... an × βt
  • Arredondamento Simétrico (base β > 2, β par)
    fls(x) = ± 0. a1' a2' ... an' × βt'
Os dígitos ak' coincidem com ak e o expoente t' coincide com t, se an+1 < β/2.
Se an+1 > β/2 então os dígitos ai' e o expoente t' resultam da representação da soma
0. a1 a2 ... an × βt + βt − n.
Observações:
(i) Podemos ainda considerar
fls(x) = flc(x +  1/2 βt − n)
(ii) Há variações no arredondamento que é normalmente designado simétrico, já que há razões estatísticas que procuram distribuir de forma igual os arredondamentos. Para evitar que todos os casos 5 sejam decididos para cima, opta-se por decidir nesses casos que a mantissa fique par. Ou seja, nesse método também designado round-to-even, os valores 11.5 e 12.5 arredondariam ambos para o inteiro 12 por ser par. Não iremos adoptar essa variante estatística.
 
Definição:
Consideremos x um valor exacto e x~ um valor aproximado de x, definimos:
  • Erro : ex( x~ ) = x − x~
  • Erro Absoluto : |ex( x~ )| = |x − x~|
  • Erro Relativo (se x ≠ 0): é x( x~ )| com
    δx( x~ ) =   ex( x~ )
    x
- Não havendo ambiguidade sobre qual é a aproximação de x, escreveremos apenas ex para designar ex( x~ ), e da mesma forma abreviamos δx para o termo do erro relativo.
- Pode ainda usar-se δx~ se for mais importante colocar em evidência qual é a aproximação.

 
Como num sistema FP os arredondamentos são inerentes, convém estabelecer um majorante para o erro relativo de arredondamento arr(x)|, em que
δarr(x) = δx(fl(x)) =   x − fl(x)
x
 
Teorema:
Para qualquer x: fl(x)∈ FP(β, n), verificam-se as seguintes majorações de erro:
  • No caso de arredondamento por corte : arr(x) | < uc = β1-n
  • No caso de arredondamento simétrico : arr(x) | < us =  1/2 β1-n
Os majorantes u são designados unidades de arredondamento.
 
dem:
Apresentamos a demonstração para o caso de arredondamento por corte.
Consideramos um real x qualquer
x = ± 0.a1 ... an an+1 ... × βt
Como a1≠ 0 então a1≥ 1 e temos
|x|≥ 0.1 × βt = βt − 1
Por outro lado
|earr| = |x − flc(x)| = |0.a1 ... an an+1... − 0.a1 ... an| × βt
= 0.0 ... 0 an+1... × βt ≤ 0.0 ... 1 0 ... × βt = βt − n
implica
arr| = |earr|/|x| ≤ βt − n / βt − 1 = β1 − n
O caso de arredondamento simétrico é semelhante.
Nota: estas estimativas podem ser um pouco melhoradas, mas sem ganho relevante...

 
Observação
É importante notar que num sistema FP nunca há valores arredondados a zero.
Nalgumas máquinas de calcular, ou em sistemas FP mal implementados, é frequente haver um aviso de overflow, mas não de underflow, podendo arredondar valores demasiado pequenos a zero.
Isso conduz a resultados caricatos, como exponenciais que se anulam... por exemplo,
exp(-exp(8)) = 0.243 × 10-1294
pode dar zero na sua máquina de calcular, sem aviso de "erro de underflow".
- Como apresentar o resultado, usando uma máquina convencional?
Nestes casos é preciso separar o cálculo − o que será necessário efectuar pela máquina do cálculo que não é representável. Assim, podemos reduzir a potências de 10, usando logaritmos, e apresentando depois o resultado:
e-exp(8) = 10-exp(8)/log(10) = 10-1294.6136
notamos que a operação -exp(8)/log(10) realiza-se sem problemas, e separando a parte decimal do expoente 10-0.6136=0.2434 obtemos a mantissa.
 
Este tipo de erros, pode ainda ser agravado com a continuação dos cálculos... basta pensar que se o resultado fosse 0 não poderíamos efectuar o logaritmo que deveria devolver -exp(8).

Propagação de Erros em Funções

Consideramos agora um estudo da propagação de erros por aplicação de uma função ou de uma operação. De forma genérica, pretende-se saber se uma função f não altera significativamente a proximidade dos valores
x~ ≈ x ⇒ f(x~ ) ≈ f(x),
em termos do erro relativo. Aplicando o Teorema de Lagrange,
ef(x) = f(x) − f(x~ ) = f '(ξ) (x-x~) = f '(ξ)ex
com ξ∈ [ x; x~ ], admitindo que f∈ C1 (nesse intervalo).
Daqui resulta (para x≠ 0, f(x)≠ 0)
δf(x) = ef(x)/f(x) =   f '(ξ)
f(x)
ex =   x f '(ξ)
f(x)
δx
e podemos obter a estimativa para o erro relativo:
f(x) | ≤   |x| maxξ∈ [x,x~] |f '(ξ)|
|f(x)|
x| .
Esta estimativa é pouco manejável, e é mais simples considerar uma aproximação com ξ≈ x, que é uma aproximação de 1ª ordem (ou linear), em termos da expansão de Taylor.
De facto, ao desprezar o termo o(ex) em
f(x~ ) = f(x) + f '(x)ex + o(ex)
obtemos ef(x)≈ f '(x)ex, e dividindo por f(x), reencontramos a aproximação
δf(x) ≈   x f '(x)
f(x)
δx
que nos permite avaliar a propagação do erro por aplicação de uma função.
 
Definição: O valor Pf(x) = x f '(x)/f(x) é designado número de condição de f em x, tendo-se
δf(x) ≈ Pf(x) δx
Se |Pf(x)| for elevado isso significa que há um grande incremento do erro relativo por aplicação da função, mas se for reduzido significa que podemos ter uma boa aproximação relativa de f(x) mesmo com erros consideráveis em x.
 
Exemplos:
  • Se f(x)=xp, obtemos Pf(x)=p, e portanto δx^p ≈ p δx.
    Concluímos que para potências grandes, haverá um incremento significativo do erro relativo inicial.
  • Se f(x)=ex, obtemos Pf(x)=x, e portanto δexp(x) ≈ x δx.
    Concluímos que para |x| elevado, haverá um incremento significativo do erro relativo inicial.
  • Se f(x)=x-a, (a ≠ 0, constante) obtemos Pf(x)=x/(x-a), e portanto δx-a = x/(x-a) δx.
    Concluímos que para x ≈ a, haverá um incremento muito significativo do erro relativo inicial.
    Este exemplo mostra que a soma/subtracção pode levar a perturbações significativas no cálculo, devido ao
    Cancelamento Subtractivo.
  • Se f(x)=ax, (a ≠ 0, constante) obtemos Pf(x)=1, e portanto δax = δx.
    Concluímos que neste caso o erro relativo inicial é mantido.
Como contraponto a estes exemplos, vistos agora pelo lado positivo, poderá haver vantagens... quando avaliamos xp e se p ≈ 0 (extracção de raízes), o erro relativo diminui, o mesmo se passando para ex ou x-a quando x≈ 0.
Nestes casos, uma aproximação razoável de x poderá dar logo um bom resultado em f(x).
 
Definição: Dizemos que uma função f é mal condicionada em valores próximos de um ponto z se no limite |Pf(z)| = ∞.

Operações (funções de duas variáveis)
No caso de operações, funções com duas (ou mais) variáveis, temos que considerar erros nessas novas variáveis. Considerando agora a expansão de Taylor com duas variáveis (m representa a derivada parcial na m-ésima variável):
f(x~, y~) = f(x, y) + ∂1f(x, y)ex + ∂2f(x, y)ey + o(ex, ey)
obtemos ef(x, y)≈ ∂1f(x, y)ex + ∂2f(x, y)ey que é uma aproximação linear desprezando o termo o(ex, ey), e daqui resulta
δf(x,y) ≈   x ∂1f(x,y)
f(x,y)
δx +   y ∂2f(x,y)
f(x,y)
δy
De forma semelhante, aparecem números de condição Pfx(x,y) e Pfy(x,y) enquanto coeficientes dos termos δx e δy (respectivamente), tendo-se
δf(x,y)≈ Pfx(x,y)δx + Pfy(x,y)δy
  • Quando um deste números de condição tender para infinito num valor (x,y) então diremos que há mau condicionamento de f próximo de (x,y), tal como designado com uma única variável.
  • De forma semelhante, estas noções são facilmente estendidas para mais variáveis.
Um caso que nos interessa considerar é o caso de operações elementares, como a soma ou a multiplicação, que podem ser vistas como funções de duas variáveis.
  • Para a soma e subtracção obtemos
    δx+y =   x
    x+y
    δx +   y
    x+y
    δy   ;   δx − y =   x
    x − y
    δx −   y
    x − y
    δy
    notando que se trata de uma igualdade e não apenas de uma aproximação!
    Esta fórmula indica imediatamente que haverá problemas na subtracção de quantidades semelhantes, ou seja, quando x ≈ y, que é o caso de cancelamento subtractivo, podendo ser responsável por uma significativa propagação de erros de arredondamento.
  • No caso da multiplicação e divisão, a aplicação directa da fórmula dá-nos
    δxy ≈ δx + δy   ;   δx/y ≈ δx − δy
    Note-se que aqui há apenas uma aproximação, já que a igualdade levaria a uma expressão não linear
    δxy = δx + δy − δxδy
    fazendo sentido desprezar o produto δxδy quando os erros relativos são de pequena dimensão.

Propagação de Erros em Algoritmos

O estudo do condicionamento não depende da maneira como o cálculo é efectuado, depende apenas da função. No entanto, ao calcularmos a expressão não é possível fazê-lo num único cálculo − somos levados a cálculos intermédios, e à noção de algoritmo.
 
Algoritmo: Pretendendo calcular o valor de uma função z=f(x), definimos de forma equivalente um algoritmo como uma composição finita de cálculos por funções elementares Fk:
z1=F1(x); z2=F2(x, z1); ... zn=Fn(x,...,zn-1);
tal que z=zn .
(genericamente, as variáveis ou as funções podem ser multidimensionais).
Por exemplo, para calcular z=sin(x2)+x2, podemos considerar o algoritmo
z1=x2; z2 = sin(z1); z3 = z2+z1.
em que em cada passo é apenas efectuado um cálculo, e aproveitamos resultados anteriores. Importa agora definir quais são as funções elementares que iremos considerar.
 
Definição: Num sistema FP(β,n) dizemos que F é uma função computacional elementar associada a uma função f, se
F(y) = fl(f(y)), ∀ y∈ D ⊆ FP(β,n)
onde D é um subconjunto onde a função está definida.
Por exemplo, a função computacional F=LOG está associada à função f(x)=log(x), que está definida para x > 0, devendo considerar-se
D = { x∈ FP(β,n) : x > 0 }.
A função computacional LOG será considerada elementar se o resultado obtido para os números admitidos no sistema FP for exacto, a menos de arredondamentos [é isso que significa F(y) = fl(f(y))].
  • Nas linguagens de programação habituais (C, Fortran, etc.) estão definidas as funções e operações mais simples, verificando a propriedade de serem elementares para o sistema FP com base β=2, o que em precisão dupla, normalmente garante um valor exacto, a menos de arredondamento na 15ª casa decimal. Por exemplo, iremos considerar como elementares:
    • as funções: exp, log, sin, cos,
    • as operações: + , − , * , / , ^ (soma, subtracção, multiplicação, divisão, potenciação);
  • Deve ainda notar-se que o conjunto admíssivel D deve ainda sofrer uma restrição para evitar erros de Overflow ou Underflow.
    Por exemplo, se x=10q então num sistema FP(10,n,-t,t) quando efectuamos a operação elementar x^p haverá um erro quando xp = 0.1 × 101+qp tiver um expoente superior ao admitido pelo sistema, por exemplo, para q > 0:
    • quando p > (t-1)/q : deverá ocorrer uma mensagem de erro de Overflow,
    • quando p < -(t+1)/q : deverá ocorrer uma mensagem de erro de Underflow.

Números de condição num algoritmo

  • Números de condição sem erro de arredondamento
    A aproximação linear permite estabelecer uma sequência entre os resultados parciais e o resultado final para o número de condição.
    Podemos estabelecer essa relação decompondo o cálculo de uma função em composições sucessivas, bastando mostrar para uma composição para concluir o resultado para uma sequência de composições.
     
    Seja z=f(g(x)) que decompomos em z1 = g(x); z2 = f(z1).
    Aplicando a fórmula do número de condição em cada passo,
    δz2 ≈   z1 f '(z1)
    f(z1)
    δz1 =   g(x) f '(g(x))
    f(g(x))
    δz1 ≈   g(x) f '(g(x))
    f(g(x))
      x g'(x)
    g(x)
    δx
    =   x g'(x)f '(g(x))
    f(g(x))
    δx = Pf ◦ g(x) δx
    e portanto o resultado final é exactamente o número de condição da composição, o que resumimos na seguinte proposição:
 
Proposição: Na aproximação linear, sem erros de arredondamento, a composição dos números de condição em cada passo, é igual ao número de condição da composição.
  • Números de condição com erro de arredondamento
    Ainda que a função elementar esteja bem implementada, deverá considerar-se sempre um erro de arredondamento. Por isso, para efeitos do cálculo do erro relativo num algoritmo, devemos adicionar uma parte de erro de arredondamento, em cada passo. Por exemplo, no primeiro passo:
    δz1≈ Pf(x)δx + δarr1
    e de forma semelhante nos passos seguintes, usando os cálculos dos números de condição para as funções elementares, e adicionando um termo δarrk em cada passo k do algoritmo.
 
Exemplo: Consideramos a função seno-hiperbólico,
sinh(x)=(ex − e-x)/2
definida a partir da função elementar exp , pelo algoritmo
  • z1 = exp (x);
  • z2 = 1/z1;
  • z3 = z2 − z1;
  • z4 = z3/2;
Para o estudo da propagação do erro relativo neste algoritmo, temos em cada passo:
  • δz1 ≈ x δx + δarr1;
  • δz2 ≈ − δz1arr2;
  • δz3 ≈ z1/(z1-z2z1 − z2/(z1-z2) δz2arr3;
  • δz4 ≈ δz3arr4;
as expressões podem ser substituídas, obtendo-se sucessivamente
  • δz2 ≈ − (x δx + δarr1) + δarr2;
  • δz3 ≈ ex/(ex-e-xz1 − e-x/(ex-e-xz2 + δarr3
    ≈ ex/(ex-e-x)(x δx + δarr1) − e-x/(ex-e-x) (- x δxarr1 + δarr2) + δarr3
    = x(ex+e-x)/(ex-e-xx+(ex+e-x)/(ex-e-x) δarr1 − e-x/(ex-e-xarr2 + δarr3;
  • δz4 ≈ x(ex+e-x)/(ex-e-xx +(ex+e-x)/(ex-e-xarr1 − e-x/(ex-e-xarr2arr3arr4;
A última expressão pode ser escrita na forma genérica
δz4 ≈ Pf(x) δx + Q1(x)δarr1 + Q2(x)δarr2 + Q3(x)δarr3 + Q4(x)δarr4
reparando que o coeficiente para δx é exactamente o número de condição Pf(x), enquanto que os restantes coeficientes Qm, que afectam os termos de erro de arredondamento δarrm dependem do algoritmo escolhido.
 
Observação: De facto, podemos simplificar a crescente sequência de cálculos para obter δz4 considerando desde o início δx=0.
Assim, iremos obter apenas os termos Qk(x) e o termo Pf(x) será obtido por aplicação directa da fórmula dada.
É um exercício repetir os passos anteriores e verificar que se obtém o mesmo resultado, de forma mais simples:
δz1 ≈ x δx + δarr1 = δarr1;
δz2 ≈ -δz1arr2 = -δarr1arr2;
δz3( (ex + e-xarr1 − e-xδarr2 ) /(ex-e-x) + δarr3;
δz4 ≈ δz3arr4;
e os coeficientes são exactamente os mesmos!
  • Note-se que sinh não é considerada mal condicionada em nenhum ponto x ∈ R, já que mesmo no caso x ≈ 0 obtemos
    limx→ 0 Pf(x) = 1,
    [Nota: será mal condicionada para valores grandes, |x| ≈ ∞, porque lim|x|→ ∞ |Pf(x)| = ∞ .]
  • Apesar da função ser bem condicionada para x ≈ 0, podemos ver que
    limx→ 0 Q1(x) = + ∞;   limx→ 0 Q2(x) = − ∞
    concluindo-se que os erros de arredondamento afectam o resultado de forma significativa próximo de zero.
Portanto, para além da questão do mau condicionamento, num algoritmo devemos considerar uma outra noção − a noção de instabilidade numérica.
 
Definição: Consideremos um algoritmo que usa m funções elementares para o cálculo do valor da função z=f(x), num sistema FP(β,n). A expressão do erro relativo é aproximada linearmente por
δzm ≈ Pf(x) δx + Q1(x)δarr1 + ... + Qm(x)δarrm
Se para um certo w tivermos
limx→ w |Pf(x)| = ∞ ou limx→ w |Qk(x)| = ∞ (para algum k)
dizemos que o algoritmo é numericamente instável para valores x ≈ w.
  • Apresentamos a definição explicitando o resultado para uma variável, mas é clara a extensão para algoritmos que dependam de mais variáveis. No caso de funções de duas variáveis aparecem os dois números de condição Pf x(x,y) e Pf y(x,y).
 
 
Observação: É consequência imediata da definição que mau condicionamento implica instabilidade numérica.
Assim, se é impossível resolver os problemas de mau condicionamento, sem mudar o número n no sistema FP(β,n) (o que pode ser feito em linguagens mais sofisticadas, como o Mathematica), devemos procurar evitar os problemas de instabilidade numérica, no cálculo de funções bem condicionadas. Isso pode ser feito procurando algoritmos estáveis, ou pelo menos evitando introduzir instabilidades numéricas no algoritmo.
 
Exemplos:
  • Consideramos um algoritmo para calcular f(x)=(x-1)2+1:
    z1 = x-1; z2 = x+1; z3 = z1z2; z4 = z3+1;
    onde, feitas as simplificações, resume-se ao cálculo de f(x)=x2. Esta é claramente uma função bem condicionada, com
    δf(x) ≈ 2δx.
    No entanto, como no algoritmo não a expressão não foi simplificada, o estudo de propagação de erros revela
    δf(x) ≈ 2δx + (1 − x-2) (δarr1 + δarr2 + δarr3) + δarr4
    Quando x → 0 obtemos Q1,2,3(x) = − ∞, assinalando o problema de instabilidade numérica para x ≈ 0.
    De facto podemos verificar que em qualquer sistema FP(10,n) com arredondamento simétrico, se x=10-n-1 obtemos z1 = -1; z2 = 1; e portanto z4 = 0, o que nos dá um erro relativo de 100%, ou seja z4|=1, ainda que o valor de x seja exacto e δx=0. Como para esse sistema FP sabemos, por outro lado, que a unidade de arredondamento verifica
    arr| < u = 0.5 × 101-n,
    temos z4| = 1 ≈ (2 × 10n-1) 0.5×101-n .
  • Recuperando o exemplo do seno hiperbólico, notamos que a função não tem problemas de mau condicionamento (se x ∈ R), mas quando x ≈ 0 o algoritmo apresenta instabilidade numéricas, que se manifestam nos limites de Q1 e Q2, que tendem para infinito.
    Com base na expansão de Taylor, podemos apresentar uma aproximação que contorna esse problema próximo de zero. Assim,
    sinh(x)=(ex − e-x)/2 = (1+x+x2/2+O(x3) − (1 − x+x2/2+O(x3)))/2 = x+O(x3)
    e podemos usar sinh(x) ≈ x, com um erro da ordem O(x3).
    Esse erro é desprezável para |x| < 10t num sistema FP(10,n) quando t < -n/3.
    Podemos assim estabelecer o algoritmo para o cálculo de z=sinh(x):
    • se t < -n/3 então z=x;
    • se t ≥ -n/3 então z=z4 (usando o algoritmo de sinh para z4);
Algumas conclusões:
Apesar destes cálculos de propagação não serem realizados frequentemente, é importante ter presente que:
  • (i) a representação numérica, sendo finita, está sujeita a significativos erros que podem ser propagados nos diversos passos dos algoritmos programados;
  • (ii) estes erros podem levar a resultados distorcidos, mesmo em casos muito simples, com poucas operações.

[Capítulo 1] [Capítulo 2] [Capítulo 3] [Capítulo 4] [Capítulo 5]

C J S Alves (2008, 2009)