A precisão da máquina é definida como sendo o menor número positivo em aritmética de ponto flutuante,
, tal que:
. Este número depende totalmente do sistema de representação da máquina: base numérica, total de dígitos na mantissa, da forma como são realizadas as operaões e do compilador utilizado. É importante conhecermos a precisão da máquina porque em vários algoritmos precisamos fornecer como dado de entrada um valor positivo, próximo de zero para ser usado em testes de comparação com zero.
O algoritmo abaixo estima a precisão da máquina:
Passo 2: Enquanto
, faça:
Passo 3: Faça Prec
e imprimir Prec
(a) Teste este algoritmo usando o MatLab. Compare s obtido com o valor obtido ao se dar o comando eps do MatLab. Use o comando help eps no MatLab para obter a descriçãao de eps no MatLab.
(b) Interprete o passo 3 do algoritmo, isto é, por que a aproximação para Prec é escolhida como sendo o dobro do último valor de
obtido no passo 2?
(c) Na definição de precisão da máquina, usamos como referência o número 1. No algoritmo abaixo a variavel
é um dado de entrada, escolhido pelo usuário:
Passo 2: Enquanto
, faça:
Passo 3: Faça Prec
e imprimir Prec
(c.1) Teste seu programa atribuindo para
os numeros :
,
.
(c.2) Para cada valor diferente para
imprima o valor correspondente obtido para Prec. Justifique por que Prec se altera quando
é modificado.
(a) Teste este algoritmo usando o MatLab. Compare s obtido com o valor obtido ao se dar o comando eps do MatLab. Use o comando help eps no MatLab para obter a descriçãao de eps no MatLab.
(b) Interprete o passo 3 do algoritmo, isto é, por que a aproximação para Prec é escolhida como sendo o dobro do último valor de
(c) Na definição de precisão da máquina, usamos como referência o número 1. No algoritmo abaixo a variavel
(c.1) Teste seu programa atribuindo para
(c.2) Para cada valor diferente para
Passo 1
O enunciado apresenta o conceito de precisão de máquina (machine epsilon) como o menor
tal que
e dá um algoritmo que itera dividindo por
um valor
até que
deixe de ser maior que
. Pede-se:
– (a) testar em MATLAB e comparar com o comando
– (b) explicar por que o passo faz
– (c) generalizar o algoritmo para uma entrada , testar vários
e justificar por que a precisão obtida muda.
– (a) testar em MATLAB e comparar com o comando
eps
;– (b) explicar por que o passo
Prec \(=\) A*\(2\)
;– (c) generalizar o algoritmo para uma entrada
Passo 2
Para (a), ao implementar em MATLAB:
A \(=1\);
s \(=1+\) A;
while s > \(1\)
A \(=\) A/\(2\);
s \(=1+\) A;
end
Prec \(=2\)*A;
o valor impresso em
Prec
éO comando
eps
no MATLAB também retorna exatamenteLogo, o algoritmo reproduz corretamente o valor de
eps
.Passo 3
Para (b), note que no final do laço faz com que
while
a última atribuição de
(ou seja,
ficou pequeno demais para alterar o resultado em ponto flutuante). O último
que ainda fez
é exatamente o dobro desse valor. Por isso definimos
recuperando o menor incremento que ainda produz diferença.
Passo 4
Para (c), substituímos
por um valor genérico
. O laço encontra o menor
tal que
e então é proporcional a
, de modo que
Prec \(=2\)*A
. Esse
Passo 5
(c.
–c.
) Testando vários
e calculando
, obtemos:
A justificativa é que a precisão em ponto flutuante é relativa ao valor testado: conforme
aumenta ou diminui, o menor incremento distinguível (
) cresce ou decresce proporcionalmente.
Resposta
(a) O algoritmo retorna
, exatamente igual ao que o MATLAB dá em
(b) Porque ao sair do laço o valor de é metade do menor incremento que fez
, então dobramos para recuperar a máquina
.
(c) Para entrada , o algoritmo produz
. A tabela acima mostra como
varia linearmente com
.
eps
.(b) Porque ao sair do laço o valor de
(c) Para entrada