Universidade Federal de São João Del Rei - UFSJ Instituı́da pela Lei 10.425, de 19/04/2002 - D.O.U. de 22/04/2002 Pró-Reitoria de Ensino de Graduação - PROEN Disciplina: Prof: Cálculo Numérico Ano: 2013 Natã Goulart da Silva Versão Documento 0.91 Análise de Erros Numéricos Sumário 1 Introdução 2 2 Representação dos Números 2.1 Decomposição de números . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 3 Conversão de números entre bases 3.1 Binário para decimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Decimal para binário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 4 Notação de Ponto Flutuante 4.1 Representação de Números em Ponto Flutuante 4.2 Aritmética de Números em Ponto Flutuante . . 4.3 Erros na representação dos Números . . . . . . 4.4 Operações Aritméticas em Ponto Flutuante . . . 4 4 5 7 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Algarismos Significativos 10 6 Análise de Erros 6.1 Erros Absolutos e Relativos . . . . . . . . . . . . . . . . 6.2 Erros de Cancelamento . . . . . . . . . . . . . . . . . . . 6.3 Erros de Arredondamento e Truncamento em um Sistema 6.4 Propagação dos Erros . . . . . . . . . . . . . . . . . . . . 11 11 12 13 14 . . . . . . . . . . . . . . . . . . . . Ponto Flutuante . . . . . . . . . . . . . . . . . . . . . . 7 Considerações Finais 17 Referências 17 1 1 Introdução Na solução de problemas através de métodos numéricos, após as fases de definição, modelagem, escolha e implementação, verifica-se algumas vezes que os resultados obtidos não apresentam valores dentro de uma faixa esperada. Dentre outros fatores, os resultados dependem da precisão dos dados de entrada, da forma como estes dados são representados no computador e das operações numéricas efetuadas. Os dados de entrada apresentam imprecisões devido a, por exemplo, falhas no processo de medição e na aquisição destes dados. Para a disciplina de Cálculo Numérico, serão objeto de estudo os erros devido a modelagem e implementação dos métodos numéricos e neste capı́tulo, em especial, dos erros causados pela representação e operações envolvendo números no computador. As informações contidas neste documento são notas de aula retiradas dos livros citados na seção Referências [1, 2, 3]. 2 Representação dos Números A representação de um número depende da base escolhida e do número de dı́gitos utilizados nesta representação [3]. As bases mais utilizadas são a binária, a decimal e a hexadecimal. Existem números como o π que não podem ser representados por um número finito de dı́gitos na base decimal. Então, independente do número de dı́gitos utilizados em cálculos com o π, o resultado desta operação nunca será exato. Quanto maior o número de dı́gitos utilizados, maior será a precisão obtida. Quando são realizados cálculos numéricos em um computador, os valores de entrada são normalmente fornecidos pelo usuário na base decimal. Toda informação é convertida para a base binária, são realizadas as operações e o resultado é convertido para a base decimal e apresentado para o usuário. As transformações entre as bases podem ser fontes de erros, porque um número pode ter representação finita em uma base e não ter representação finita em outra. Esta caracterı́stica gera erros numéricos no processo de transformações entre bases e será apresentada melhor na seção com exemplos de operações de mudanças de base. 2.1 Decomposição de números Em geral, um número qualquer formado por n algarismos pode ser decomposto por uma soma de cada um de seus algarismos multiplicado por uma potência. A potência depende da base em que o número é representado. Como exemplo, seja o número 1537 representado na base decimal. Para identificar a base, iremos escrever o número entre parênteses indexado pela sua base. Exemplo: (1537)10 = 1 ∗ 103 + 5 ∗ 102 + 3 ∗ 101 + 7 ∗ 100 O mesmo procedimento pode ser realizado para números em outras bases e números com parte fracionária. 2 Exemplo: (36, 189)10 = 3 ∗ 101 + 6 ∗ 100 + 1 ∗ 10−1 + 8 ∗ 10−2 + 9 ∗ 10−3 (10, 11)2 = 1 ∗ 21 + 0 ∗ 20 + 1 ∗ 2−1 + 1 ∗ 2−2 (21, 03)4 = 2 ∗ 41 + 1 ∗ 40 + 0 ∗ 4−1 + 3 ∗ 4−2 3 3.1 Conversão de números entre bases Binário para decimal Para realizarmos a conversão de um número em qualquer base para um número na base decimal devemos usar a multiplicação de cada um de seus algarismos pela potência igual a base. Considerando números inteiros, o primeiro algarismo a direita, deve ser multiplicado pela base elevada a zero. O próximo algarismo, o segundo da direita para a esquerda, deve ser multiplicado pela base elevada a um, e assim por diante. Números fracionários terão suas potências elevadas a -1, -2, -3, ..., a partir do algarismo à direita da vı́rgula. De um modo geral, um número na base β, (aj aj−1 ...a2 a1 a0 )β , 0 ≤ ak ≤ (β − 1), k = 0, 1, 2, ..., j, pode ser escrito na forma polinomial aj β j + aj−1 β j−1 + ... + a2 β 2 + a1 β 1 + a0 β 0 No exemplo a seguir, temos inicialmente a transformação de um número inteiro na base binária para a base decimal e posteriormente transformações de números na base 2 e 4 fracionários para a base decimal. Exemplo: (10111)2 = 1 ∗ 24 + 0 ∗ 23 + 1 ∗ 22 + 1 ∗ 21 + 1 ∗ 20 = (23)10 (10, 11)2 = 1 ∗ 21 + 0 ∗ 20 + 1 ∗ 2−1 + 1 ∗ 2−2 = 2 + 0 + 0, 5 + 0, 25 = 2, 75 (21, 03)4 = 2 ∗ 41 + 1 ∗ 40 + 0 ∗ 4−1 + 3 ∗ 4−2 3.2 Decimal para binário A transformação de um número inteiro na base decimal para um número na base binária é realizada dividindo-se este número sucessivamente por dois até que o quociente da divisão seja menor que 2. Como exemplo, consideremos a transformação do número (40)10 para a base binária. Exemplo: 40 2 0 20 2 0 10 2 0 5 2 1 2 2 0 1 3 Ao término da divisão, temos o número na base binária partindo do último quociente e posteriormente os restos das divisões da parte inferior para a superior. Desta forma, o resultado da transformação anterior é: (40)10 = (101000)2 Para transformar números decimais com dı́gitos após a vı́rgula em números na base binária devemos proceder de duas maneiras. A parte inteira deste número deve ser transformada como citado anteriormente, através da aplicação de divisões sucessivas. Para transformar os dı́gitos decimais a direita da vı́rgula para binário, deve-se multiplicá-los por 2. Do resultado, considerase a parte a esquerda da vı́rgula como resultado parcial da transformação e deve-se proceder o processo de multiplicação da parte fracionária até que seja obtido o valor 0 após a vı́rgula, ou até verificar que o número não pode ser armazenado de maneira exata. Seja o exemplo de transformar o número (40, 1875)10 para binário. A transformação da parte inteira já foi calculada, vejamos agora o cálculo da parte fracionária: 0, 1875 ∗2 0, 375 0.75 ∗2 ∗2 0, 3750 0, 75 1, 50 0.50 ∗2 1, 00 Assim, (40, 1875)10 = (101000, 0011)2 Infelizmente, a necessidade de transformar números entre bases pode implicar na inserção de erros numéricos porque um número pode ter representação exata em uma base e não ter representação exata em outra. Seja o exemplo do número (0, 1)10 que tem representação exata na base decimal. Veremos que não é possı́vel representá-lo de forma exata na base binária: 0, 10 ∗2 0, 20 ∗2 0.40 ∗2 0.80 ∗2 0.60 ∗2 0, 20 0, 40 0, 80 1, 60 1, 20 0.20 ∗2 0.40 ∗2 ... ... 0, 40 0, 80 ... Na transformação realizada no exemplo, vemos que não é possı́vel obter um resultado da multiplicação igual a zero e o processo de transformação entra em um ciclo infinito. Neste caso, o número (0, 1)10 será representado de forma aproximada na base binária com precisão dependente do número de algarismos significativos definido. (0, 1)10 ' (0, 00011)2 4 4.1 Notação de Ponto Flutuante Representação de Números em Ponto Flutuante Nos computadores e máquinas digitais em geral, para a realização de operações, cada número é armazenado em uma área de memória chamada Palavra que tem tamanho limitado. A representação utilizada nas máquinas digitais modernas é a chamada Notação de Ponto Flutuante. 4 Nesta notação, o espaço reservado para armazenamento é dividido em três partes: o sinal do número, a parte fracionária também chamada de mantissa e uma área para armazenar o expoente. Como o espaço de armazenamento é limitado, não é possı́vel armazenar todos os números reais e sim intervalos discretos. Quanto maior for o espaço disponı́vel para armazenamento, ou seja, o tamanho da Palavra, maior será a faixa e a precisão dos números armazenados. Os computadores atuais utilizam base binária com tamanho de palavra de 32 bits ou 64 bits. Baseado no padrão IEEE754 que define a representação com tamanho de palavra de 32 bits, chamado de precisão simples, e com palavra de 64 bits chamado de precisão dupla, a divisão do tamanho da palavra é assim definido: Precisão Simples: 32 bits ou 4 bytes • 1 bit é reservado para o sinal do número (positivo ou negativo); • 8 bits são utilizados para armazenar um número inteiro que é o expoente da base; • 23 bits são utilizados para a mantissa. Precisão Dupla: 64 bits ou 8 bytes • 1 bit é reservado para o sinal do número (positivo ou negativo); • 11 bits são utilizados para armazenar um número inteiro que é o expoente da base; • 52 bits são utilizados para a mantissa. Então, na Notação de Ponto Flutuante, o número m pode ser assim representado: m = ±, d1 d2 d3 ...dt ∗ β e Onde: di0 s : dı́gitos da parte fracionária, d1 6= 0, 0 ≤ di ≤ β − 1 β: base (em geral 2, 10 ou 16), t: número de dı́gitos na mantissa. e: expoente inteiro. Utilizando a forma de representação normalizada, o primeiro dı́gito d1 será sempre diferente de zero. 4.2 Aritmética de Números em Ponto Flutuante Na aritmética de ponto flutuante, um sistema de numeração é representado por 4 números F(β,t,m,M). Nesta representação, β será a base utilizada, t o tamanho ou número de dı́gitos da mantissa, m o menor expoente possı́vel para a notação e M o maior expoente. Então, devido ao tamanho finito da Palavra em uma máquina, F(β,t,m,M) será sempre um 5 subconjunto dos números reais. Vejamos os números representáveis em um dado sistema F. Exemplo: Seja F(2,3,-1,2), quais os números na base decimal representáveis neste sistema? A base utilizada é a binária, então, os dı́gitos da mantissa poderão ser 0 ou 1, sendo que na forma normalizada o primeiro dı́gito da mantissa será obrigatoriamente 1. Para a mantissa poderemos ter as seguintes variações: 0,100; 0,101; 0,110 e 0,111 Para o expoente, poderemos ter números variando de 2−1 até 22 . Assim, os números representáveis nesses sistema são: O zero é representado em todos os sistemas. 0, 100 ∗ 2−1 0, 101 ∗ 2−1 0, 110 ∗ 2−1 0, 111 ∗ 2−1 = (1 ∗ 2−1 + 0 ∗ 2−2 + 0 ∗ 2−3 ) ∗ = (1 ∗ 2−1 + 0 ∗ 2−2 + 1 ∗ 2−3 ) ∗ = (1 ∗ 2−1 + 1 ∗ 2−2 + 0 ∗ 2−3 ) ∗ = (1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−3 ) ∗ 1 2 1 2 1 2 1 2 = 12 ∗ 12 = 14 = 0, 25 5 = ( 12 + 18 ) ∗ 21 = 58 ∗ 12 = 16 = 0, 3125 1 1 1 3 1 3 = ( 2 + 4 ) ∗ 2 = 4 ∗ 2 = 8 = 0, 375 7 = ( 12 + 14 + 18 ) ∗ 12 = 87 ∗ 12 = 16 = 0, 4375 0, 100 ∗ 20 0, 101 ∗ 20 0, 110 ∗ 20 0, 111 ∗ 20 = 1 ∗ 2−1 + 0 ∗ 2−2 + 0 ∗ 2−3 = 1 ∗ 2−1 + 0 ∗ 2−2 + 1 ∗ 2−3 = 1 ∗ 2−1 + 1 ∗ 2−2 + 0 ∗ 2−3 = 1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−3 0, 100 ∗ 21 0, 101 ∗ 21 0, 110 ∗ 21 0, 111 ∗ 21 = (1 ∗ 2−1 + 0 ∗ 2−2 + 0 ∗ 2−3 ) ∗ 2 = 21 ∗ 2 = 1 = (1 ∗ 2−1 + 0 ∗ 2−2 + 1 ∗ 2−3 ) ∗ 2 = ( 21 + 18 ) ∗ 2 = 58 ∗ 2 = 54 = 1, 25 = (1 ∗ 2−1 + 1 ∗ 2−2 + 0 ∗ 2−3 ) ∗ 2 = ( 21 + 14 ) ∗ 2 = 34 ∗ 2 = 32 = 1, 5 = (1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−3 ) ∗ 2 = ( 21 + 14 + 18 ) ∗ 2 = 87 ∗ 2 = 47 = 1, 75 0, 100 ∗ 22 0, 101 ∗ 22 0, 110 ∗ 22 0, 111 ∗ 22 = (1 ∗ 2−1 + 0 ∗ 2−2 + 0 ∗ 2−3 ) ∗ 22 = (1 ∗ 2−1 + 0 ∗ 2−2 + 1 ∗ 2−3 ) ∗ 22 = (1 ∗ 2−1 + 1 ∗ 2−2 + 0 ∗ 2−3 ) ∗ 22 = (1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−3 ) ∗ 22 = = = = 1 2 1 2 1 2 1 2 = 14 = 0, 5 + 18 ) ∗ 12 = 58 = 0, 625 + 14 = 34 = 0, 750 + 14 + 18 = 78 = 0, 875 = 12 ∗ 4 = 2 = ( 21 + 18 ) ∗ 4 = 85 ∗ 4 = 52 = 2, 5 = ( 21 + 14 ) ∗ 4 = 43 ∗ 4 = 3, 0 = ( 12 + 14 + 18 ) ∗ 4 = 78 ∗ 4 = 27 = 3, 5 Os números representáveis neste sistema são: -3,5; -3,0; -2,5; -2; -1,75; -1,5; -1,25; -1; -0,875; -0,750; -0,625; -0,5; -0,4375; -0,375; -0,3125; -0,25; 0 ;0,25; 0,3125; 0,375; 0,4375; 0,5; 0,625; 0,750; 0,875; 1; 1,25; 1,5; 1,75; 2; 2,5; 3,0; 3,5 Vemos que para o sistema F(2,3,-1,2) podemos representar 33 números e que não há números representáveis entre, por exemplo, [1; 1,25] ou entre [3.0; 3.5]. Uma forma de determinar a quantidade de números representáveis é fazer a seguinte análise. Neste sistema temos três 6 dı́gitos na mantissa sendo que o primeiro dı́gito é obrigatoriamente 1, para os outros dois dı́gitos temos 2 possibilidades para d2 e 2 possibilidades para d3 . Para o expoente temos 4 possibilidades ([-1,2]). Temos então 2 * 2 * 4 possibilidades o que implica em 16 números. Como o zero é representável em qualquer sistema e também temos os números negativos, o total de números representáveis será: 2 * 16 + 1 = 33 números. Podemos também fazer uso da seguinte fórmula para calcular o total de números em um sistema: N = 2 ∗ (β − 1) ∗ β t−1 ∗ (M − m + 1) + 1 Onde: N = quantidade de números representáveis em F; A primeira multiplicação por 2 se deve a possibilidade de representar números positivos e negativos; O acréscimo de 1 no final é devido a representação do número 0 (zero) Com relação a representação dos números na notação de ponto flutuante, quanto maior o número de dı́gitos utilizados na mantissa, maior será a precisão dos números representáveis e menor será o intervalo entre dois números pertencentes a este sistema. Para o expoente, quanto maior o número de bits disponı́veis nesta representação maior será os limites dos números. Atenção: Em nosso estudo, alguns detalhes sobre a representação dos números definidos pelo padrão IEEE 754 não estão sendo considerados. Alguns destes pontos são: a forma de armazenar o expoente de um número considerando o sinal e considerar que o primeiro dı́gito dos números normalizados (1), não precisa ser armazenado. 4.3 Erros na representação dos Números Então, devido a representação de números do formato de ponto flutuante, pode ocorrer dois tipos de erros: um relacionado ao número de bits disponı́veis para representar o expoente e outro erro relacionado a tamanho da mantissa. Quanto ao limite do expoente, sempre que uma operação aritmética produz um número com expoente maior que o expoente máximo M, ocorre um erro no armazenamento do número e é gerada uma exceção chamada overflow. De forma semelhante, operações que resultem em expoente menores que o expoente mı́nimo m geram uma exceção chamada underflow. No caso do exemplo apresentado na Figura 1, pode-se observar que para operações que gerem valores entre o intervalo (− 14 , 41 ) ocorre underflow e em valores menores que −3 e maiores que 3 irá ocorrer um overflow. Quanto a erros relacionados com o tamanho da mantissa, mesmo o melhor computador disponı́vel não consegue armazenar em um intervalo, todo o conjunto de valores reais possı́veis. Na prática são armazenados apenas pontos discretos e a distância entre estes pontos está diretamente relacionada com o número de bits da mantissa. O seguinte exemplo apresenta um erro devido a limitação do tamanho da mantissa em um dado sistema de ponto flutuante. Seja f(x) uma função contı́nua real definida no intervalo [a,b], a < b, e sejam f (a) < 0 e f (b) > 0. Então, pelo Teorema do Valor Médio, existe um x, a < x < b, tal que f (x) = 0. Seja 7 Figura 1: Região de Underflow e Overflow f (x) = x3 − 3, determinar x tal que f (x) = 0. Solução: Para a função dada, consideremos t = 10 e β = 10. Obtemos então: f (0, 1442249570 ∗ 101 ) = −0, 2 ∗ 10−8 f (0, 1442249571 ∗ 101 ) = 0, 4 ∗ 10−8 Observe que entre os dois valores de x, não existe nenhum número que possa ser representado no sistema e que a função muda de sinal nos extremos deste intervalo. Assim, esta máquina não possui o número x tal que f (x) = 0 e obtemos apenas um valor aproximado para o x. Realizados em um computador, os cálculos das expressões a seguir não resultam em zero, você saberia descrever a razão? (resposta ≈ 0, 1 ∗ 10−15 ) 1) 1 − 3 ∗ (4/3 − 3) 2) sen(pi) Importante: Dois aspectos devem ser destacados nesse momento: • A representação dos números em sistemas digitais, diferentemente do que acontece no conjunto dos números reais, ocorre através de valores discretos. Quanto menor o números de bits disponı́veis para representar a mantissa, maior será o intervalo entre os números representáveis. O Matlab tem um função chamada eps que retorna qual a distância entre o valor passado para a função e o próximo número representável. • A restrição dos bits disponı́veis para representar o expoente, limitam a magnitude dos números representáveis. 4.4 Operações Aritméticas em Ponto Flutuante Seja uma máquina onde são realizadas uma série de operações aritméticas. Após cada operação, o resultado é colocado no formato do sistema, aplicando o procedimento de arredondamento ou de truncamento. Se a quantidade de dı́gitos do número for maior que o tamanho da mantissa. Por este motivo, as operações aritméticas nem sempre são associativas e nem distributivas. ( Associativa: (a + b) + c = a + (b + c). Distributiva: a * ( b + c) = a * b + a * c). 8 Lembrete: Para realizar operações de adição ou subtração, os números devem ser multiplicados por potências de mesmo expoente. Como exemplo, seja o sistema F(10,3,-5,5), vejamos o que ocorre nas seguintes operações: a) (11, 4 + 3, 18) + 5, 05 Temos que: (0, 114 ∗ 102 + 0, 0318 ∗ 102 ) + 0, 0505 ∗ 102 0, 146 ∗ 102 + 0, 0505 ∗ 102 = 0, 197 ∗ 102 b) 11, 4 + (3, 18 + 5, 05) Temos que: 0, 114 ∗ 102 + (0, 0318 ∗ 102 + 0, 0505 ∗ 102 ) 0, 114 ∗ 102 + 0, 0823 ∗ 102 = 0, 196 ∗ 102 c) 3, 18 ∗ (5, 05 + 11, 4) Temos que: 0, 318 ∗ 101 ∗ (0, 0505 ∗ 102 + 0, 114 ∗ 102 ) 0, 318 ∗ 101 ∗ 0, 165 ∗ 102 = 0, 525 ∗ 102 d)3, 18 ∗ 5, 05 + 3, 18 ∗ 11, 4 Temos que: 0, 318 ∗ 101 ∗, 505 ∗ 101 + 0, 318 ∗ 101 ∗ 0, 114 ∗ 102 0, 161 ∗ 102 + 0, 363 ∗ 102 = 0, 524 ∗ 102 O resultado das expressões a) e b), e das expressões c) e d) deveriam ser iguais mas, devido o arredondamento após cada operação, apresentaram diferenças. Algoritmo da adição/subtração em ponto flutuante 1. Se não estiver formatado, escreva os números no formato de ponto flutuante. 2. Compare o expoente dos dois números. Se forem diferentes, desloque o número com menor expoente à direita até que seu expoente se iguale ao maior número. 3. Some/subtraia as mantissas. 4. Normalize a soma, deslocando à direita e incrementando o expoente ou deslocando à esquerda e decrementando o expoente. 5. Teste se ocorre overflow ou underflow. 6. Se sim, gera exceção. 9 7. Se não, arredonde ou faça o truncamento da mantissa para o número de bits corretos. 8. Verifica se o resultado está normalizado. 9. Se Sim. Fim 10. Se Não, retorna ao passo 4 Algoritmo da multiplicação/divisão em ponto flutuante 1. Se não estiver formatado, escreva os números no formato de ponto flutuante. 2. Somar os expoentes das duas potências 3. Multiplique/divida as mantissas. 4. Normalize o produto se necessário. 5. Teste se ocorre overflow ou underflow. 6. Caso sim, gera exceção. 7. Caso não, escreva a mantissa com o número de bits apropriado. 8. Verificar se resultado está normalizado. 9. Não, retorna ao passo 4. 10. sim, faça o sinal do produto positivo se ambos os sinais dos operandos originais são os mesmos, caso contrário, sinal é negativo, Fim 5 Algarismos Significativos Os Algarismos Significativos de um número são aqueles que podem ser usados com confiança [1] e que correspondem ao número de algarismo corretos mais um algarismo estimado. Por exemplo, seja o velocı́metro analógico de um carro que tem traços marcando os Km. Qual seria a leitura de velocidade se o ponteiro estivesse entre os traços que representam 61 Km/h e 62 Km/h? Dependendo da posição do ponteiro entre os dois traços, uma pessoa poderia informar que a velocidade é 61,7 Km/h e outra 61,8 Km/h. Nesta leitura terı́amos três algarismos significativos. Convenciona-se tomar o algarismo estimado como a metade da menor divisão da escala do aparelho utilizado. Portanto, a leitura da velocidade segundo esta convenção seria 61,5 Km/h. Para as definições de cálculo numérico, seja β a base de um sistema de números de ponto flutuante. Dı́gitos Significativos de um número x são todos os algarismos de 0 a β − 1, desde que x esteja representado na forma normalizada. Algumas definições sobre algarismos significativos: 10 • Os algarismos significativos de um número são os dı́gitos diferentes de zero, contados a partir da esquerda até o último dı́gito diferente de zero à direita, caso não haja vı́rgula, ou até o último dı́gito, zero ou não, caso haja uma vı́rgula decimal. Ex.: 3, 2 ∗ 103 e 3, 200 ∗ 103 tem 2 e 4 algarismos significativos, respectivamente. • Os dı́gitos diferentes de zero são todos significativos. Ex.: 7, 3; 32 e 210 possuem 2 algarismos significativos. • Os zeros entre dı́gitos diferentes de zero são significativos. Ex: 303 e 1, 03 possuem 3 algarismos significativos. • Se existir uma vı́rgula, todos os zeros à direita da vı́rgula decimal são significativos. Ex: 1, 000 e 33, 30 possuem 4 algarismos significativos. Os métodos numéricos fornecem resultados aproximados, sendo necessário então, desenvolver critérios para especificar quanta confiança se tem no resultado aproximado. Isto é realizado através da definição de algarismos significativos. Por exemplo, pode-se decidir que uma aproximação é aceitável se ela for correta até 4 algarismos significativos. 6 Análise de Erros O objetivo desta seção é descrever métodos que permitam reduzir ou determinar limites para os erros numéricos. Nenhum resultado cientı́fico tem valor prático se não houver um controle sobre os erros envolvidos. A análise dos erros é parte fundamental de um processo de modelagem. 6.1 Erros Absolutos e Relativos Erro absoluto é a diferença entre o valor exato de um número x e seu valor aproximado x. EAx = x − x. Em geral, não se conhece o valor exato x, o que impossibilita o cálculo do erro absoluto. Nestes casos, avalia-se um limitante superior ou uma aproximação para o módulo do erro. Por exemplo, sabemos que o valor de π ∈ (3, 14; 3, 15). Considera-se então o limitante para o erro absoluto como sendo |EAx | < 0, 01. Ao longo da disciplina, serão apresentadas outras formas de verificação para erros aproximados e limitantes para erros. O erro absoluto não permite uma avaliação da precisão entre dois resultados de forma correta porque não leva em consideração a grandeza destes números. Por exemplo, se for identificado que o comprimento de uma sala de aula tem um limitante superior de erro da ordem de 1mm, considera-se que a sala tem medidas precisas e que este erro não altera a sua qualidade. Porém, se considerarmos o mesmo limitante de 1mm para a confecção de um eixo de um sistema de transmissão de um automóvel. Provavelmente, um eixo com erro de 1mm em seu diâmetro não seria montado com sucesso neste sistema de transmissão. 11 O erro relativo leva em consideração as dimensões dos valores em análise e pode ser calculado x−x x através da expressão: ERx = EA x = x Exemplo: Sejam x = 100, x = 100, 1, y = 0, 004, x = 0, 006. Qual número é representado com maior precisão pela sua aproximação? Para determinar a resposta é necessário calcular os erros relativos de x e y. − 100, 1 = 0, 999 ∗ 10−3 ERx = 100100, 1 − 0, 006 = 0, 333 ∗ 100 ERy = 0, 004 0, 006 Logo, verifica-se que o número x é representado com melhor precisão. 6.2 Erros de Cancelamento Ocorrem durante a subtração de dois números com valores próximos. Nesta operação, se subtrairmos estes dois número na forma normalizada, haverá no resultado alguns zeros não significativos. Então será necessário normalizar o resultado e preencher à direita com zeros que √ √ são necessários para a normalização. Veja o exemplo da subtração dos números 9876 − 9875 em um sistema F(10,10,-10,10). √ 9876 − √ 9875 = 0, 9937806599 ∗ 102 − 0, 9937303457 ∗ 102 = 0, 0000503142 ∗ 102 Normalizando o resultado temos que: √ 9876 − √ 9875 = 0, 5031420000 ∗ 10− 2. Na prática, os quatro zeros no final do número não têm significado e perde-se quatro dı́gitos de precisão na mantissa. O erro de cancelamento pode ser contornado utilizando manipulações algébricas de forma a evitar a subtração destes números. Podemos reescrever a diferença desta forma: √ √ y x − y = √x − √ x+ y Neste caso a diferença torna-se: √ 9876 − √ 9875 = √ 1√ = 0, 5031418679 ∗ 10−2 9876 + 9875 Que tem todos os dı́gitos da mantissa preenchidos. Outro exemplo: Resolver a equação x2 − 1634 ∗ x + 2 = 0 √ −b ± b2 − 4ac Utilizando a fórmula de Bhaskara temos: x = 2a 12 √ 1634 ± 16342 − 4 ∗ 2 = 1634 ± 1633, 99755 Para a equação, x = 2 2 Para evitar o erro de cancelamento no cálculo da diferença, basta lembrarmos que o produto das raı́zes é igual ao termo independente do polinômio. Ou, x1 ∗ x2 = 2 A segunda raiz será calculada por x2 = x21 x1 = 0, 1633998776 ∗ 103 e x2 = 0, 1223991125 ∗ 10−2 Nem sempre haverá uma maneira trivial de resolver o problema de cancelamento. 6.3 Erros de Arredondamento e Truncamento em um Sistema Ponto Flutuante A representação de um número em uma máquina depende do tamanho da palavra ou da quantidade de bits disponı́veis para o seu armazenamento. De acordo com o tamanho da palavra, será definido o número t de bits da mantissa e do expoente. Após uma operação realizada em ponto flutuante, o resultado é normalizado e pode ser necessário arrendondar ou truncar este número. O erro relativo gerado por este truncamento ou arrendondamento no resultado será definido nesta seção. Seja um sistema que opera em aritmética de ponto flutuante com t dı́gitos na mantissa e β = 10 e seja o número x escrito na forma: x = fx ∗ 10e + gx ∗ 10e−t , onde 0, 1 ≤ fx < 1 e 0 ≤ gx < 1 Por exemplo, se t = 4 e x = 234, 57, então x = 0, 2345 ∗ 103 + 0, 7 ∗ 10−1 Assim, fx = 0, 2345 e gx = 0, 7 Verifica-se que no exemplo proposto, o valor de gx não pode ser incorporado a mantissa de x. Pode-se adotar dois critérios na definição dos números em casos como o do exemplo. Pode-se realizar o truncamento ou o arredondamento dos dı́gitos restantes na mantissa. No truncamento, gx ∗ 10e−t é desprezado e x = fx ∗ 10e . Assim, obtemos o erro absoluto devido ao truncamento: |EAx | = |x − x| = |gx | ∗ 10e−t < 10e−t , visto que gx < 1 Da mesma forma, podemos calcular o erro relativo: |ERx | = para fx , |EAx | |g | ∗ 10e−t = x < |x| |fx | ∗ 10e 10e−t 0,1∗10e = 10−t+1 , visto que 0, 1 é o menor valor possı́vel ou, |ERx | < 10−t+1 13 No arredondamento, fx é modificado, dependendo do valor de gx . No arredondamento simétrico que é a forma mais utilizado: x= fx ∗ 10e se f ∗ 10e + 10e−t se x |gx | < |gx | ≥ 1 2 1 2 Então, despreza-se gx se |gx | < 12 , caso contrário, soma-se 1 ao último dı́gito de fx . Para |gx | < 12 e |EAx | < 12 ∗ 10e−t , o erro relativo é calculado por: |ERx | = |gx | ∗ 10e−t |EAx | 0, 5 ∗ 10e−t = 1 ∗ 10−t+1 = < e x 2 0, 1 ∗ 10e |fx | ∗ 10 Ou seja, |ERx | < 12 ∗ 10−t+1 Se |gx | ≥ 21 , teremos: |EAx | = |x − x| = |(fx ∗ 10e + gx ∗ 10e−t ) − (fx ∗ 10e + 10e−t )| = = |gx ∗ 10e−t − 10e−t | = |gx − 1| ∗ 10e−t ≤ 12 ∗ 10e−t Ou seja, |EAx | ≤ 12 ∗ 10e−t 1 1 1 ∗ 10e−t ∗ 10e−t ∗ 10e−t |EAx | 1 −t+1 2 2 |ERx | = x ≤ < 2 ≤ 0, 1 ∗ 10e = 2 ∗ 10 |fx | ∗ 10e |fx ∗ 10e + 10e−t | Ou seja, |ERx | ≤ 12 ∗ 10−t+1 Então, em qualquer caso para o arredondamento, teremos: |EAx | ≤ 21 ∗ 10e−t e |ERx | ≤ 1 ∗ 10−t+1 , e os erros gerados no armazenamento de um resultado em ponto flutuante são 2 definidos por: Arredondamento Truncamento 6.4 |EAx | ≤ |ERx | ≤ 1 ∗ 10e−t 2 1 ∗ 10−t+1 2 < 10e−t < 10−t+1 Propagação dos Erros O erro total em uma operação é composto pelo erro das parcelas mais o erro no resultado. O cálculo da estimativa do erro no resultado foi definido na seção anterior. A seguir serão definidas fórmulas para o cálculo dos erros absolutos e relativos nas operações com erros nas parcelas. Supomos que o erro final é arrendondado. Seja x e y tais que: x = x̄ + EAx e y = ȳ + EAy 14 Adição: x + y = (x̄ + EAx ) + (ȳ + EAy ) = (x̄ + ȳ) + (EAx + EAy ) O erro absoluto da soma x+y, denotado por EAx+y é a soma dos erros absoluto das parcelas. EAx+y = EAx + EAy O erro relativo da soma, ERx+y é assim definido: EAy EA ȳ EAx x̄ ERx+y = x̄ +x+y ȳ = x̄ ∗ x̄ + ȳ + ȳ ∗ x̄ + ȳ x̄ + ER ∗ ȳ ERx+y = ERx ∗ x̄ + y ȳ x̄ + ȳ Pela expressão do cálculo do erro na soma, verifica-se que se os dois números são armazenados de maneira exata, o resultado do erro será zero. De forma análoga, o cálculo do erro na diferença entre dois números é dado por: x̄ − ER ∗ ȳ ERx−y = ERx ∗ x̄ − y ȳ x̄ − ȳ Na multiplicação: x ∗ y = (x̄ + EAx ) ∗ (ȳ + EAy ) = x̄ ∗ ȳ + x̄ ∗ EAy + ȳ ∗ EAx + EAx ∗ EAy Considerando a última parcela, EAx ∗ EAy como um número pequeno, fazemos: EAx ≈ x̄ ∗ EAy + ȳ ∗ EAx O erro relativo do produto pode ser calculado por: ERx∗y = x̄ ∗ EAy + ȳ ∗ EAx EAy x = EA x̄ ∗ ȳ x̄ + ȳ = ERx + ERy E finalmente, para a divisão de x y x = x̄ + EAx = x̄ + EAx ∗ y ȳ ȳ + EAy 1 EAy 1+ ȳ 1 EAy em termos de uma série infinita: 1+ ȳ EA EAy 2 EAy 3 y 1 = 1 − + − + ... y y y EAy 1+ ȳ Representando e desprezando os termos da série com expoente maior que 1, podemos escrever a divisão como: x ≈ x̄ + EAx ∗ 1 − EAy = x̄ + EAx − x̄ ∗ EAy − EAx ∗ EAy y ȳ ȳ ȳ ȳ ȳ 2 ȳ 2 15 Então x ≈ x̄ + EAx − x̄ ∗ EAy y ȳ ȳ ȳ 2 x̄ ∗ EAy ȳ ∗ EAx − x̄ ∗ EAy x Assim, EAx/y ≈ EA = ȳ − ȳ 2 ȳ 2 e ERx/y ≈ ȳ ∗ EAx − x̄ ∗ EAy EAx EAy / x̄ ȳ = x̄ − ȳ = ERx − ERy ȳ 2 A análise completa da propagação dos erro é realizada considerando a parcela de erro que ocorre nas operações e pela parcela de erro do resultado descrita na seção anterior. Vejamos um exemplo para o cálculo de erros absolutos, relativos e erros totais de operações aritméticas. Sejam os números x = 17534, y = 21178 e z = 75904, que devem ser armazenados em um sistema com as seguintes caracterı́sticas F(10,4,-6,6). a) Calcule os erros absolutos e relativos EAx = |x − x̄| = |0, 17534 ∗ 105 − 0, 1753 ∗ 105 | = 0, 4000 ∗ 101 EAy = |y − ȳ| = |0, 21178 ∗ 105 − 0, 2118 ∗ 105 | = 0, 2000 ∗ 101 EAz = |y − ȳ| = |0, 75904 ∗ 105 − 0, 7590 ∗ 105 | = 0, 4000 ∗ 101 ERx = |x − x̄|/|x̄| = 0, 4000 ∗ 101 /0, 1753 ∗ 105 = 0, 2282 ∗ 10−3 ERy = |y − ȳ|/|ȳ| = 0, 2000 ∗ 101 /0, 2118 ∗ 105 = 0, 9447 ∗ 10−4 ERz = |z − z̄|/|z̄| = 0, 4000 ∗ 101 /0, 7590 ∗ 105 = 0, 5270 ∗ 10−4 Neste exemplo, os valores de erros estão no formato do sistema mas isto não é estritamente necessário. b) Calcular o valor da expressão (x + y)/z e o erro relativo final da operação. x + y = (0, 1753 + 0, 2118) ∗ 105 = 0, 3871 ∗ 105 O erro relativo da soma mais o erro do resultado é definido por: 1 x̄ + ER ∗ ȳ −t+1 ERx+y = ERx ∗ x̄ + y ȳ x̄ + ȳ + 2 ∗ 10 = 0, 2118 ∗ 105 0, 1753 ∗ 105 −4 ∗ 0, 2282 ∗ 10−3 ∗ 5 + 0, 9447 ∗ 10 (0, 1753 + 0, 2118) ∗ 10 (0, 1753 + 0, 2118) ∗ 105 1 −3 2 ∗ 10 −3 ERx+y = 0, 2282 ∗ 10 5 5 ∗ 0, 1753 ∗ 105 + 0, 9447 ∗ 10−4 ∗ 0, 2118 ∗ 105 + 0, 0005 0, 3871 ∗ 10 0, 3871 ∗ 10 16 ! + ERx+y = (0, 1033 ∗ 10−3 + 0, 5283 ∗ 10−4 ) + 0, 0005 = (0, 1561 + 0, 5) ∗ 10−3 ERx+y = 0, 6561 ∗ 10−3 O resultado final da operação é dado por: (x + y)/z = (0, 3871 ∗ 105 )/(0, 7590 ∗ 105 ) = 0, 5100 ∗ 100 O cálculo do erro relativo final de toda expressão é calculado da seguinte forma: ER(x+y)/z = ERx+y − ERz + 21 ∗ 10−t+1 ER(x+y)/z = 0, 6561 ∗ 10−3 − 0, 5270 ∗ 10−4 + 0, 5 ∗ 10−3 = 0, 1103 ∗ 10−2 7 Considerações Finais O objetivo deste documento foi apenas introduzir alguns aspectos sobre erros numéricos. É possı́vel verificar que mesmo com o avanço na tecnologia de construção de computadores e máquinas digitais, os resultados finais podem sempre ser influenciados por erros como os de arredondamento e restrições do armazenamento de números. Como leitura adicional recomendase realizar uma busca na Internet por falhas e acidentes causados por erros numéricos. Sugestão de pesquisa:disasters caused by numerical errors. Referências [1] S. C. Chapra and R. P Canale. Métodos Numéricos para Engenharia. Pearson, 2008. [2] N. B. Franco. Cálculo Numérico. Pearson, 2006. [3] M. A. G . Ruggiero and V. L. R. Lopes. Computacionais. Pearson, 2006. 17 Cálculo Numérico - Aspectos Teóricos e