Computação Numérica Computação Numérica Capítulo 2. Computação Numérica Neste capítulo serão considerados alguns aspetos básicos relativos ao cálculo numérico, como as representações de números inteiros e reais em código binário, e análise e representação dos erros que podem ocorrer em consequência do uso das referidas representações de números. 1. Cálculo numérico O Cálculo Numérico é uma metodologia para resolver problemas matemáticos através do computador, muito utilizada por engenheiros e cientistas. Uma solução obtida via Cálculo Numérico é sempre numérica, enquanto que os métodos analíticos fornecem normalmente o resultado em termos de funções matemáticas. Muito embora uma solução numérica seja uma aproximação do resultado exato, ela pode ser obtida com um elevado grau de exatidão. Uma solução numérica é calculada para problemas que não possuem solução analítica (comum nas equações diferenciais), embora os métodos analíticos forneçam, na maioria os casos, a resposta em termos de funções matemáticas. Mas, mesmo nestes casos, e quando o seu cálculo é muito caro (em tempo e recursos) pode-se obter uma solução numérica para o problema. Para computar (calcular por meio de um computador) uma solução numérica, são necessárias operações aritméticas (adição, subtração, multiplicação e divisão) e lógicas (comparação, conjunção, disjunção e negação). Considerando que estas são as únicas operações matemáticas que os computadores são capazes de realizar, então os computadores e o Cálculo Numérico formam uma combinação perfeita. Refira-se que o primeiro computador de grande porte totalmente eletrónico, o ENIAC (Electronic Numerical Integrator And Calculator), foi projetado para realizar cálculos balísticos, e os maiores supercomputadores atuais estão dedicados a realizar cálculos numéricos. 2. Representação de números 2.1. Representação de números em diferentes bases Nesta secção serão discutidos alguns métodos para a mudança de base na representação de números inteiros e reais. É comum, para grande parte dos computadores atuais utilizados na implementação computacional, o uso de uma base numérica distinta da base decimal. Em geral, os Computação Científica 21 Representação de números Computação Numérica números são armazenados na base 2 (binária), existindo ainda plataformas que os armazenam na base 8 (octal) ou na base 16 (hexadecimal). A representação de números inteiros é ligeiramente distinta da representação de números reais. 2.1.1. Representação de números inteiros De uma forma geral, um número inteiro N é representado, na base b, por um conjunto de dígitos ai, em que ai = 0,1,…, b-1 e i assume um intervalo de valores que depende da base em uso. A tabela seguinte indica estes valores para as bases mais utilizadas (onde se inclui a base decimal). b ai 2 8 10 16 0,1 0, 1, 2, 3, 4, 5, 6, 7 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F Há pelo menos duas maneiras de se representar um número inteiro N: no sistema posicional e na forma polinomial. No sistema posicional os dígitos são agrupados na forma de uma sequência, na qual a magnitude da contribuição de cada dígito no número depende da posição relativa que ocupa no número. Neste sistema, um número N é escrito com o seguinte formato: N = (an an-1 ... a1 a0)b Na forma polinomial fica claramente explicitada a contribuição de cada dígito para o valor de um número. Nesta forma, um número N é escrito com o seguinte formato: N = an bn + an-1 bn-1 + ... + a1 b + a0 Até aqui, N tem sido tratado de uma forma abstrata. No entanto, por uma questão evolutiva, N tende a ser visto como um número na base 10 (decimal), N = (an an-1 ... a1 a0) an an-1 ... a1 a0 Caso se passe a representar N sempre na base decimal, então deve-se abordar as outras representações do ponto de vista de conversões "de" ou "para" a base 10. 2.1.2. Representação de números reais É importante conhecer como os números reais podem ser armazenados num computador. Um número real pode ser representado usando dois formatos: ➔ com ponto fixo (por exemplo, 12.34); ➔ com ponto flutuante ou vírgula flutuante (por exemplo, 0.1234x10 2). 2.1.2.1. No formato com ponto fixo Na representação de um número real X no formato com ponto fixo, X é composto por uma parte inteira Xi e uma fracionaria Xf, tal que Xf = X – Xi. Por exemplo: para X = 12.34, Xi = 12 e Xf = 0.34. 22 Computação Científica Computação Numérica Representação de números 2.1.2.2. No formato com ponto flutuante A forma geral de representação de um número real no formato com ponto flutuante é semelhante à notação científica: . d1 d 2 d 3 ... dp × be , em que dk (k = 1, 2, ..., p) são os dígitos da parte fracionária (com dk { 0, ..., b-1 } e d1 ≠ 0 (normalizado), b é o valor da base (geralmente 2, 8, 10 ou 16), p é o número de dígitos e e é um expoente inteiro. Deste modo, um número no formato com ponto flutuante é composto por três partes: o sinal, a parte fracionária (denominada também de significando ou mantissa) e o expoente. Estas três partes têm um comprimento total fixo que depende do computador e do tipo de número: precisão simples, dupla ou estendida. Note-se que, como a forma de representação de um número em formato com ponto flutuante pode ser diferente entre os fabricantes de computadores, um mesmo programa implementado em computadores que utilizam formatos diferentes pode fornecer resultados diferentes. O formato utilizado pela maioria dos computadores é o proposto pelo Institute of Electrical and Electronics Engineers (IEEE), com o padrão IEEE 754 (tabela que se segue, para a base binária). Precisão Propriedade Comprimento total bits na mantissa bits no expoente sinal expoente máximo expoente mínimo maior número menor número dígitos decimais (precisão) Simples Dupla Estendida 32 23 8 1 127 -126 3.40 x 1038 1.18 x 10-38 7 64 52 11 1 1023 -1022 1.80 x 10308 2.123 x 10-308 16 80 64 15 1 16383 -16382 1.19 x 104932 3.36 x 10-4932 19 2.1.3. Conversão de números inteiros Considere-se a conversão de um inteiro da base decimal (b = 10) para a base binária (b = 2), uma vez que esta será a representação mais provável num computador. Para se realizar esta conversão de uma maneira prática, pode-se usar o método das divisões sucessivas, no qual N (na base decimal) e os sucessivos quocientes qi são divididos por 2 (base binária), sendo guardados os restos ri { 0, 1 } até que o último quociente seja qn = 1: N = 2 q1 + r0; q1 = 2 q2 + r1; q2 = 2 q3 + r2; ... ; qn-1 = 2 qn + rn-1 O último quociente somente será 0 se N = 0 (qn = 0 N = 0). Então, N = (qn rn-1 ... r1 r0)2 (sistema posicional) Computação Científica 23 Representação de números Computação Numérica N = qn 2n + rn-1 2n-1 + rn-2 2n-2 + ... + r1 21 + r0 20 (forma polinomial) O mesmo método pode também ser utilizado para converter um número inteiro em decimal N para qualquer base b; divide-se N e os sucessivos quocientes qi por b, guardando-se os restos ri { 0, ..., b-1 } até que o último quociente seja um inteiro qn { 1, ..., b-1 }: N = b q1 + r0; q1 = b q2 + r1; q2 = b q3 + r2; ... ; qn-1 = b qn + rn-1 O último quociente somente será 0 se N = 0 (qn = 0 N = 0). Então, N = (qn rn-1 ... r1 r0)b (sistema posicional) N = qn bn + rn-1 bn-1 + rn-2 bn-2 + ... + r1 b1 + r0 b0 (forma polinomial) 2.1.4. Conversão de números reais 2.1.4.1. No formato com ponto fixo Para o estudo desta caso, considere-se a conversão de um real da base decimal para a base binária, sendo depois facilmente extensível para uma qualquer base. Dado um número real X, este possui uma parte inteira Xi e uma parte fracionaria Xf. Para se converter este número X na base binária utiliza-se o método das divisões sucessivas, para converter Xi (ver secção 2.1.3), enquanto que para converter Xf usa-se o método das multiplicações sucessivas. O método das multiplicações sucessivas consiste em multiplicar-se Xf por 2, extraindo-se a parte inteira do resultado (que pode ser 0); o restante é novamente multiplicado por 2, repetindo-se o processo até que o resto fracionário seja 0 ou que se obtenha um padrão repetitivo, em cujo caso o número fracionário será periódico. Este método será ilustrado com dois exemplos. Exemplo 1: Seja Xf = 0.8125; então 0.8125 x 2 = 1.6250; 0.6250 x 2 = 1.2500; 0.2500 x 2 = 0.5000; 0.5000 x 2 = 1.0000 Ou seja, 0.8125 = (0.1101)2 . Exemplo 2: Seja Xf = 0.1; então 0.1 x 2 = 0.2; 0.2 x 2 = 0.4; 0.4 x 2 = 0.8; 0.8 x 2 = 1.6; 0.6 x 2 = 1.2; 0.2 x 2 = 0.4; ... e o processo de multiplicações sucessivas repete a sequência infinita de dígitos 0011. Portanto, 0.1 = (0.0001100110011...)2. Este caso mostra a dificuldade em se obter a representação de um número fracionário noutra base. Estes exemplos mostram que num computador, onde o espaço para representação de um número é finito, estes números terão que ser arredondados. 24 Computação Científica Computação Numérica Representação de números A forma polinomial de um número fracionário na base 2 é dada por: Xf = 1 2-1 + 2 2-2 + 3 2-3 + ... Portanto, um número real X = Xi + Xf pode ser representado na base 2 por X = an 2n + an-1 2n-1 + an-2 2n-2 + ... + a1 21 + a0 20 + 1 2-1 + 2 2-2 + 3 2-3 + ... X = (an an-1 ... a1 a0 . 1 2 3 ...)2. 2.1.4.2. No formato com ponto flutuante Considere-se um hipotético computador com dois dígitos da parte fracionária (p = 2), base b = 2 e expoente e { -1, 0, 1, 2 }. Como os números reais são normalizados, isto é, d 1 ≠ 0, todos eles são representados por: .10 2 × 2e ou .112 × 2e , e ∈ {−1, 0,1, 2}. Considerando a conversão de binário para decimal de um número positivo menor do que 1, .102 = 1 × 2−1 + 0 × 2−2 = 1/ 2 + 0 = 1/2, e .112 = 1 × 2−1 + 1 × 2−2 = 1/ 2 + 1/ 4 = 3/ 4, então, os únicos números positivos representáveis neste computador são: .102 × 2−1 = 1/ 2 × 1/2 = 1/4 .112 × 2−1 = 3/ 4 × 1/ 2 = 3/8 .102 × 20 = 1/ 2 × 1 = 1/ 2 .112 × 20 = 3/ 4 × 1 = 3/4 .102 × 21 = 1/2 × 2 = 1 .112 × 21 = 3/ 4 × 2 = 3/ 2 .102 × 22 = 1/2 × 4 = 2 .112 × 22 = 3/4 × 4 = 3 O zero é representado de uma forma especial: todos os dígitos d k da mantissa e do expoente são nulos (.002 x 20). O mais importante a reter relativamente aos números em formato com ponto flutuante é que eles são discretos e não contínuos (como um número real definido na Matemática). O conceito de existir sempre um número real entre dois números reais quaisquer não é válido para os números em formato com ponto flutuante. As consequências da falha deste conceito podem ser desastrosas, como se poderá verificar no exemplo que se segue. Considere-se as seguintes representações em binário: 0.610 = 0.100110011001...2 e 0.710 = 0.1011001100110...2 . Se estes dois números forem armazenados naquele hipotético computador (com dois dígitos para a mantissa), eles serão igualmente representados por: .102 x 20. Isto significa que tanto 0.610 como 0.710 são vistos como 0.510 por aquele computador. Esta é uma das grandes causas da ocorrência de erros de arredondamento nos processos numéricos. Computação Científica 25 Representação de números Computação Numérica 2.1.5. Aritmética de ponto flutuante Se uma operação aritmética resultar num número que seja maior, em valor absoluto, que o maior número representável, ocorrerá overflow. Se resultar num número que seja menor, em valor absoluto, que o menor número representável diferente de zero, ocorrerá underflow. O modo de tratar overflow e underflow dependerá do compilador utilizado para gerar o programa executável. Para se analisar a precisão das operações numéricas envolvendo números em formato com ponto flutuante, considere-se um hipotético computador com dois dígitos (p = 2), base b = 10 e expoente e {-5, …, 5}: .d1d2 x 10e. Quando dois números são somados ou subtraídos, os dígitos do número de menor expoente são deslocados de modo a alinhar as casas decimais. O resultado é depois normalizado (o expoente é ajustado de forma que d1 ≠ 0) e arredondado para dois dígitos (o tamanho da mantissa é p = 2). Exemplo 1: 4.32 + 0.064 Os números são armazenados no formato especificado, as casas decimais são alinhadas e a operação de adição é efetuada; o resultado é então normalizado e arredondado para dois dígitos: 4.32 + 0.064 = .43 x 101 + .64 x 10-1 = .43 x 101 + .0064 x 101 = .4364 x 101 .44 x 101. O resultado da adição é 4.4 em vez de 4.384. Exemplo 2: 372 - 371 Os números são armazenados no formato especificado, as casas decimais são alinhadas e a operação de adição é efetuada; o resultado é então normalizado e arredondado para dois dígitos: 372 - 371 = .37 x 103 - .37 x 103 = .37 x 103 - .37 x 103 = .00 x 103 .00 x 100. O resultado da subtração é 0 em vez de 1. A perda de precisão quando dois números aproximadamente iguais são subtraídos é das maiores fontes de erro nas operações de ponto flutuante. Exemplo 3: 691 + 2.71 Os números são armazenados no formato especificado, as casas decimais são alinhadas e a operação de adição é efetuada; o resultado é então normalizado e arredondado para dois dígitos: 691 + 2.71 = .69 x 103 + .27 x 101 = .69 26 x 103 + .0027 x 103 = .6927 x 103 .69 x 103. Computação Científica Computação Numérica Representação de números O resultado da adição é 690 em vez de 693.71. O deslocamento das casas decimais de 2.71 causou uma perda total dos seus dígitos durante a operação. Exemplo 4: 1234 x 0.016 Os números são armazenados no formato especificado e a multiplicação é efetuada utilizando 2p = 4 dígitos na mantissa; o resultado é então normalizado e arredondado para dois dígitos: 1234 x 0.016 = .12 x 104 x .16 x 10-1 = .12 x 104 x .16 x 10-1 = .0192 x 103 .19 x 102. O resultado da multiplicação é 19 em vez de 19.744. Exemplo 5: 875 x 3172 Os números são armazenados no formato especificado e a multiplicação é efetuada utilizando 2p = 4 dígitos na mantissa. O resultado é então normalizado e arredondado; e = 7 > 5 overflow: 875 x 3172 = .88 x 103 x .32 x 104 = .88 x 103 x .32 x 104 = .2816 x 107 overflow (e {-5, …, 5}). O resultado é superior ao maior número representável por este computador (e {-5, …, 5}). Exemplo 6: 0.00183 492 Os números são armazenados no formato especificado e a divisão é efetuada utilizando 2p = 4 dígitos na mantissa, o resultado é então normalizado e arredondado para dois dígitos: 0.00183 492 = .18 x 10-2 .49 x 103 = .18 x 10-2 .49 x 103 = .3673 x 10-5 .37 x 10-5. Exemplo 7: 0.0064 7312 Os números são armazenados no formato especificado e a divisão é efetuada utilizando 2p = 4 dígitos na mantissa. O resultado é então normalizado e arredondado; e = -6 < -5 underflow: 0.0064 7312 = .64 x 10-2 .73 x 104 = .64 x 10-2 .73 x 104 = .8767 x 10-6 underflow (e {-5, …, 5}). O resultado obtido pela divisão é inferior ao menor número representável por este comutador (e {-5, …, 5}), sem considerar o zero (que tem uma representação especial). Computação Científica 27 Representação de números Computação Numérica Uma das causas de ocorrência de erros quando se usam computadores deve-se à conversão de base. Geralmente um número é fornecido ao computador na base 10, mas é armazenado na base 2. Para os números inteiros, a representação é exata, como por exemplo, 44 10 = 1011002. Para um número real com parte fracionária pode resultar num número binário com infinitos dígitos (0.4 10 = 0.01100110...2) que tem de ser arredondado para ser armazenado em formato com ponto flutuante. 2.2. Conversão de números na base b para a base decimal 2.2.1. Conversão de números inteiros Para introduzir a conversão para a base decimal, será usada novamente a base binária como primeiro exemplo. Seja o número N, representado na base binária por N = (am am-1 ... a1 a0)2 a sua representação na base decimal pode ser obtida simplesmente pela soma do polinómio N = am 2m + am-1 2m-1 + ... + a1 2 + a0 A operacionalização desta soma pode ser obtida pelo Algoritmo de Horner e pela Divisão de Ruffini. 2.2.1.1. Algoritmo de Horner O número N pode ser obtido na base decimal através do cálculo da sequência: bm = am bm-1 = am-1 + 2 x bm bm-2 = am-2 + 2 x bm-1 ... ... b1 = a1 + 2 x b 2 b0 = a0 + 2 x b 1 e então, N = b0 Exemplo: seja o número (11101)2. Aplicando o algoritmo de Horner: b4 = a4 = 1 b3 = a3 + 2 x b4 = 1 + 2 x 1 = 3 b2 = a2 + 2 x b3 = 1 + 2 x 3 = 7 b1 = a1 + 2 x b2 = 0 + 2 x 7 = 14 b0 = a0 + 2 x b1 = 1 + 2 x 14 = 29 e então, (11101)2 = 2910 28 Computação Científica Computação Numérica Representação de números Esta metodologia pode ser generalizada para converter qualquer número inteiro na base b para a base decimal. Considere o número N = (am am-1 ... a1 a0)b a sua representação na base decimal pode ser obtida da seguinte forma: cm = am cm-1 = am-1 + b x cm cm-2 = am-2 + b x cm-1 ... ... c1 = a1 + b x c2 c0 = a0 + b x c1 e então, N = c0 2.2.1.2. Divisão de Ruffini É equivalente ao método anterior, diferindo apenas na disposição dos coeficientes a i e bi: am 2 bm am-1 ... a2 a1 a0 2 x bm ... 2 x b3 2 x b2 2 x b1 bm-1 ... b2 b1 b0 e então, N = b0 Exemplo: seja o número (11101)2. Aplicando a Divisão de Ruffini: a4 a3 a2 a1 a0 1 1 1 0 1 2 x b4 2x1 2 x b3 2x3 2 x b2 2x7 2 x b1 2 x 14 b3 1+2 b2 1+6 b1 0 + 14 b0 1 + 28 2 b4 1 e então, (11101)2 = 2910 Esta metodologia pode ser generalizada para converter qualquer número inteiro na base b para a base decimal. Considere o número N = (am am-1 ... a1 a0)b Computação Científica 29 Representação de números Computação Numérica a sua representação na base decimal pode ser obtida da seguinte forma: am b cm am-1 ... a2 a1 a0 b x cm ... b x c3 b x c2 b x c1 cm-1 ... c2 c1 c0 e então, N = c0 2.2.2. Conversão de números reais fracionários Considere um número fracionário com representação finita na base binária: Xf = (0.a1a2…an)2 . O seu valor na base decimal será dado por Xf = 1 2-1 + 2 2-2 + … + n 2-n Esta soma pode ser calculada diretamente ou utilizando qualquer um dos dois métodos enunciados na secção anterior (Algoritmo de Horner e Divisão de Ruffini) com algumas modificações. 2.2.2.1. Algoritmo de Horner No caso de um número fracionário na base 2, o algoritmo fica bn = an bn-1 = an-1 + (1/2) x bn bn-2 = an-2 + (1/2) x bn-1 ... ... b1 = a1 + (1/2) x b2 b0 = (1/2) x b1 e então, N = b0 Exemplo: converter o número (0.10111)2. b5 = a5 = 1 b4 = a4 + (1/2) x b5 = 1 + (1/2) x 1 = 3/2 b3 = a3 + (1/2) x b4 = 1 + (1/2) x (3/2) = 7/4 b2 = a2 + (1/2) x b3 = 0 + (1/2) x (7/4) = 7/8 b1 = a1 + (1/2) x b2 = 1 + (1/2) x (7/8) = 23/16 b0 = (1/2) x b1 = (1/2) x (23/16) = 23/32 e então, (0.10111)2 = 23/32 = 0.71875 30 Computação Científica Computação Numérica Representação de números 2.2.2.2. Divisão de Ruffini No caso de um número fracionário na base 2, o algoritmo fica an 1/2 an-1 ... (1/2) x bm ... bn-1 ... bn E então, a2 a1 (1/2) x b3 (1/2) x b2 (1/2) x b1 b2 b1 b0 N = b0 Exemplo: Converter o número (0.10111)2. Aplicando o algoritmo, fica: a5 a4 a3 a2 a1 1 1 1 0 1 (1/2) x b5 (1/2) x b4 (1/2) x b3 (1/2) x b2 1/2 E então, (1/2) x 1 (1/2) x (3/2) (1/2) x (3/4) (1/2) x (7/8) (1/2) x b1 (1/2) x (23/16) b5 b4 b3 b2 b1 b0 1 1 1 + 1/2 3/2 1 + 3/4 7/4 0 + 7/8 7/8 1 + 7/16 23/16 23/32 23/32 (0.10111)2 = 23/32 = 0.71875 2.2.3. Número binário infinito Uma outra situação que pode ocorrer é quando o número binário for infinito; por exemplo, através de uma sequência de dígitos periódicos: ( X f = 0,α 1 α2 ... αn β1 β2 ...βm )2 em que β1 β 2 ... βm indica que a sequência de dígitos β1 β 2 ... βm se repete infinitamente. Na base decimal, tal número é representado por Xf = 1 2-1 + 2 2-2 + … + n 2-n + b1 2-n-1 + b2 2-n-2 + … + bm 2-n-m + + b1 2-n-m-1 + b2 2-n-m-2 + … + bm 2-n-2m + + b1 2-n-2m-1 + b2 2-n-2m-2 + … + bm 2-n-3m + +... Note-se que este número pode ser escrito como Xf = 1 2-1 + 2 2-2 + … + n 2-n + ( b1 2-1 + b2 2-2 + … + bm 2-m ) 2-n + + ( b1 2-1 + b2 2-2 + … + bm 2-m ) 2-n-m + + ( b1 2-1 + b2 2-2 + … + bm 2-m ) 2-n-2m + +... Computação Científica 31 Representação de números Computação Numérica Ou seja, Xf = 1 2-1 + 2 2-2 + … + n 2-n + ( b1 2-1 + b2 2-2 + … + bm 2-m ) 2-n ( 1 + 2-m + 2-2m + … ) Usando agora a identidade, 1 / (1−x ) = 1 + x + x 2 + x 3 + ... (para |x| < 1) tem-se 1 + 2−m + 2−2m + 2−3m + ... = 1/(1 −2−m) = 2m m 2 −1 (fazendo x = 2-m), obtendo-se ( ) ( X f = α 1 2−1 + α2 2−2 + ... + α n 2−n + β 1 2−1 + β2 2−2 + ... + β m 2−m ) 2m−n 2m−1 . As duas expressões entre parênteses têm a mesma forma e podem ser calculadas diretamente ou usando qualquer um dos métodos descritos anteriormente. Em geral, um número fracionário tem representação infinita periódica na base b da seguinte forma: ( ) ( X f = α 1 b−1 + α 2 b−2 + ... + α n b−n + β1 b−1 + β2 b−2 + ... + βm b−m ) bm−n b m−1 onde as expressões entre parênteses podem ser calculadas diretamente ou utilizando qualquer um dos métodos descritos anteriormente. 2.3. Operações com números em binário Como a maioria dos computadores usa a base b = 2, então estes executam operações aritméticas com números que estão na representação binária. Para executar estas operações, as tabelas de operações que se seguem são automaticamente satisfeitas. 2.3.1. Adição binária Uma adição no sistema binário é realizada da mesma forma que a adição no sistema decimal, lembrando que, no sistema binário, há apenas 2 dígitos. Esta operação é realizada de acordo com as seguintes regras (considerando os dois operandos positivos): 0+0=0 0+1=1 1+0=1 1 + 1 = 0 (e “vai 1” para o dígito de ordem superior) 1 + 1 + 1 = 1 (e “vai 1” para o dígito de ordem superior) Para somar números com mais de 2 algarismos, utiliza-se o mesmo processo de transporte para a coluna posterior, usado na adição decimal. Ter, no entanto, atenção aos limites das palavras. 32 Computação Científica Computação Numérica Representação de números Exemplo 1: 1012 + 0112 = 10002 (510 + 310 = 810) [1] + [1] 1 0 [1] 0 1 1 1 1 0 0 0 Exemplo 2: 012 + 112 = 1002 (110 + 310 = 410) [1] + [1] 0 1 1 1 1 0 0 Exemplo 3: 10102 + 11112 = 110012 (1010 + 1510 = 2510) [1] + [1] 1 1 [1] 0 1 1 1 0 1 1 1 0 0 1 Quando um dos operandos são números binários negativos, o processo a aplicar é o seguinte: ➔ dois operandos negativos: adicionam-se os dois números considerando o valor absoluto de cada um deles e atribui-se o sinal de negativo; ➔ um deles é negativo: verifica-se qual dos dois números tem maior valor absoluto, subtraí-se o menor valor absoluto ao maior e, atribui-se o sinal do maior em valor absoluto. 2.3.2. Subtração binária A subtração é análoga à adição, sendo realizada de acordo com as seguintes regras: 0-0=0 0 - 1 = 1 (e “pede emprestado 1” para o dígito de ordem superior) 1-0=1 1-1=0 Desta forma, a operação 0 - 1 resulta em 1, mas com o transporte de 1 para a coluna à esquerda, que deve ser acumulado ao subtraendo e, por consequência, subtraído do minuendo (em a-b, a o minuendo e b é o subtraendo). Exemplo 1: 1012 - 0112 = 0102 (510 - 310 = 210) - Computação Científica [1] 1 0 0 1 1 1 0 1 0 33 Representação de números Computação Numérica Exemplo 2: 1112 - 1002 = 0112 (710 - 410 = 310) - 1 1 1 0 1 0 0 1 1 Exemplo 3: 10102 - 10012 = 00102 (1010 - 910 = 110) - 1 1 0 0 [1] 1 0 0 0 0 0 1 1 2.3.3. Multiplicação binária Procede-se como numa multiplicação no sistema decimal, de acordo com as seguintes regras: 0x0=0 0x1=0 1x0=0 1x1=1 Utiliza-se o mesmo método que a multiplicação decimal: deslocamentos e adições. O número maior deve ser colocado por cima do menor. Exemplo 1: 1012 x 0112 = 0102 (510 x 310 = 1510) + x 1 0 0 1 1 1 0 1 1 0 1 0 1 0 0 0 1 1 1 1 Exemplo 2: 110102 x 0102 = 1101002 (2610 x 210 = 5210) + 34 1 1 x 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 Computação Científica Computação Numérica Representação de números Exemplo 3: 10102 x 10002 = 10102 (1010 x 810 = 8010) + x 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 2.3.4. Divisão binária A divisão binária usa o mesmo método que a divisão decimal: deslocamento e subtrações. Exemplo 1: 1010102 1102 = 1112 (4410 410 = 1110) [1] [1] [1] 1 0 - 1 0 1 1 0 0 1 1 - 0 1 0 1 1 0 0 0 - 1 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 2.4. Representação de números em computadores digitais Nesta secção serão apresentadas algumas das representações usadas para armazenar números inteiros e reais na memória de um computador. As representações de números inteiros e reais apresentadas na secção anterior não são suficientes, pois é necessário distinguir-se, por exemplo, o sinal do número. Como não existe a representação de um sinal '+' ou '-' na memória de um computador, o recurso utilizado é acrescentar um bit, para computadores binários, ao número para representar o sinal; este bit é denominado bit de sinal. 2.4.1. Representação de números inteiros Para representar um número inteiro num computador digital, existem várias formas, tais como a representação em Sinal-Módulo e em Complemento à base. A representação em complemento pode ser de dois tipos: em complemento a (b-1) e em complemento a b (em que b é a base). 2.4.1.1. Representação em Sinal-Módulo A representação mais direta de números inteiros é a denominada Sinal-Módulo (também denominada por Sinal-Magnitude). Nesta representação, o valor absoluto do número inteiro é obtido diretamente a partir dos algoritmos discutidos na secção anterior, enquanto que o sinal é representado por um dígito adicional colocado à esquerda do número. Computação Científica 35 Representação de números Computação Numérica Quando a representação é binária, o bit de sinal ocupa a posição do bit mais significativo. Supondo que a memória do computador dispõe de q dígitos para a representação, um número inteiro na base b será representado no computador através da seguinte sequência de dígitos: aq-1 aq-2 ...a1 a0 em que { a0, a1, …, aq-2 } { 0, 1, …, b-2, b-1 } e aq-1 { 0, 1 } representa o sinal do número. Esta sequência de dígitos é denominada palavra. Por exemplo, no sistema binário convenciona-se usar aq-1 = 0 para “+” e aq-1 = 1 para “-”. A conversão do número internamente representado por a q-1 aq-2 ...a1 a0 para o sistema decimal é realizado através de uma fórmula semelhante à forma polinomial: a q−1 N = (−1) q−2 × ∑ ( ak × bk ), k=0 em que, N o número inteiro na base decimal q-2 é o índice do dígito mais à esquerda que representa o valor absoluto de N b a base, às vezes denominada de radix (um inteiro maior que 1) ak um dígito válido na representação (ak { 0, ..., b-1 }), k = 0, 1, …, q-2 aq-1 { 0, 1 } e representa o bit de sinal Os valores em questão para as quantidades expressas na fórmula anterior dependem da arquitetura e do compilador utilizado. Por exemplo, um dado compilador possui 4 modelos de representação de inteiros com 1, 2, 4 e 8 bytes, também denominados de espécies. Sendo para todos os casos b = 2, o valor absoluto do maior número inteiro que pode ser representado internamente para cada espécie Npmax , (p = 1, 2, 4, 8) é, a partir da fórmula anterior, Npmax 8p−2 = ∑ k 0 1 2 2 = 2 + 2 + 2 + ... + 2 8p−2 k=0 = 2 8p−1 { 127 (p=1) − 1 = 32767 (p=2) 2147483647 (p=4) 9223372036854775807 (p=8) 2.4.1.2. Representação em complemento a b-1 A representação de números inteiros positivos em complemento a b-1 é idêntica à representação em Sinal-Módulo. A representação dos números inteiros negativos é obtida efetuando-se: (b - 1) menos cada algarismo do número. Por exemplo, para calcular o complemento a b-1 do número -29710 (como b = 10, então o complemento a b-1 será complemento a 9); como 999 - 297 = 702, o complemento a 9 do número -297 é 702. Para se obter o complemento a b–1 de um número binário, deve-se subtrair cada algarismo de 1 (b - 1 = 1); no entanto, como se trata de números binários, para efetuar esta operação basta 36 Computação Científica Computação Numérica Representação de números inverter todos os bits. Por exemplo, o complemento a 1 (C1) do número 0011 2 (usando 4 dígitos) é 11002, pois 11112 – 00112 = 11002. A quantidade de números inteiros diferentes que se podem representar usando n posições num sistema de base b é bn. Por exemplo, na base 2, podem-se representar os seguintes números: 2 1 = 2 números com um dígito (0, 1), 22 = 4 números com dois dígitos (00, 01, 10, 11), 2 3 = 8 números com três dígitos (000, 001, 010, 011, 100, 101, 110, 111), … A tabela seguinte apresenta a representação em C1 dos números binários de 4 dígitos. Repare como o espaço de representação da base 2 com 4 dígitos está sendo usado na representação em C1 (note que há 2 representações para o zero). Decimal (positivo) Binário em C1 (igual a sinal-módulo) Decimal (negativo) Binário em C1 0 1 2 3 4 5 6 7 0000 0001 0010 0011 0100 0101 0110 0111 0 -1 -2 -3 -4 -5 -6 -7 1111 1110 1101 1100 1011 1010 1001 1000 A representação na base b = 10 com 3 dígitos varia de 000 a 999 (10 3 = 1000 representações), representando os números de -499 a -1 (faixa negativa que está compreendida entre 500 e 998) e de +1 a +499 (faixa positiva que está compreendida entre 1 e 499). O zero tanto pode ser representado por 000 como por 999. A faixa de representação em C1 dos números binários com n dígitos é a seguinte: ➔ menor inteiro negativo: -(2n-1 – 1), ➔ maior inteiro positivo: 2n-1 – 1. Na aritmética em complemento a b-1, basta somar os números, sendo que um número negativo será representado por seu complemento a b–1. Por exemplo, a soma decimal de 123 com -418 é: Sinal-Módulo -418 + 123 = -295 Complemento a 9 (b-1) -418 é representado por 999 - 418 = 581 581 + 123 = 704 999 - 704 = 295, em que 704 é o C9 de -295 (704 está na faixa negativa). De notar que nesta representação, a subtração (ou soma de um número positivo com um número negativo) transforma-se numa soma em complemento; isto é, a soma dos complementos do número Computação Científica 37 Representação de números Computação Numérica positivo com o número negativo. Portanto, uma subtração pode ser realizada simplesmente através da soma dos números “complementados”: manter o número se é positivo e complementar o número se é negativo; depois, é só somar. Desta forma, pode-se constatar que o algoritmo da soma em complemento é muito mais simples que o da soma em Sinal-Módulo, uma vez que não requer nenhum teste. No entanto, continua-se com duas representações para o zero. 2.4.1.3. Representação em complemento a b A representação de números inteiros positivos em complemento a b é idêntica às representações em Complemento a b-1 e à em Sinal-Módulo. A representação dos números inteiros negativos em complemento a b é obtida subtraindo-se da base b cada algarismo do número. Por exemplo, na base b = 10 com 3 dígitos: 1000 – x. Uma forma alternativa é subtrair cada algarismo de (b – 1), isto é, calcular o complemento a (b -1), e depois somar 1 ao resultado. Ou seja, encontramos o complemento a (b - 1) do número (o que facilita muito no caso dos números binários) e depois soma-se 1 ao resultado. Por exemplo, calcular o complemento a 10 (base = 10) do número 29710 com 3 dígitos: ➔ usando C10: 1000 – 297 = 703; ➔ representar o número em C9 e somar 1 ao resultado: 999 – 297 = 702 702 + 1 = 703. Por exemplo, calcular o complemento a 2 (base = 2) do número 00112 com 4 dígitos: ➔ usando C2: 10000 – 0011 = 1101; ➔ representar o número em C1 e somar 1: 1111 – 0011 = 1100 1100 + 0001 = 1101. Desta forma, para representar um número binário negativo em complemento a 2 (C2) consiste em subtrair cada algarismo de 1 (C1) e depois somar 1 ao resultado. A tabela seguinte apresenta a representação em C2 dos números binários com 4 dígitos. Decimal (positivo) Binário em C2 (igual a sinal-módulo) Decimal (negativo) Binário em C2 0 1 2 3 4 5 6 7 0000 0001 0010 0011 0100 0101 0110 -1 -2 -3 -4 -5 -6 -7 -8 1111 1110 1101 1100 1011 1010 1001 1000 0111 Comparando com a tabela anterior (para C1), nota-se que os números positivos têm a mesma representação de C1 e que o zero passou a ter apenas uma representação, o que permitiu representar mais um número (neste caso, mais um negativo pode ser representado). 38 Computação Científica Computação Numérica Representação de números A faixa de representação em C2 dos números binários com n dígitos é a seguinte: ➔ menor inteiro negativo: -2n-1, ➔ maior inteiro positivo: 2n-1 – 1. Na aritmética em complemento a base, basta somar os números, sendo que um número negativo será representado pelo complemento a base. Deve-se ter, no entanto, cuidado com a possibilidade de acontecer overflow. Em qualquer sistema em C2, existe sempre um limite para o tamanho dos números a serem representados. Por exemplo, quando se usam palavras de 4 bits (um para o sinal), o valor 9 não tem associado qualquer palavra; por isso não se consegue uma resposta certa para a soma de 5 com 4 (0101 + 0100 = 1001 que é -7). A adição de dois números no sistema de representação em C2 segue duas regras: 1. Somar os dois números e observar se ocorre transbordo (vai 1) sobre o bit de sinal e se ocorre o transbordo após o bit de sinal. 2. Se ocorrer um e somente um dos dois transbordos, então houve overflow; caso contrário o resultado da soma está dentro do campo de definição. As vantagens do uso do complemento de 2 é que existe apenas um zero e que as regras para soma e subtração são as mesmas. A desvantagem é o fato de ser um código assimétrico: o número de representações negativas é maior que o número de representações positivas. Por exemplo, com 8 bits podem-se representar, em complemento de 2, os números decimais entre -128 e +127. A representação de um número inteiro num computador é exata. As operações aritméticas entre números inteiros também é exata, sob as seguintes condições: a) o resultado não pode estar fora do intervalo de números inteiros que se podem representar; b) a divisão somente pode ser realizada entre números exatamente divisíveis (isto é, a parte fracionária deve ser nula). 2.4.2. Representação de números reais A representação de números reais em computadores denomina-se por representação de ponto flutuante normalizado, na qual um número é representado internamente através de uma notação científica: um bit de sinal s (interpretado como positivo ou negativo), um expoente inteiro exato e e uma mantissa inteira positiva M, sendo que apenas um número limitado de dígitos é permitido para e e M. Tomando todas estas quantidades juntas, estas representam o número x = s × (0. d1 d2 ... dn ) × be o qual está escrito numa forma legível para os seres humanos. Além das quantidades já definidas na fórmula anterior, os dígitos d1, d2, …, dn são limitados pela base b (0 di b-1, i = 1, …, n e d1 0) e o expoente é limitado ao intervalo e { emin, ..., emax }. Para além disso, n ≥ 1 é denominado de número de dígitos do sistema e define o tamanho da mantissa M = 0.d1d2...dn. Computação Científica 39 Representação de números Computação Numérica O valor zero não pode ser normalizado e tem representação especial, com mantissa nula (todos dígitos iguais a zero) e expoente o menor possível (m–1). O conjunto formado pelo zero e por todos os números em notação de ponto flutuante é chamado Sistema de Ponto Flutuante na base b com n algarismos significativos, e denota-se por F(b, n, emin, emax). Contudo, um computador apenas pode representar os valores de e e M através de dígitos na base b. Um computador digital (b = 2), por exemplo, dispõe sempre de um tamanho de palavra finito, isto é, o número total de bits que podem ser utilizados para representar o sinal s (1 bit), o expoente e a mantissa é sempre fixo, para um dado tipo de números reais. Um número real de precisão simples, por exemplo, é normalmente representado por uma palavra de 4 bytes (32 bits), sendo que 1 bit é utilizado para representar o sinal, 8 bits são utilizados para representar o expoente e os restantes 23 bits para representar a mantissa. Desta forma, tal número será representado na memória do computador como x = s e 7 e6 ... e 1 e0 d1 d2 ... d22 d23, em que s , e0 , ... , e7 , d1 , ..., d 23 ∈ { 0, 1 }. Exemplo: Considere-se dois números binários com 8 algarismos significativos em F(2, 8, -4, 5): ➔ n1 = 0 010 111001102 => (-1)0 x 22 x (0.11100110) = 3.5937510 ➔ n2 = 0 010 111001112 => (-1)0 x 22 x (0.11100111) = 3.60937510 . Observe-se que, no sistema de representação utilizado, n 1 e n2 são dois números consecutivos, ou seja, não podemos representar nenhum outro número que tenha valor intermédio. Portanto, por exemplo, a quantidade 3.60000 não tem representação exata neste sistema, sendo representada por n1 ou n2, o que gerará um erro, denominado Erro de Arredondamento. Assim, enquanto os números reais podem ser representados por uma reta contínua, em notação de ponto flutuante apenas se podem representar pontos discretos da reta real. A tabela que se segue ilustra representações de ponto flutuante para alguns números numa palavra típica de 32 bits (4 bytes), em F(2, 23, -128, 127). 40 binário (base 2) número decimal (base 10) s expoente de 8 bits Mantissa de 23 bits 1/2 1/4 1 3 0 0 0 0 00000000 (0) 11111111 (-1) 00000001 (1) 00000010 (2) 10000000000000000000000 10000000000000000000000 10000000000000000000000 11000000000000000000000 Computação Científica Computação Numérica Representação de números A conversão de um número x representado na base b para a base decimal pode ser realizada pela seguinte fórmula polinomial: n x = (−1)s × be × ∑ ( dk × b−k ). k=1 No padrão IEEE 754, a sequência de 8 bits armazena o número E = e + 127. Desta forma, evita–se o teste sobre o valor do bit para saber se o número é positivo ou negativo e, para recuperar o expoente, é realizada a operação e = E − 127. Para se obter a forma como o expoente será armazenado pode-se também trabalhar na base 10 e converter depois o resultado final. Por exemplo, se e = 5210 vai-se armazenar 12710 + 5210 = 17910 = 101100112. É importante destacar que as sequências de bits para o expoente "00000000" e "11111111" são reservadas para representar o zero e infinito (ou ocorrência de erro, NaN: not a number) respetivamente. O maior expoente é representado pela sequência 11111110 2 que, na base 10, representa o número (256 − 2)10 = 25410. Então o maior expoente é: 127 + e = 254 ⇒ e = 254 − 127 = 127. O menor expoente é representado pela sequência 00000001 2 = 110. Daí que o menor expoente é: 127 + e = 1 ⇒ e = 1 − 127 = −126. Considerando agora a representação da mantissa. Como no sistema normalizado d 1 ≠ 0 e dado que a base é 2, então primeiro dígito no sistema normalizado será sempre igual a 1 e por esta razão não é armazenado (é o denominado bit escondido). Esta normalização permite um ganho na precisão, pois pode-se considerar que a mantissa é armazenada em 24 bits. A tabela seguinte mostra os valores de n, e min, emax, Xmin, Xmax e Xeps para um dado computador que usa o padrão IEEE 754. Espécie REAL (4) REAL (8) REAL (10) n 23 52 64 emin -126 -1022 -16382 emax 127 1023 16383 Xmin 1.1754944 x 10-38 2.225073858507201 x 10-308 3.362103143112093506... x 10-4932 Xmax 3.4028235 x 1038 1.797693134862316 x 10308 1.189731495357231765... x 104932 Xeps 1.1920929 x 10-7 2.220446049250313 x 10-16 1.925929944387235853... x 10-34 Computação Científica 41 Representação de números Computação Numérica Para uma base b qualquer, os números do sistema de ponto flutuante F = F(b, n, e min, emax) contêm as seguintes características: ➔ O menor número positivo que pode ser representado neste sistema é e min x min = 0.1 × b . Valores para xmin válidos para o compilador são apresentados na tabela anterior. Isto significa que qualquer número x tal que −x min < x < x min não poderá ser representado pelo computador. Esta ocorrência é denominada de underflow. Os compiladores podem ser instruídos para - terminar o processamento neste ponto, disparando uma mensagem de erro, ou - então seguir o processamento arredondando x = 0. ➔ O maior número positivo que pode ser representado neste sistema é x max = 0.(b−1)(b−1)...(b−1) ×b e max ( ) n = (b−1) n vezes ∑ b−k b emax = (b−1)( 1 − b−n ) b emax k=1 Isto significa que qualquer número x tal que x < -xmax ou x > xmax não poderá ser representado pelo computador. Esta ocorrência é denominada overflow. Os compiladores tomam normalmente duas possíveis providências quando detetam um overflow: - param o processamento do programa emitindo uma mensagem de erro, ou - continuam o processamento atribuindo a x o valor simbólico de -Infinito ou Infinito. ➔ O maior número que pode ser somado ou subtraído a 1.0, tal que o resultado permanece inalterado (isto é, a diferença entre 1.0 e o número que lhe sucede em F), é x eps = 0.10 ... 01 × b1 − 0.1 0... 0 0 × b1 = b1−n n vezes n vezes em que xeps é denominada de epsilon da máquina, ϵ, ou de precisão da máquina. O epsilon da máquina, ϵ, também pode ser definido como o menor número de ponto flutuante, tal que: 1 + ϵ > 1. Esta quantidade que, como se pode ver, depende da base e do número de algarismos da mantissa, é da maior importância na análise de erros de arredondamento, como se verá mais adiante. De uma forma mais geral, para um número em ponto flutuante x ∈ F define-se ulp(x) = (0.00...01)b x be = b-n x be = x be. Em que ulp é a abreviatura para unit in the last place. Se x > 0, então ulp(x) é a distância entre x e o número que lhe sucede em F; se x < 0, então ulp(x) é a distância entre x e o número que o antecede em F. 42 Computação Científica Computação Numérica Representação de números Uma aproximação para o epsilon da máquina de um sistema de ponto flutuante de base b pode ser calculada com o seguinte algoritmo (assumindo que o arredondamento é para o mais próximo): 1 fazer /b 1+ enquanto ( ≠ 1) A interpretação é a seguinte: se x é uma potência negativa de b tal que x < ε então 1 + x = 1. O conhecimento de ε do sistema computacional ou máquina de calcular é fundamental. De facto, se considerarmos, por exemplo, a equação 1 + x = 1, esta admite muitas soluções em aritmética de ponto flutuante e não apenas x = 0. ➔ Apenas um conjunto finito RF de números racionais podem ser representados na forma apresentada. Os números neste conjunto são denominados números de ponto flutuante. Para uma representação normalizada (d1 ≠ 0), este conjunto contém precisamente 2(b−1) b n−1 emax − emin + 1 + 1 ( ) números racionais. Exemplo: Considere o sistema de representação numérica de ponto flutuante F(2, 4, -5, 6). Neste sistema, ➔ o menor número positivo possível é: x min = (0.1000)2 × 2−5 = 2−5−1 = 1 64 logo, a região de underflow consiste no intervalo − 1 1 < x < 64 64 ➔ O maior número positivo possível é: x max = (0.1111)2 × 26 = (1 − 2−4 ) × 26 = 60; logo, as regiões de overflow consistem nos intervalos x < −60 e x > 60. ➔ O maior número que pode ser somado ou subtraído de 1.0 e que mantém o resultado inalterado é: 1 x eps = 21−4 = 2−3 = . 8 ➔ O número de elementos em RF é: 2 × 1 × (6 + 5 + 1) × 24−1 + 1 = 193. Computação Científica 43 Análise e Representação de Erros Computação Numérica 3. Análise e Representação de Erros 3.1. Teorema do Valor Médio Para uma demonstração rigorosa da relação existente entre o crescimento ou decrescimento de uma função e o sinal da sua derivada, é necessário usar um resultado conhecido como Teorema do Valor Médio. Este teorema é um dos resultados mais importantes do cálculo diferencial, sendo usado, principalmente, na demonstração de outros teoremas. O Teorema do Valor Médio é a tradução matemática para factos que aparecem de forma vulgar em muitas situações da vida real. Por exemplo, se a média da velocidade numa viagem de automóvel entre duas cidades é de 80 km/h, então em algum momento da viagem o velocímetro do automóvel deve ter marcado 80 km. Vamos traduzir a afirmação anterior em termos matemáticos. Seja s(t) a posição do automóvel em cada instante de tempo t. Se a viagem começa em t = a (horas) e termina em t = b (horas), a velocidade média é dada por vm = s(b) − s(a) . b−a A afirmação de que, em algum momento da viagem, a velocidade instantânea deve ser igual à velocidade média, significa que para algum instante de tempo c entre a e b tem-se vm = s(b) − s(a) = v (c) = s '(c). b−a O Teorema do Valor Médio estabelece as condições mínimas que uma função s deve satisfazer para que a igualdade acima seja verdadeira. Antes de se enunciar o Teorema do Valor Médio, enuncie-se um dos seus casos particulares que ficou conhecido como teorema de Rolle (Michel Rolle, 1652-1719), que o demonstrou em 1690. Teorema de Rolle Considere-se uma função f satisfazendo as seguintes condições: 1) f é contínua no intervalo fechado [a, b] 2) f é derivável no intervalo aberto (a, b) 3) f(a) = f(b) Então, existe um valor c em (a, b) tal que, f'(c) = 0. O teorema de Rolle pode ser interpretado, geometricamente, da forma que a seguir se descreve. Seja f uma curva “suave” (contínua e derivável), não constante e que liga os pontos (a, f(a)) e (b, f(b)), tal que f(a) = f(b). Assim, se o gráfico de f sobe, então deverá descer, e vice-versa. Portanto, como a curva é “suave”, existe um ponto entre a e b onde o gráfico sofre uma inflexão (ponto de inflexão) e onde a reta tangente deve ser horizontal. 44 Computação Científica Computação Numérica Análise e Representação de Erros Teorema do Valor Médio Considere-se uma função f satisfazendo as condições: 1) f é contínua no intervalo fechado [a, b] 2) f e derivável no intervalo aberto (a, b) Então, existe um número c em (a, b), tal que f ' (x) = f (b) − f (a) b −a O Teorema do Valor Médio pode ser interpretado, em termos geométricos, da forma que se segue. Seja f é uma função “suave” que liga os pontos A = (a, f(a)) e B = (b, f(b)). Então existe um ponto c, entre a e b, tal que a reta tangente ao gráfico de f em c é paralela à reta secante que passa por A e por B. A partir do Teorema do Valor Médio pode-se enunciar vários outros resultados (corolários). Para os corolários que a seguir se enunciam, considere-se f e g contínuas no intervalo fechado [a, b] e deriváveis em (a, b). Corolário 1 (Funções com derivada zero) Se f'(x) = 0 em (a, b), então f é uma função constante em [a, b], isto é, existe um número real k, tal que, f(x) = k, qualquer que seja o ponto x de [a, b]. Corolário 2 (Funções com derivadas iguais) Suponha que f'(x) = g'(x) para todo x no intervalo (a, b). Então, f e g diferem por uma constante, isto é, existe um número real k, tal que f(x) = g(x) + k, para todo x em [a, b]. Corolário 3 (Funções crescentes e decrescentes) i) Se f'(x) > 0 para todo x em [a, b], então f é uma função crescente em [a, b]. ii) Se f'(x) < 0 para todo x em [a, b], então f é uma função decrescente em [a, b]. Corolário 4 (Teorema do valor médio generalizado) Sejam f e g contínuas em [a, b] e deriváveis em (a, b) e suponha, além disso, que g'(x) ≠ 0 para a < x < b. Então, existe pelo menos um c em (a, b), tal que f ' (c ) f (b) − f (a) . = g ' (c) g(b) − g (a) 3.2. Fontes de erros e incertezas Embora se procure sempre soluções “exatas” dos problemas reais, raramente este objetivo é atingido, devido há existência de erros e incertezas nos dados. Os erros e as incertezas nos dados podem ser introduzidos em cada etapa da formulação e da resolução dos problemas. Aqui será abordada a natureza das incertezas que surgem quando se procura a solução de um problema. Serão também examinados, com um certo grau de detalhe, os erros introduzidos pela computação numérica, destinada a determinar a solução de um problema. Computação Científica 45 Análise e Representação de Erros Computação Numérica Neste documento, não serão considerados os erros triviais que podem ser evitados, tais como copiar uma fórmula incorretamente ou efetuar um erro de sintaxe na programação, embora tais erros ocorram e perfaçam uma fração considerável do esforço e do tempo despendidos em todo o processo de resolução de um problema matemático. Desta forma, esta secção tratará apenas dos erros que resultam de forma inevitável, dada a própria natureza da representação finita de números num computador e/ou da implementação numérica de um determinado cálculo. As incertezas introduzidas contaminam a solução e é importante tentar-se balanceá-las. Se a incerteza no modelo matemático é pequena, então não faz sentido a implementação de um modelo numérico e de um método que atinja muitos dígitos de precisão, por exemplo. No decurso do processo de resolução de um problema, as incertezas ocorrem em todas as fases deste processo. 3.3. Incerteza A tomada de decisões num contexto de incerteza é certamente uma das situações mais frequentes em problemas reais, nomeadamente no planeamento de atividades em diversos campos. A incerteza é uma característica intrínseca dos problemas reais surgindo de múltiplas origens e possuindo natureza distinta. A incerteza emerge da cada vez maior complexidade das interações no interior dos sistemas sociais, económicos e técnicos, caracterizados por uma rápida evolução tecnológica, alterações nas estruturas de mercado e de novas relações sociais. Geralmente, é impraticável que os modelos matemáticos possam capturar todos os fenómenos inter-relacionados relevantes presentes, chegar até toda a informação necessária e também dar conta das alterações e/ou hesitações relacionadas com a expressão das preferências de quem decide. A incerteza pode ser proveniente de diversas fontes ou ser classificada em diferentes tipos, não sendo, em geral, adequado representar probabilisticamente todas as formas de incerteza associada a modelos matemáticos, nomeadamente se a informação disponível é para tal insuficiente. Um modelo matemático associado a um sistema real pode incluir vários tipos de incerteza, a qual pode ocorrer nos dados do modelo, na precisão do modelo usado para descrever o sistema, ou na sequência de possíveis acontecimentos que podem ocorrer num sistema de acontecimentos discretos. A importância da construção de modelos que incorporem explicitamente a incerteza está no facto de a maioria dos problemas reais não poderem ser modelados deterministicamente. Algumas razões da necessidade deste tipo de modelos são as seguintes: 1) a natural incerteza das previsões relativas ao futuro; 2) a impossibilidade de medir os conceitos do mundo real com a precisão exigida pelo modelo matemático; 3) a impossibilidade de implementar uma solução com a precisão obtida através do modelo matemático; 46 Computação Científica Computação Numérica Análise e Representação de Erros 4) a natural e constante alteração do mundo real onde a solução é implementada; 5) o facto das expressões matemáticas associadas ao modelo serem apenas traduções aproximadas dos objetivos e das restrições do problema real. Apesar de na literatura existir diversas classificações para a incerteza, esta pode ser classificada em dois tipos: aleatória e epistémica. A incerteza aleatória descreve a variação associada ao sistema real, ou ambiente em consideração, em que esta variação é normalmente causada pela natureza aleatória dos dados associados ao problema, podendo ser representada matematicamente por uma distribuição de probabilidade, desde que os dados experimentais disponíveis sejam suficientes. Este é o tipo de incerteza que tem sido alvo de mais estudos, sendo uma propriedade inerente à modelação de sistemas (ou inserida no modelo para simular este comportamento) e que não pode ser reduzida. A incerteza epistémica está associada a um certo nível de ignorância, ou informação incompleta, do sistema ou do ambiente que o rodeia. Este tipo de incerteza é usada para descrever qualquer falta de conhecimento ou informação numa qualquer fase ou atividade do processo de modelação do sistema. As causas da incerteza influenciam o tipo de informação associada ao modelo usado no tratamento da incerteza para traduzir o sistema físico em análise. São várias e distintas as causas da incerteza: falta de informação, excesso de informação, provas em conflito, ambiguidade, medições e crença. A falta de informação é provavelmente a causa mais frequente da incerteza. Existem situações em que um decisor não tem qualquer informação acerca de qual dos possíveis estados naturais irá ocorrer. Noutras, o decisor conhece apenas as probabilidades de ocorrência dos vários estados. Uma outra situação é aquela em que ninguém tem ou quer reunir informação suficiente para construir uma descrição exata do acontecimento, embora isto possa ser possível. O excesso de informação deve-se ao facto de ser limitada a capacidade do Ser Humano em perceber e processar, simultaneamente, grande quantidade de dados. Em muitas situações, são disponibilizados mais dados do que aqueles que podem ser processados; noutras, os fenómenos que são transmitidos, definidos ou descritos com um grande número de características ou propriedades. Normalmente, estes dados são processados pelo analista que os transforma em dados percetíveis, ou que centra a sua atenção apenas nos aspetos que lhe parecem ser os mais importantes (que podem não ser para o decisor) e negligenciando todos os outros dados ou informação. Podem existir várias classes de informação (importante) disponível sobre um mesmo sistema, mas em que cada uma delas aponta para diferentes comportamentos do sistema (provas em conflito). Este conflito pode acontecer devido ao facto de parte da informação disponível ao analista estar errada (mas não identificável como tal por ele), das características da informação serem irrelevantes para o sistema, do modelo que o analista tem do sistema ser incorreto, etc.. Computação Científica 47 Análise e Representação de Erros Computação Numérica Se numa situação certas informações (por exemplo, linguísticas) têm significados totalmente diferentes ou têm uma correspondência de um para vários (matematicamente falando), então dizse que existe ambiguidade. Todas as linguagens contêm palavras que, por diversas razões, têm diferentes significados em diferentes contextos. O termo medição é aqui usado no sentido de “medição em engenharia”, isto é, instrumentos para medição de aspetos físicos, tais como peso, temperatura, altura, etc.. No entanto, se uma dada propriedade exata não puder ser medida com precisão, tem-se alguma incerteza relativamente à medição real, conhecendo-se apenas uma medida indicativa. Em todas as causas da incerteza já referidas, a informação disponível ao analista é objetiva. No entanto, existem situações em que a informação disponível é subjetiva, as quais são classificadas segundo um tipo de crença numa certa circunstância. Estas situações são, talvez, as mais duvidosas de todas, pois também podiam ser classificadas como “falta de informação” no sentido objetivo. 3.4. Precisão e exatidão A precisão refere-se ao quão próximo um número representado pelo computador representa o número que ambiciona representar. A precisão de um número é caracterizada pelo número de dígitos usados na representação e na álgebra. Assim, a constante será representada com maior precisão utilizando 8 bytes do que utilizando 4 bytes, para armazenar o número. A exatidão refere-se a quão próximo um número representado pelo computador (como resultado de uma série de operações, por exemplo) está do valor correto do número que ele almeja representar. A exatidão é caracterizada pelos erros (de truncatura e de arredondamento) no método numérico utilizado. Assim, se os números 1 = 3.1416304958 e 2 = 3.1415809485 almejam representar o mesmo número = 3.141592654…, o número 2 possui maior exatidão do que 1, embora ambos possuam a mesma precisão. Os conceitos de precisão e exatidão são muitas vezes confundidos entre si. É frequente, em linguagem coloquial, referir-se à precisão quando na verdade o correto seria referir-se à exatidão de um resultado. Mais adiante, indica-se como se pode medir a exatidão de um número através do cálculo dos erros absoluto e relativo do mesmo. 3.5. Tipos de erros Durante as etapas de resolução de um problema, surgem erros de várias origens que podem alterar profundamente os resultados (soluções) obtidos. É de importância fundamental conhecer as causas desses erros para minimizar as suas consequências. Em função da origem dos erros, pode-se considerar dois tipos: a) erros exteriores ao processo de cálculo, e b) erros que ocorrem durante o processo de cálculo. 48 Computação Científica Computação Numérica Análise e Representação de Erros Os erros exteriores ao processo de cálculo podem ser - iniciais (associados aos dados e aos parâmetros do modelo), - de modelação (inerentes à construção dos modelos matemáticos), e - grosseiros (inerentes à elaboração e implementação dos algoritmos); Os erros que ocorrem durante o processo de cálculo podem ser - de arredondamento (inerentes à representação de entidades numéricas nas máquinas e às operações que um computador pode realizar), e - de truncatura (associados ao uso de métodos numéricos). Como consequência da ocorrência destes erros, as soluções numéricas obtidas são, em geral, soluções aproximadas. Definição do Problema Modelo Matemático Erros Iniciais Erros de Modelação Dados e Parâmetros do Modelo Método Numérico Erros de Truncatura Cálculo da Solução Erros Grosseiros Erros de Arredondamento Análise da Solução Erros nas diversas etapas do processo de resolução de um problema. 3.5.1. Erros iniciais (nos dados do modelo) Num modelo matemático é muitas vezes necessário usar dados e parâmetros obtidos através de medidas experimentais, os quais são traduzidos com valores aproximados. As aproximações nos dados e parâmetros podem ter grande influência no resultado final. Pode ocorrer que os dados sejam obtidos com pouca exatidão, sendo necessária a realização de testes para verificar o quanto os resultados são sensíveis às alterações dos dados fornecidos (análise de sensibilidade). Grandes alterações nos resultados devido a pequenas variações nos dados são sintomas de um mal condicionamento do modelo proposto, havendo então necessidade de uma nova modelação do problema. Um modelo matemático cuja solução obtida (resultados) é muito sensível a pequenas variações nos dados e nos parâmetros do modelo diz-me mal condicionado; por outro lado, diz-me bem condicionado se pequenas variações nos dados e parâmetros induzem sempre pequenas variações na solução. Computação Científica 49 Análise e Representação de Erros Computação Numérica 3.5.2. Erros de modelação (ou de formulação) Um modelo matemático raramente oferece uma representação exata dos fenómenos reais. Desta forma, na maioria dos casos são apenas modelos idealizados, uma vez que estudar os fenómenos da natureza implica, geralmente, aceitar-se certas condições que simplificam o problema real para o tornar resolúvel. Desta forma, pode ocorrer uma modelação incorreta, em que uma ou várias das expressões matemáticas associadas ao modelo não reflitam adequadamente o fenómeno real. Os melhores modelos são os que incluem as características do problema real necessárias para reduzir os erros a um nível aceitável. Os erros de modelação estão também relacionados com uma certa tendência de alguns analistas não completarem, com algum rigor, o modelo matemático. Nesta situação, deve-se ter consciência do facto de que se está a trabalhar com um modelo mal construído e não adequado ao problema real. Desta forma, nenhum método numérico poderá originar resultados precisos. 3.5.3. Erros grosseiros Apesar da probabilidade de um computador cometer um erro ser muito baixa, podem ser cometidos erros na elaboração do algoritmo, na sua implementação, na introdução dos dados iniciais e/ou na definição dos parâmetros do modelo. Por outro lado, executar o programa com dados iniciais cujos resultados (solução) são conhecidos, ajuda a detetar erros e a removê-los, mas demonstra, apenas, que o programa está correto para aquele conjunto de dados; por isso, é que estes dados devem ser específicos. 3.5.4. Erros de arredondamento Qualquer que seja o processo de obtenção dos cálculos, manual ou computacionalmente, há a necessidade de utilizar uma aritmética de precisão finita, ou seja, apenas se pode ter em consideração um número finito de dígitos na parte decimal dos valores envolvidos. O erro devido a desprezar os outros dígitos e arredondar o número, é designado por erro de arredondamento. De facto, um qualquer número decimal, por exemplo 0.4 10 (base 10), não pode ser representado exatamente num computador porque tem que ser convertido em binário (base 2) e armazenado num número finito de bits. O erro causado por esta imperfeição na representação de um número é o erro de arredondamento. 3.5.5. Erros de truncatura Muitas equações têm solução que apenas podem ser construídas de forma a que um processo infinito possa ser descrito como limite da solução do problema em análise. Por definição, um processo infinito não pode ser completado, pelo que tem de ser truncado após um determinado número finito de operações. Esta substituição, de um processo infinito por um finito, resulta num erro de truncatura. 50 Computação Científica Computação Numérica Análise e Representação de Erros O erro de truncatura é pois, devido à aproximação de um problema por outro, como, por exemplo, a substituição de um problema contínuo por um discreto. É sabido que, para avaliar uma função matemática no computador, apenas podem ser requeridas as operações aritméticas e lógicas, por serem as operações que ele é capaz de efetuar. Por exemplo, para avaliar f(x) = sen(x) esta tem que ser aproximada por uma série, tal como sen(x ) = 2n+1 ∞ x ∑ (−1)n (2n+1)! = x− n=0 x3 x5 x7 + − + ... , 0 ≤ x ≤ π . 6 120 5040 4 À medida que n aumenta, mais o valor da série se aproxima do valor real. A tabela que se segue mostra a diferença entre o valor obtida pela série de sen(x) e um valor mais exato, para n até 2, 3 e 4. Quando n aumenta, o erro de truncatura diminui, ficando claro que estes erros são devidos às várias truncaturas da série (ver tabela que se segue). 2n+1 ∞ x ∑ (−1)n (2n+1)! − sen(x ) n=0 x t=2 t=3 t=4 0 0 0 0 /16 2.4 x 10-6 2.2 x 10-9 1.2 x 10-12 /8 7.8 x 10-5 2.9 x 10-7 6.1 x 10-10 /6 3.3 x 10-4 2.1 x 10-6 8.1 x 10-9 /4 2.5 x 10-3 3.6 x 10-5 3.1 x 10-7 3.6. Valores aproximados e erros Ao resolver um problema numérico no computador obtém-se, em geral, um valor aproximado da solução exata do problema. Assim sendo, é importante poder avaliar-se a qualidade da aproximação, isto é, estimar ou limitar a discrepância entre a solução aproximada calculada e a solução exata. Esta qualidade pode ser medida através do cálculo dos erros absoluto e relativo. 3.6.1. Erro absoluto Seja X o valor exato de um número e fl(X) o seu valor aproximado por uma representação de ponto flutuante. O erro absoluto (EAX) é definido como o valor absoluto da diferença entre o valor exato e o valor aproximado: EAX = | X - fl(X) |. Ou seja, conhecendo-se fl(X) e EAX, pode-se afirmar que X = fl(X) EAX. Como para a maior parte dos problemas X é desconhecido, não é possível calcular o erro absoluto, sendo apenas possível estimar-se o seu valor. Computação Científica 51 Análise e Representação de Erros Computação Numérica Geralmente conhece-se a quantidade não negativa dX, tal que EAX = | X - fl(X) | ≤ dX , que se denomina por um limite superior do erro absoluto. Desta relação pode-se concluir que o valor exato pertence ao intervalo fl(X) - dX ≤ X ≤ fl(X) + dX . Por exemplo, Arquimedes estimou o valor de através da média do perímetro de polígonos que estavam contidos numa circunferência de raio unitário e de polígonos que continham a circunferência. Fazendo uso deste método, Arquimedes foi capaz de estimar π min = 3.1409... = 3 + 1137 1335 < π < π max = 3 + = 3.1428... 8069 9347 Desta forma, Arquimedes obteve erros absolutos iguais a: EA = 6.830 x 10-4 para min, EA = 1.2339 x 10-4 para pmax e, EAp = 2.7546 x 10-4 para a média entre pmin e pmax . Portanto, Arquimedes poderia afirmar que π = 1 1 πmin + πmax ± π − πmin = 3.14187 ± 0.00096. 2 2 max ( ) ( ) 3.6.2. Erro relativo Seja X o valor exato de um número e fl(X) o seu valor aproximado. O erro relativo (ERX) pode ser definido como o erro absoluto dividido por X: ER X = EA X ∣X∣ = ∣ δX X − fl( X) ≤ . X ∣X∣ ∣ Como para a maior parte dos problemas X é desconhecido, é usual substituí-lo pelo valor aproximado fl(X) no denominador da expressão para o erro relativo, como a seguinte: ER X = EA X ∣ fl( X) ∣ = ∣ ∣ X − fl(X ) ≤ fl(X) δX . ∣ fl( X) ∣ O erro relativo não tem dimensão e, em geral, só é conhecido o limite superior do seu valor, X, o qual se define da seguinte forma (limite superior do erro relativo): ERX ≤ X . A quantidade 100 ERX, expressa em percentagem, denomina-se por percentagem do erro. Voltando ao exemplo anterior, os erros relativos das estimativas de Arquimedes foram: ERp = 2.1741 x 10-4 para pmin, ERp = 3.9262 × 10-4 para pmax e, ERp = 8.7674 x 10-5 para a média. 52 Computação Científica Computação Numérica Análise e Representação de Erros Em geral, a melhor medida para se estimar a precisão de uma aproximação é o erro relativo, pois este indica diretamente o número de dígitos significativos corretos na aproximação. 3.6.3. Fórmula fundamental dos erros Considere-se um determinado problema de cálculo numérico, Y = f(X). Mesmo que seja possível executar f de forma exata, qualquer perturbação no valor dos dados irá afetar os resultados; são os erros de propagação: fl(Y) = f(f(X)). Por outro lado, mesmo que os dados sejam exatos, o método de cálculo pode ser aproximado; os resultados virão afetados de erros gerados: f ( Y) = f (X). Na maioria das vezes, ocorrem sucessivas combinações destes dois tipos de erros: f ( Y) = f (f (X)). A fórmula fundamental do cálculo dos erros serve para indicar como se propagam os erros ao longo do processo de cálculo numérico. Seja Y = f(X), onde f é uma função continuamente diferenciável em R. Admita-se que fl(Y) = f(fl(X)), isto é, fl(Y) é obtido usando aritmética exata com dados ligeiramente perturbados (fl(X)). Então, usando o Teorema do Valor Médio (TVM), obtémse os seguintes resultados: (a) EA fl (Y ) = ∣Y −fl(Y) ∣, por definição de erro absoluto = ∣f (X ) −f (fl( X)) ∣, por hipótese = ∣f '()∣ ∣X −fl( X) ∣, (X, fl(X)) (pelo TVM) = ∣f '()∣ EA X, por definição de erro absoluto EA fl (Y ) = ∣f ' ()∣ EA X (b) ER fl (Y ) = = EA fl(Y ) ∣Y ∣ , por definição de erro relativo ∣f ' ( )∣∣X −fl(X) ∣ ∣Y ∣ , pela alínea anterior = ∣X ∣ ∣f '()∣ ∣X −fl(X) ∣ ∣Y ∣ ∣X ∣ = ∣X ∣ ∣f '()∣ ER X, por definição de erro relativo ∣Y ∣ ∣X ∣∣f ' (X)∣ ER X , porque X ≈ fl(X) e (X, fl(X)) ∣f (X ) ∣ ER fl (Y ) ∣X ∣∣f '( X)∣ ER X ∣f (X ) ∣ Normalmente ∣X f ' (X)∣ é designado por número de condição de f em X e denota-se por ∣f (X) ∣ cond f(X). Este valor, cond f(x), é um indicador do efeito da propagação do erro relativo, no valor da função f no ponto X, e permite avaliar em que condições a função é bem ou mal condicionada. Computação Científica 53 Análise e Representação de Erros Computação Numérica Exemplos: Analisar os efeitos da propagação de erros nas funções xn e nx com n N. (a) f(x) = xn, com n N. cond f (x) = ∣x n xn−1 ∣ ∣x f ' (x )∣ = = n ∣f (x) ∣ ∣xn ∣ Verifica-se que a propagação do erro relativo depende apenas de n e não de x. (b) f(x) = nx, com n N. ∣ ∣x f ' (x )∣ x nx ln x ∣ cond f (x) = = = ∣x ln x ∣ ∣f (x) ∣ ∣n x ∣ Neste caso, verifica-se que a propagação do erro relativo depende de x mais do que de n. 3.6.4. Número de dígitos significativos Na contabilização do número de dígitos de um número, não se deve incluir os zeros no seu início, uma vez que estes zeros apenas ajudam a localizar a posição ideal do ponto decimal. Caso se pretenda contabilizar o número de decimais, então os zeros mais à direita do ponto decimal devem ser incluídos. Por exemplo, o número 0.00147 tem três dígitos significativos apesar de possuir cinco decimais. O número 12.34 tem quatro dígitos significativos, mas possui apenas dois decimais. Em matemática aplicada, os algarismos significativos são utilizados para monitorizar os erros ao se representar números reais na base 10. Excetuando-se quando todos os números envolvidos são inteiros (por exemplo o número de pessoas numa sala), é impossível determinar o valor exato de determinada quantidade. Assim sendo, é importante indicar a margem de erro numa medição indicando os algarismos significativos, sendo estes os dígitos com significado numa quantidade ou medição. Utilizando algarismos significativos, o último dígito é sempre incerto. Desta forma, é importante utilizá-los em trabalhos científicos. Diz-se que uma representação tem n algarismos significativos quando se admite um erro no algarismo seguinte da representação. Por exemplo, 1/7 = 0.14 com dois algarismos significativos (já que o erro está na terceira casa decimal: 1/7 = 0.1428571429). Analogamente, 1/30 = 0.0333 com três algarismos significativos (erro na quinta casa decimal). Os algarismos significativos são o conjunto de algarismos corretos de uma medida mais um último algarismo, que é o duvidoso (zeros à direita são algarismos significativos e zeros à esquerda não são). Dada uma representação decimal: 1. O algarismo zero que correspondem às ordens maiores não são significativos. Exemplos: em 001234.56 os dois primeiros zeros não são significativos, o número tem seis algarismos significativos; em 0.000443 os quatro primeiros zeros não são significativos, o número tem três algarismos significativos. 54 Computação Científica Computação Numérica Análise e Representação de Erros 2. O algarismo zero que corresponde às menores ordens, se elas são fracionárias, são significativos. Exemplo: em 12.00 os dois últimos zeros são significativos, o número tem quatro números significativos. 3. Os algarismos de 1 a 9 são sempre significativos. Exemplos: em 641 o número tem três números significativos; em 38.984 o número tem cinco algarismos significativos. 4. Zeros entre algarismos de 1 a 9 são significativos. Exemplo: em 1203.4 todos os cinco algarismos são significativos. 5. Os zeros que completam números múltiplos de potências de 10 são ambíguos: a notação não permite dizer se eles são ou não significativos. Exemplo: 800 pode ter um algarismo significativo (8), dois algarismos significativos (80) ou três algarismos significativos (800). Esta ambiguidade deve ser corrigida usando-se notação científica para representar estes números, 8x102 tem um algarismo significativo, 8.0x102 tem dois algarismos significativos e 8.00x102 tem três algarismos significativos. 6. As constantes têm um número arbitrariamente elevado de algarismos significativos; exemplos: o coeficiente 3 no cálculo do valor médio: (1.84 + 1.72 + 1.66) / 3; o número π. Exemplos: - 0.00023: tem dois algarismos significativos, que são 23; - 052.6: tem 3 algarismos significativos; - 0.000200: tem três algarismos significativos, já que tem zeros à direita; - 755555.66: tem 8 algarismos significativos. Quando se trabalha com uma representação de um número obtida por meio de um processo de arredondamento, uma forma alternativa para se estimar a qualidade da aproximação (ou a exatidão do número), consiste em calcular o número de dígitos significativos corretos da representação. Se fl(X) é uma aproximação de X então diz-se que fl(X) aproxima X com k dígitos significativos se EA X = ∣X − fl(X)∣ ≤ 1 s+1−k b , 2 em que s é tal que bs |X| bs+1 . O dígito significativo do valor aproximado que se encontra mais à esquerda é chamado de digito mais significativo e o mais à direita de digito menos significativo. O número de dígitos significativos de um valor aproximado dá boa informação sobre a qualidade dessa aproximação. Existe uma relação entre o número de dígitos significativos de um valor aproximado de um número e o erro relativo desse valor. Com efeito, se fl(X) é uma aproximação para X com k dígitos significativos corretos numa representação de base b, então ER X = ∣ ∣ X − fl(X ) 1 −k+1 ≤ b X 2 onde k é o maior número inteiro positivo para o qual a desigualdade acima é verificada. Computação Científica 55 Análise e Representação de Erros Computação Numérica Exemplo: sejam b = 10, X = 1/6 e fl(X) = 0.16667; então ER X = ∣ ∣ 1/ 6 − 0.16667 1 = 2 × 10−5 ≤ × 10−5+1 . 1/6 2 Ou seja, o número de dígitos significativos em fl(X) é k = 5. 3.7. Erros de arredondamento O tamanho finito da palavra utilizada num computador digital para a representação de números de ponto flutuante provoca o aparecimento de diversos tipos de erros. Uma estratégia para reduzir estes erros, usada na maioria dos computadores, consiste em utilizar números de ponto flutuante normalizados, isto é, números cuja mantissa M está sempre dentro do intervalo b−1 = 1 ≤ M < 1 = b 0, b ou seja, 0.5 M 1 para computadores de base b = 2. Esta estratégia diminui o número de zeros à direita do ponto e maximiza o número de dígitos não nulos utilizados para representar um dado número. No entanto, mesmo num sistema com representação normalizada, nem todos os números reais podem ser representados. Utilizando o exemplo do sistema F(2, 4, -5, 6), o número racional y = 0.12345999... não pode ser exatamente representado. A forma de y na base 2 é: y = 0.12345999... = (0.000111111001101...)2. Para escrever y de acordo com o sistema F(2, 4, -5, 6), deve-se primeiro normalizar de acordo com as operações: y = 2−4 + 2−5 + 2−6 + 2−7 + 2−8 + 2−9 + 2−12 + 2−13 + 2−15 + ... = 2−3 × (2−1 + 2−2 + 2−3 + 2−4 + 2−5 + 2−6 + 2−9 + 2−10 + 2−12 + ... ) = ( 0.111111001101... ) × 2−3, o qual está agora na forma normalizada. De acordo com a expressão apresentada na secção 2.4.2 (pág. 39), então podemos identificar M = 0.111111001101... ; e = -3. Contudo, para o sistema F(2, 4, -5, 6), pode-se usar apenas 4 dígitos na mantissa. Desta forma, uma possível aproximação para y é: fl(y) = (0.1111) x 2-3, o qual corresponde ao seguinte número na base 10: fl(y) = 0.1171875… , resultando nos seguintes erros absoluto e relativo: EAy = 6.27249 x 10-3 ERy = 5.08058 x 10-2 56 Computação Científica Computação Numérica Análise e Representação de Erros Considere-se um número X na forma normalizada que não possua representação exata no sistema F(b, n, emin, emax). Sejam X o menor número representável no sistema menor que X e X o maior número representável no sistema maior que X. Então, X X X Pode-se escrever X como X = 0.d 1 d 2 ... dn dn+1 ... be = 0.d1 d2 ...d n b e + 0.0 ... 0dn+1 ... be = ( ) ( ) = 0.d1 d2 ... dn b e + 0. dn+1 ... b e−n. ( ) ( ) Ou seja, X = 0. d1 d2 ... dn b e + g X b e−n ( ) com ( g X = 0.dn+1 ... ) ∣g X ∣ < 1 e em que gX be-n é a parcela de X que não é incluída na sua representação. Existem duas formas de se realizar a aproximação: arredondamento por defeito (ou corte do número) e simétrico. 3.7.1. Arredondamento por defeito (ou corte do número) O arredondamento por defeito consiste simplesmente em ignorar gX. Assim, fl(X ) = 0. d1 d2 ... dn b e ( ) o qual é representável no sistema. Neste caso, o erro absoluto cometido por corte é EA X = ∣X − fl(X) ∣ = g X b e−n < be−n ∣ ∣ pois |gX| < 1, obtendo-se, desta forma, um limite superior para o erro absoluto. O erro relativo cometido por corte é ER X = EA X ∣fl(X) ∣ = g X be−n ( b−n = < = b1−n e −1 0. d d ...d 0. d1 d2 ...d n b b 1 2 n pois 0.d 1 d 2 ... dn ≥ b−1 e ( ) g X b e−n b−e ) ( ) ∣ gX ∣ < 1, obtendo-se, desta forma, um limite superior para o erro relativo, ao qual também se dá o nome de unidade de erro de corte. Desta forma, podem ser enunciados os resultados que se seguem, relacionando o número de dígitos significativos de um valor aproximado de um número com o seu erro relativo. Teorema: Se o dígito mais significativo do valor aproximado de um número é d 1 ≠ 0 e se esse valor tem k dígitos significativos, então o seu erro relativo não excede b1-k. Computação Científica 57 Análise e Representação de Erros Computação Numérica Corolário: Se o erro relativo do valor aproximado de um número não excede (1/2) b-k, então esse valor tem k dígitos significativos. Para o exemplo anterior, no sistema de representação F(2, 4, -5, 6), pode-se escrever: y = ( 0.1111) 2−3 + g y 2−3−4 , sendo gy = (0.11001101...) Então, efetuando o arredondamento por defeito obtém-se fl(y). 3.7.2. Arredondamento simétrico No arredondamento simétrico, executa-se a seguinte operação: fl(X ) = { { 1 se g X < 2 1 e 0. d1 d2 ...(dn+1) b , se g X ≥ 2 ( 0. d1 d2 ... dn) b ( e ∣ ∣ , ∣ ∣ ) Neste caso, o erro absoluto cometido por arredondamento simétrico é EA X = 1 se g X < 2 1 g X − 1 be−n , se g X ≥ 2 ∣gX ∣ be−n , ∣ ∣ ∣ ∣ ∣ ∣ ( < ) 1 e−n b , 2 de onde se obtém uma estimativa superior para o erro absoluto. O erro relativo cometido por arredondamento simétrico é ER X = { 1 e−n b 2 ( 0.d 1 d 2 ... dn) b ( e 1 se g X < 2 ∣ ∣ , 1 e−n b 2 1 , se g X ≥ 2 0.d 1 d 2 ...(dn +1) b ) e ∣ ∣ ( < 1 e−n b 2 e ( 0.1)b b = ) 1 1−n b 2 o qual fornece uma estimativa superior para o erro relativo, ao qual também se dá o nome de unidade de erro de arredondamento. No exemplo acima, como gy > 1⁄2, deve-se somar 1 ao dígito d4 resultando, fl(y ) = (0.1111) 2−3 + (0.0001) 2−3 = (1.0000) 2−3 = (0.1000) 2−2, Neste caso, obtém-se fl(y) = 0.125, que possui um erro relativo de ER Y = ∣0.12345999 – 0.125 ∣ = 1.232×10−2; ou seja, 1.23% de y, ∣0.12345999 ∣ o que é bem menor que o obtido com o arredondamento por defeito, que foi de 5.08%. 58 Computação Científica Computação Numérica Análise e Representação de Erros Os computadores mais recentes modificam ligeiramente o arredondamento em relação à fórmula apresentada antes. Nesta, o último dígito significativo (d n) não será alterado se |gX| < 1⁄2 e será alterado se |gX| ≥ 1⁄2. Há, portanto, uma ligeira preferência para a alteração de d n no processo de arredondamento, o que insere um erro sistemático no processo. Atualmente, se |g X| = 1⁄2, o valor de dn será alterado somente em metade das situações, segundo algum critério. Este critério pode ser, por exemplo, a paridade de d n. Assim, para b = 10, o número 12.5 seria arredondado para 12, enquanto que 13.5 seria arredondado para 14 (critério denominado por arredondamento par). 3.7.3. Erros de arredondamento na álgebra de ponto flutuante A fórmula fundamental do cálculo dos erros pode ser usado para calcular os limites superiores dos erros absoluto e relativo das operações fundamentais. Para além dos erros resultantes da representação no computador de números no formato com ponto flutuante, também as operações algébricas, que necessariamente são realizadas pelo computador, introduzem erros no resultado destas operações, e que tendem a acumular-se à medida que o número de operações de ponto flutuante são realizadas no computador. O exemplo seguinte ilustra o aparecimento deste tipo de erros. Suponha-se que se está a usar um sistema numérico de base 10 com 5 dígitos na mantissa. Pretende-se calcular o valor da função f ( x) = 1 − cos(x ) sen(x ) , para x = 0.007. = sen(x ) 1 + cos(x ) Existem funções intrínsecas do compilador que calculam o valor das funções trigonométricas dentro da precisão disponível, através de um processo de arredondamento. Assim, sen(0.007) = 0.69999 × 10−2 e cos (0.007) = 0.99998 A primeira expressão para f(x) fornece: f ( x) = 1 − cos(x ) 1−0.99998 0.2 × 10−4 = = = 0.28572 × 10−2 −2 −2 sen(x ) 0.69999 × 10 0.69999 × 10 enquanto que a segunda expressão fornece f ( x) = sen(x ) 0.69999 × 10−2 = = 0.35000 × 10−2 1 + cos(x ) 1 + 0.99998 sendo que este último resultado é o correto, dentro da precisão de 5 dígitos disponível. O erro relativo entre o primeiro valor (errado) e o segundo (correto) é de 22.5%. Na primeira expressão, devido à escolha feita na precisão, restou somente um dígito relevante no numerador após a subtração. Isto levou a uma perda de precisão e a um resultado erróneo devido ao cancelamento de dois números muito próximos entre si. Este problema seria evitado caso o sistema de representação dispusesse de, pelo menos, mais um dígito significativo na mantissa; porém, o que importa frisar aqui é que muito facilmente este tipo de erro de arredondamento ocorre, devido ao tamanho finito Computação Científica 59 Análise e Representação de Erros Computação Numérica da palavra no computador. Por outro lado, caso fosse solicitado o valor de f(x) para x ≈ , seria a segunda expressão que forneceria um valor incorreto e a primeira a fornecer um valor correto. Este exemplo demonstra a perda de precisão numérica devida a erros de arredondamento, onde o número de dígitos significativos é reduzido na subtração de dois números próximos entre si (este efeito designa-se por cancelamento subtrativo). Isto mostra que não é possível confiar cegamente no cálculo realizado, devendo-se sempre analisar cuidadosamente o algoritmo usado na procura de possíveis fontes de erros. Desta forma, é importante conhecer-se como se propagam os erros nas operações aritméticas: adição, subtração, multiplicação e divisão. 3.7.3.1. Adição a) Erro absoluto: EA X+Y = ∣(X + Y) −(fl(X ) + fl(Y )) ∣ = ∣(X −fl(X )) + (Y −fl(Y )) ∣ ≤ ∣X −fl(X) ∣ + ∣Y −fl( Y) ∣ = EA X + EA Y O erro absoluto da soma de dois números é limitada pela soma dos erros absolutos individuais. b) Erro relativo: ER X+Y = EA X+Y ∣X + Y ∣ ≤ EA X + EA Y ∣X + Y ∣ = EA X ∣X ∣ ∣X ∣ ∣X + Y ∣ + EA Y ∣Y ∣ ∣X ∣ ∣Y ∣ = ER X + ER Y ∣Y ∣ ∣X + Y ∣ ∣X + Y ∣ ∣X + Y ∣ Considerando que { ER = max ER X , ER Y } conclui-se que ER X+Y ≤ ER. O erro relativo da soma de dois números é limitada pelo maior dos seus erros relativos. 3.7.3.2. Subtração a) Erro absoluto: EA X−Y = ∣( X −Y ) −(fl(X) −fl(Y )) ∣ = ∣(X −fl(X )) −(Y −fl( Y)) ∣ ≤ ∣X −fl(X) ∣ + ∣Y −fl( Y) ∣ = EA X + EAY O erro absoluto da subtração de dois números é limitada pela soma dos seus erros absolutos. b) Erro relativo: ER X−Y = EA X−Y ∣X −Y ∣ ≤ EA X + EA Y ∣X −Y ∣ = EA X ∣X ∣ ∣X ∣ ∣X −Y ∣ + EA Y ∣Y ∣ ∣X ∣ ∣Y ∣ = ER X + ER Y ∣Y ∣ ∣X −Y ∣ ∣X −Y ∣ ∣X −Y ∣ Fenómeno de cancelamento subtrativo: Quando se subtraem quantidades muito próximas (diferença X – Y pequena) o erro relativo pode ser muito elevado. 60 Computação Científica Computação Numérica Análise e Representação de Erros 3.7.3.3. Multiplicação a) Erro absoluto: ER XY EA X ∣fl(Y) ∣ + EA Y ∣fl(X ) ∣ b) Erro relativo: ER XY ER X + ER Y Uma estimativa para o erro relativo na multiplicação é dada pela soma dos erros relativos dos operandos (desde que estes venham afetados por um erro relativo pequeno). 3.7.3.4. Divisão a) Erro absoluto: ER X /Y EA X ∣fl(Y ) ∣ + EA Y ∣fl(X) ∣ fl(y )2 b) Erro relativo: ER X /Y ER X + ER Y Uma estimativa para o erro relativo na divisão é dada pela soma dos erros relativos dos operandos (desde que estes venham afetados por um erro relativo pequeno). 3.8. Erros de truncatura Além dos erros de arredondamento que se cometem durante os cálculos, outros erros, os chamados erros de truncatura, surgem com a utilização de certos métodos numéricos para a resolução do problema matemático. Assim, a substituição de um problema contínuo por um problema discreto ou de um processo de cálculo infinito por um finito, de modo que o método de resolução envolva apenas uma sequência finita de operações aritméticas, originam estes erros. O erro de truncatura é a diferença entre o resultado exato (obtido com os dados disponíveis usando um método analítico/exato) e o resultado aproximado (obtido com um método numérico que calcula uma solução aproximada a partir dos mesmos dados). São exemplos deste tipo de processos de cálculo aproximados a truncatura de séries infinitas, a substituição de derivadas por diferenças finitas ou o terminar de uma sequência iterativa antes da convergência. Muitos métodos numéricos baseiam-se em processos de cálculo envolvendo séries infinitas, em que apenas é possível considerar um número finito de parcelas; isto é, o processo de cálculo é truncado (cortado) num certo ponto do seu desenvolvimento. Computação Científica 61 Análise e Representação de Erros Computação Numérica 3.8.1. Cálculo de valores de funções transcendentes As funções racionais são as únicas cujos valores podem ser calculados usando apenas uma sequência finita das 4 operações aritméticas básicas. As funções transcendentes devem ser aproximadas por funções racionais para que as aproximações aos seus valores possam ser calculados no computador. Por exemplo, da fórmula de Taylor com resto para sen(x) tem-se: sen(x ) = x − x3 x5 x 7 x 2n−1 + − + ... + (−1)n−1 + R 2n (x), 3 ! 5! 7 ! (2n−1)! onde R2n (x ) = (−1)n x 2n sen(), (2n)! ∈ [0, x ]. Definindo p7 (x ) = x − x3 x5 x7 + − 3! 5! 7! quando se usa p7(p/4) para aproximar sen(p/4) o erro de truncatura é R 8(p/4). Note-se que |R8(p/4)| < 0.3E-5 e p7(p/4) ≈ 0.70711 é uma aproximação para sen(p/4) com 5 algarismos significativos. 3.8.2. Discretização Ao usar-se o teorema do valor médio para aproximar o integral de f(x) tem-se b n−1 ∫ f ( x) dx = h ∑ a i=0 f ( xi) + R , com x 0 , x 1 , ..., x n ∈ [ a, b] , x 0 = a , x i = a + i h (i=1,2, ... ,n) e h=(b−a)/n, onde, pelos teoremas do valor médio para integrais e do valor médio para a soma se tem R = (h/2) (b – a) f'(), [a, b]. Se R for suficientemente pequeno, então b n−1 ∫ f ( x) dx h ∑ a i=0 f (x i ). Ao usar-se a expressão da direita para calcular um valor aproximado para a expressão da esquerda está-se a substituir o problema contínuo do cálculo do integral pelo problema discreto do cálculo da soma. O erro que se originou, R, é o erro de truncatura. 62 Computação Científica Computação Numérica Análise e Representação de Erros Por exemplo, para o integral 0.1 ∫ e−x 2 dx 0 ter-se-à 0.1 ∫ e−x 2 2 2 2 dx 0.01 [e−0 + e−0.01 + ... + e−0.09 ] 0.0997. 0 Neste caso, 2 R = (0.01/ 2) (0.1 −0.0) (−2 e− ), ∈ [ 0,0.1] ou |R| < 10-4. 3.9. Condicionamento e estabilidade Devido à existência dos chamados erros iniciais, os dados e parâmetros do modelo matemático não coincidem, em geral, com os dados e parâmetros do problema real. Assim, se a solução exata do problema real for muito diferente da solução exata do modelo matemático, seja qual for o método usado para o resolver, os resultados obtidos não terão interesse. Um modelo matemático cuja solução é muito sensível a variações nos seus dados e parâmetros diz-se mal condicionado (ou matematicamente instável). Um problema diz-se bem condicionado (ou matematicamente estável) se pequenas variações nos dados e parâmetros induzem sempre pequenas variações na solução. Por exemplo, considere-se a equação 1 1 x2 − x + = 0, 3 36 cujas raízes são x1 = x2 = 1/6. A equação seguinte não tem raízes reais: x2 – 0.333333 x + 0.027778 = 0, Os coeficientes da segunda equação são aproximações dos correspondes da primeira, com erros absolutos inferiores a 0.5E-6. Aqui, uma pequena variação nos coeficientes da equação origina uma grande variação na solução. Notar que a “diferença” entre os dois problemas é induzida pela representação da primeira equação num sistema de ponto flutuante de um computador. A resolução de um problema numérico requer, em geral, a execução de um grande número de operações aritméticas e, originando cada uma delas um erro de arredondamento, a acumulação destes erros pode afetar significativamente o resultado obtido. Um método numérico diz-se instável, ou que apresenta instabilidade induzida, se a acumulação dos erros durante o cálculo pode ter grande influência no resultado final. Um método estável produz sempre bons resultados (com problemas bem condicionados). Computação Científica 63 Análise e Representação de Erros Computação Numérica 3.10. Análise de erros No decurso da resolução numérica de um problema matemático num computador ocorrem erros. Para estimar ou limitar o efeito da acumulação desses erros nos resultados obtidos deve ser feito a análise de erros. Existem algumas técnicas de análise de erros, tais como a direta e a inversa. Um algoritmo numérico define uma sequência finita de operações aritméticas. É assim possível, teoricamente, usando limites para os erros, limitar ou estimar a cada passo o erro do resultado intermédio e consequentemente o erro do resultado final. A esta forma de analisar os erros, dá-se o nome de análise de erros direta. Na análise de erros inversa o resultado calculado de um problema numérico é interpretado como o resultado exato do problema que resulta de uma alteração nos dados e parâmetros do problema real. 64 Computação Científica