Teoria de erros Computação 003-004 Teoria de erros Porquê? Exemplos 0.^0 -.e-0= 5.698788845643e-06 f(x,y)=333.75y 6 +x (x y -y 6 -y 4 -)+5.5y 8 +x/(y) Matlab f(7767,33096) y -.806e+0 (Matlab) Maple f(7767,33096) = -0.873960599468 (40 Digits) f(7767,33096) = 0. 0 8 (30 Digits) Resultado exacto = -0.873960599468
Erros computacionais Números em vírgula flutuante (float) Float= sinal mantissa base expoente Mantissa (< e 0.) com t dígitos, expoente com k dígitos (+). Números representados pela máquina overflow underflow -x max -x min 0 x min x max (só um conjunto finito de pontos x i =x i- (+epsilon)) Epsilon=ε M =b -t+ overflow 3 Erros computacionais Exemplos: (3.4) 0 +0.34 0 c (3 0 - + 0 - +4 0-3 ) 0 (-0.) -0. 0 4 c ( - +0 - + -3 + -4 + -5 + -6 ) 4 4
Erros computacionais Qual a causa dos erros? Nem todos os números podem ser representados A adição (+) e a multiplicação ( ) não são operações internas no conjunto dos números em vírgula flutuante 5 Causas dos erros Suponhamos uma máquina com b=0, t=4 e k= 0-0 x <0 9 Overflow x > xmax 0.935 0 6 0.347 0 4 =0.34573 0 0 >0 9 erro? Underflow x < xmin 0.543 0 6.046035 0 0 0 0 5 = < 0? 0.593 mantissa com mais do que t dígitos 0.347 0 +0.830 0 =0.78 0 guarda só 0.935 0-0.347 0 3 =0.34573 0 4 dígitos 6 3
Como é guardado o número? Truncando 0.d d d t d t+ d n β k 0.d d d t β k Arredondando 0.d d d t d t+ d n β k 0.d d d* t β k d t d * t = d t + se se d < t + β d + t β 7 Resultado Truncando Arredondando 0.78 0 0.78 0 0.78 0 0.34573 0 0.345 0 0.346 0 Erros computacionais No Matlab (b=) x min realmin = -0 y.5e-308 (aceita até () -074 =eps*realmin y4.9407e-34) x max realmax =(-eps). 04 y.7977e+308 ε M =eps=.e-06= -5 (t=53) (K=0) +epsk overflow Inf underflow 0 (se x<eps +x=) 8 4
Teoria de erros Mudança de base a b Se x é inteiro Resto= β ( x) ( x) Exemplo 0 a a ( b) = β b (5) 0 =(00) =( 4 + 3 +0 +0 + 0 ) 0 = n i= β b a i i Fr + n i= Q β b i i 5 05 0 6 0 3 9 Teoria de erros Mudança de base a b Se x é fraccionário ( x) = Exemplo 0 a n i = β b ( x) ( b) = β + βb (0.6875) 0 =(0.0) =( - +0 - + -3 + -4 ) 0 i i a a i i = Int n Fr ( i ) 0.6875.3750 0.375 0.750 0. 75. 50 0.5.0 0 5
Teoria de erros Como aparecem erros? (0.) 0 = (0.0(00)) período Com 53 dígitos como em Matlab (0.) 0 0.00000000000000000000000000000.09999999999999999673373 Erro=0.-0.09999999999999999673373 0.8 0-7 Como se representa os erros? Erro absoluto = valor exacto - valor aproximado Erro relativo = valor exacto - valor aproximado valor exacto Exemplo.7 aproxima e=.78888... com: erro absoluto erro relativo e-7.7 0.7 0 - e.7 0.063% e O erro absoluto vem nas unidades do valor exacto. O erro relativo não tem unidades e, por isso, muitas vezes é apresentado em % 6
Algumas noções. Algarismos significativos (a.s.) de um número são todos os dígitos usados na escrita com excepção dos zeros para atingir a casa das unidades. (exemplo: 0.059 tem 3 a.s.) Algarismos significativos correctos (a.s.c.) (ou exactos) Um a.s. de um número aproximado a de uma quantidade exacta A diz-se correcto se erro absoluto ε= A-a 0.5 0 -m onde m está associado à casa decimal (c.d.) ocupada pelo algarismo. 3 Algumas noções. Casas decimais (c.d.) Algarismos significativos (a.s.) Exemplos: 36.089 tem 3 c.d. e 5 a.s. 0.00356 tem 5 c.d. e 3 a.s. 3.570 0-4 tem 3+4 c.d. e 4 a.s. c.d. depende das unidades (0-4 ) a.s. não depende das unidades 4 7
Algumas noções. Algarismos significativos correctos (a.s.c.) Regras de arredondamento Exemplos: Arredondar para 4a.s.c.: 9.634 9.63 8.9773 8.98 0.67495 0.6750 Erro absoluto = 0.4 0 - ( c.d.c.) = 0.7 0-3 (3 c.d.c.) = 0.5 0-4 (4 c.d.c.) Erro relativo 0.8 0-4 (4 a.s.c.) 0.33 0-4 (4 a.s.c.) 0.74 0-4 (4 a.s.c.) 5 Relações entre os erros e os a.c. c.d.c. e erro absoluto ε. n cd.. c ε 0.5 0 n a.s.c. e erro relativo δ. δ 0.5 0 n n a. s. c. 6 8
Propagação de erros Calcule a soma de dois valores A=a+ε a e B=b+ε b A+B=(a+b)+(ε a +ε b ) soma =(a+b) ε soma = (ε a +ε b ) Exemplo: Somar π+e usando os valores aproximados 3.46 e.7 respectivamente. 3.46+.7=5.866 (c.d.c.) π+e=5.8599 ( 5.8599-5.866 0. 0 - ) 7 Propagação de erros Calcule a área de um rectângulo de lados, A=a+ε a e B=b+ε b b ε b a a b a ε b ε a area= a b b ε a ε area a ε b + a ε b ε a ε b δ area δ a + δ b 8 9
Propagação de erros Exemplos: Calcular pois 3.35 π 3.45 37.6 π 37.74 5.35 + π 5.45 π e + π com π 3.4 π 3.4 = 37.68 3 a.s. + π = +3.4 =5.4 c.d. 9 - Regras Práticas. Adições c.d. Numa adição o resultado deverá ter tantas casas decimais quantas as da parcela com menos casas decimais correctas. Produtos a.s. No produto (ou divisão) o resultado deverá ter tantos algarismos significativos quantos os do número com menos algarismos significativos correctos. Os números exactos têm um número infinito de c.d. e de a.s.. 0 0
- Aritmética em vírgula flutuante. O erro relativo cometido é ε M. Logo, se só se fizer produtos ( ), os t a.s. Podem considerar-se correctos ( ). O erro absoluto vai depender da ordem de grandeza do número. Logo, nas adições, alguns dos t a.s. podem deixar de ser correctos. Quando se faz adições e produtos, os erros introduzidos pelas adições podem fazer com que os produtos também percam a.s.. - Aritmética em vírgula flutuante. Exemplos: máquina com b=0, t=4, k=. Adição de números de ordem de grandeza diferente. Prop. comutativa não é válida. 0.3567 0 0.4985 0-3 0.3567 0 +0.48 0-3 0.356748 0 fl(soma)=0.3567 0 0.48 0-3 0.4985 0-3 0.9806 0-3 +0.3567 0 0.35679806 0 fl(soma)= 0.3568 0 É vantajoso começar por adicionar as parcelas mais pequenas.
- Aritmética em vírgula flutuante. Calcular 3774+5.874-3779. (Números exactos) fl(3774+5.874)=3780( 3779.874 ) fl(3780-3779)= ( a.s. (a.s.c)) fl(3774-3779)= - 5 (exacto) fl(5.874-5) = 0.874 (exacto) Número aproximado com 0 c.d.c. Diferença de números aproximados muito próximos faz perder a.s. Calcular (3774+5.874-3779) 7.53. (Números exactos) fl( 7.53)= 7.53 ( a.s.) fl(0.874 7.53)= 6.339 (4 a.s.c.) 7.53-6.339 0.9 (0 a.s.c.) 3 Exercício: Determinar e pela n expressão e = lim + n Programa- ficheiro limite.m n % calculo de e atraves de lim ki=input(' valor inicial de n '); k=56; e=exp(); for i=ki:5:k n=^i; % n vai ser uma potência de b=+/n; % b=+^-i c=b^n; fprintf('%d %.6f %.6f %6.f \n',i, b, c, e); end 4
Exercício: Determinar e usando limites. >> limite valor inicial de n 35 35.000000000090380.78888494890.7888845904550 40.00000000000090950.788884578090.7888845904550 45.0000000000000840.7888845900650.7888845904550 50.00000000000000090.7888845904380.7888845904550 55.00000000000000000.00000000000000000.7888845904550 >> limite valor inicial de n 5 5.0000000000000000.7888845904460.7888845904550 >> limite valor inicial de n 53 53.00000000000000000.00000000000000000.7888845904550 5 Como evitar alguns problemas de programação Exercício 5.4 Ficheiro exer54.m %(extremo inicial extremo final <) h=input('array de alturas: ); intsup=[.55:0.05:.95 Inf]; intsup=intsup-eps*; %3ª inst ocorrencias=zeros(0,); for i=:length(h) j=; while h(i)>=intsup(j) j=j+; end ocorrencias(j)=ocorrencias(j)+; end disp([(:0)' ocorrencias]) >> exer54 array de alturas: [.5;.7;.75;.73;.87] Corrida sem a 3ª instrução 0 3 0 4 5 6 7 0 8 9 0 0 0 Corrida com a 3ª instrução 0 3 0 4 0 5 6 7 0 8 9 0 0 0 intsup(4)-h()=.04e-06 6 3