Este documento discute os conceitos fundamentais da aritmética de máquina, incluindo valores exatos e aproximados, dígitos significativos, truncamento, arredondamento e erros. Apresenta também os conceitos de precisão da máquina, instabilidade e como esses fatores podem afetar os cálculos realizados em computadores.
2. Aritmética de máquina
FATEC-JAHU, Fatec-Jahu/CEETEPS
Resumo
A aritmética de maquina visa a mostrar os possíveis problemas encontradas devido as limitações da máquina.
Conteúdo
Resumo ....................................................................................................................................................................................... 2
Capítulo 1 Introdução .................................................................................................................................................................. 3
1.1 Valores exatos e aproximados ............................................................................................................................................... 3
1.2 Dígitos significativos .............................................................................................................................................................. 5
1.3 Truncando o número ............................................................................................................................................................. 5
1.4 Arredondamento ................................................................................................................................................................... 5
1.5 Erros ..................................................................................................................................................................................... 6
1.6 Precisão da máquina ............................................................................................................................................................. 7
1.7 Instabilidade ......................................................................................................................................................................... 7
Índice Remissivo .......................................................................................................................................................................... 9
3. Capítulo 1 Introdução
A resolução de problemas feito em máquinas ou computadores pode apresentar comportamentos surpreendentes, devido às
limitações existentes na fabricação. Como exemplo considere as seguintes operações
1
h
2
x 2 / 3 h
y 3/5h
e ( x x x) h
f ( y y y y y) h
g f /e
Realizando estas operações no Excel temos os seguintes resultados
0,5 0,166667 0,1 0 0 #DIV/0!
No programa Scilab a entrada de dados é feita normalmente, ou seja, Variável = valor. Se colocar ponto e vírgula no final, a
expressão não é impressa no console enquanto sem o ponto vírgula aparece o resultado.
Figura 1. Formas para se atribuir valor à variável.
Exercício 1. Realize as seguintes operações: h=1/2, x=2/3-h, y=3/5-h, e1=3*x-h, f=5*y-h e g=e1/f.
Analiticamente temos para o dados do exercício 1 os seguintes valores
1
h
2
43 1
x 2 / 3 1 / 2
6 6
65 1
y 3 / 5 h 3 / 5 1 / 2
10 10
3 1
e ( x x x) h 0
6 2
5 1
f ( y y y y y) h 0
10 2
g f / e indefinido
Perceba a diferença de comportamento. Isto será discutido mais adiante.
1.1Valores exatos e aproximados
Consideremos um problema cuja solução é um número real. Este número é designado por valor exato do problema e, no que se
segue, será representado por x.
4. Designa-se por valor aproximado e representa-se por x*, qualquer valor que se pretende utilizar como solução do problema.
Associado a um dado valor aproximado x* define-se o erro de aproximação como a diferença entre o valor exato e o valor
aproximado, isto é,
x* x x *
Exemplo 1.O comando PI no Scilab é %pi. Encontre este valor. Suponha que uma solução real seja 3,14159265359.
Determine o erro.
Solução: O painel fica
Figura 2.Exemplo 1.
O valor absoluto do erro é x * . O comando de módulo para um número é ABS(valor).
Exemplo 2.Calcule o erro absoluto.
Em geral este valor não é conhecido. Assim, a situação mais comum é aquela em que se conhece um determinado valor
aproximado x* e um intervalo para o erro de aproximação Δx*. Às vezes é empregado o erro máximo absoluto ε. Então, se x* for
um valor aproximado de x com um erro máximo absoluto ε, verifica-se que x ∈ [x∗ − ε, x∗ + ε], ou seja, x x * .
Ao escrever-se x = 1.23±0.02, pretende dizer-se que 1.23 é uma aproximação de x com um erro máximo absoluto de 0.02, ou
seja, isto significa que x estará no intervalo [1.21, 1.25]. Outra forma de caracterizar uma aproximação x* é através do erro
relativo, que se define por
x *
x
ou erro relativo aproximado
x *
x*
Definimos erro máximo relativo como sendo
'
x
na qual ε representa o erro máximo absoluto. Podemos em alguns casos usar a aproximação
'
x*
Exemplo 3.Qual o significado do valor 1, 25 0,05 ? Isto significa que x está no intervalo 1, 2 x 1,3 .
Em geral os erros máximos ou relativos se apresentam com um número reduzido de casas decimais, em torno de duas.
5. Exemplo 4.Seja x*=3,45 e 0,01 . Determine ' . Assim
0, 01
' 3 103
3, 45
1.2Dígitos significativos
Um número real x é representado na forma decimal (base 10) pelo seu sinal (+ ou -) e por uma seqüência finita ou não de
algarismos posicionada relativamente à vírgula ou ponto. Estes são os dígitos significativos.
x = ±dn dn1 d1d0 .d 1d 2 d 3
Uma forma compacta de expressar o digito é
x = ±dn d n1 d1d0 .d 1d 2 d 3 ×10e
Os d’s são conhecidos por mantissa enquanto e é o expoente.
1.3Truncando o número
Truncar um número é escrever o mesmo com um número menor de algarismos que está inicialmente apresentado. Por exemplo o
número 1,23456789 se é truncado com 6 algarismos significativos fica 1,23456. No Scilab o comando é
msprintf('%valor1.valor2f',número a ser truncado) na qual valor 1 é a quantidade de algarismos no lado esquerdo da vírgula e
valor 2 a quantidade de dígitos depois da vírgula.
Exemplo 5. Truncar o valor de PI para 5, 6 e 7 casas decimais
Solução: Obtemos os seguintes valores
-->msprintf('%3.5f',%pi)
ans = 3.14159
-->msprintf('%3.6f',%pi)
ans = 3.141593
-->msprintf('%3.7f',%pi)
ans = 3.1415927
Exercício 2.Calcule para 6, 7 e 8 os valores de .
23
1.4Arredondamento
Arredondamento é a aproximação de um número para um número de ponto flutuante e pode ser feita de maneiras diversas.
Existem os arredondamentos para cima, para baixo ou para o número de máquina mais próximo. Seguem os seguintes
comandos no Scilab, válido para inteiros:
Arredonda para o menor inteiro – Fix(valor); por exemplo: fix(3.5), ans = 3.000D+00;
Para o inteiro mais próximo – Round; por exemplo: round(3.5), ans = 4.000D+00;
Arredondamento para o inteiro menor ou igual ao número; por exemplo: floor(3.5), ans = 3.000D+00;
6. arredonda o número para o inteiro maior ou igual ao número; por exemplo:ceil(3.5), ans = 4.000D+00
Existe outro tipo de arredondamento que segue as regras:
se valor é menor que 5, o algarismo anterior se mantém;
se valor é maior ou igual a 5, o algarismo anterior é elevado em mais uma unidade.
O comando para Scilab é sprintf('%valor1.valor2f',valor)
Exemplo 6. Considere o valor de PI e vejas os seus valores para 3, 4, 5 e 6 algarismos após a vírgula.
Solução: -->sprintf('%3.3f',%pi) ans = 3.142
-->sprintf('%3.4f',%pi) ans = 3.1416
-->sprintf('%3.5f',%pi) ans = 3.14159
-->sprintf('%3.6f',%pi) ans = 3.141593
6
Exercício 3.. Calcule a expressão para 5, 6, 7 e 8 dígitos.
1.5Erros
Existem vários tipos de erros mas iremos nos concentrar em apenas três: os inerentes, os de discretização e os de
arredondamento. Os inerentes aparecem na criação ou simplificação do modelo matemático.
Exemplo 7. Considere que a solução do modelo seja sin x cos x 0, 2 . Podemos imaginar que a solução seja próxima de
zero e que nesta região a função cos não varia muito, pois é quase 1. Logo o modelo se reduz a sin x 0, 2 cuja solução é
x a sin(0, 2) 11,53º . O comando no Scilab é asin se quer o ângulo em radianos ou asind se em graus. Obtemos então
1
asind(0.2) ans = 11.54. Contudo sabemos que sin x cos x sin(2 x) . Logo a solução é 1/2*asind(2*0.2)
2
ans = 11.79. O erro desta aproximação é 0,25º ou em radianos 0,004.
Os erros de discretização ou de truncamento são erros cometidos quando se troca o processo infinito por um processo finito ou
discreto.
Exemplo 8. A constante e pode ser obtida por meio da relação
1
e
n0 n!
1
Para obtermos estes valores vamos precisar dos seguintes comandos do Scilab: factorial(valor) . A soma em um
loop(laço) é feito usando o comando
For variável=valor inicial:valor final2
Comandos
1
Convém lembra que para n>9, o resultado aparece ******, mas para visualizar o valor usar sprintf
2
Aqui é assumido incremento igual a 1.
7. End
As instruções são escritas no editor do Scilab, devendo o arquivo ser salvo. Para rodar clique em execute e load into Scilab.
Fazendo para 10 iterações temos
Figura 3. Código do exemplo 8 para 10 iterações.
h=2,718.
Exercício 4. Calcule para 30 iterações, apresentando o resultado com 10 casas decimais.
Voltando ao assunto do erro de discretização vamos comparar com o valor da constante e. No Scilab esta constante é %e.
Exercício 5. Usando 10 casas decimais, calcule a diferença entre esta constante e o valor encontrado em 10
iterações e em 30 iterações.
Erros de arredondamento surgem em máquinas digitais para representar números reais.
1.6Precisão da máquina
O seguinte programa permite identificar a precisão da máquina. O comando while(condição),comandos;end faz um loop até que
a condição seja satisfeita.
Algorítmo 1. Algoritmo para verificar precisão da máquina:
eps=1;
while eps+1>1, eps=0.5*eps; end
sprintf('%3.20f',eps)
Existe uma instrução pré-definida do Scilab que permite encontrar a precisão da máquina - %eps.
Exercício 6. Encontre a precisão da máquina.
1.7Instabilidade
Existe uma situação importante nos cálculos é verificar a estabilidade dos resultados.
xn
Exemplo 9. Imagine que desejamos calcular a expressão e x usando 10 iterações.Para x=1 temos o seguinte
n 0 n!
código
Algorítmo 2. Algoritmo e
h=0;
8. x=1;
for n=0:10
h=h+x^n/factorial(n);
end
sprintf('%3.10f',h)
O resultado é 2.7182818011 cujo erro é bem pequeno. Para isto escreva sprintf('%3.10f',(2.7182818011-%e)/%e) cujo
resultado é -0.0000000101, ou seja o erro é muito pequeno pois ocorre na oitava casa decimal.
Para x= -5.5, temos 0.4872310519 dando um erro de mais de 100%. Isto ocorre por causa de subtração de grandezas quase
iguais e soma de grandezas de diferentes ordens. Este efeito é chamado cancelamento subtrativo ou cancelamento catastrófico.
Exercício 7. As raízes da equação de segundo grau são dadas pela expressão
b b 2 4ac
x
2a
Se a=1, b= 105 e c=1, calcule as raízes. O comando Scilab para raiz quadrada é sqrt(valor).
9. Índice Remissivo
%e, 7
%pi, 4
ABS, 4
Arredondamento, 5
asin, 6
asind, 6
ceil, 6
dígitos significativos, 5
end, 7
erro de aproximação, 4
estabilidade dos resultados, 7
expoente, 5
factorial, 6
fix, 5
floor, 5
For, 6
mantissa, 5
msprintf, 5
precisão da máquina, 7
round, 5
sprintf, 6
sqrt, 8
tipos de erros, 6
Truncar, 5
valor absoluto, 4
valor aproximado, 4
valor exato, 3
while, 7