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
Download

Estudos sobre Erros Numéricos