A precisão da máquina é definida como sendo o menor número positivo em aritmética de ponto flutuante, varepsilon, tal que: (1+varepsilon)>1. 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 1: & A=1 & s=1+A
Passo 2: Enquanto s>1, faça:
& A=A / 2 & s=1+A
Passo 3: Faça Prec =A * 2 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 A 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 omega é um dado de entrada, escolhido pelo usuário:
r Passo 1: A=omega s=omega+A
Passo 2: Enquanto s>omega, faça:
& A=A / 2 & s=omega+A
Passo 3: Faça Prec =A * 2 e imprimir Prec
(c.1) Teste seu programa atribuindo para omega os numeros : 10^-1, 10^-2, 10^-3, 10^-4, 10^-5, 10^-6, 10^-7, 10^-8, 17,184,1575,17893.
(c.2) Para cada valor diferente para omega imprima o valor correspondente obtido para Prec. Justifique por que Prec se altera quando omega é modificado.

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 eps;
– (b) explicar por que o passo faz Prec \(=\) A*\(2\);
– (c) generalizar o algoritmo para uma entrada , testar vários e justificar por que a precisão obtida muda.

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 exatamente
Logo, o algoritmo reproduz corretamente o valor de eps.

Passo 3

Para (b), note que no final do laço while a última atribuição de A faz com que
1 + A = 1
(ou seja, A ficou pequeno demais para alterar o resultado em ponto flutuante). O último A que ainda fez 1 + A > 1 é exatamente o dobro desse valor. Por isso definimos
Prec = 2A,
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 Prec \(=2\)*A. Esse é proporcional a , de modo que
á

Passo 5

(c. 1–c. 2) Testando vários omega e calculando Precapprox 2A, obtemos:
omega=10^-1⟹Precapprox2,2204times10^-17, omega=10^-2⟹Precapprox2,2204times10^-18, omega=10^-3⟹Precapprox2,2204times10^-19, omega=10^-4⟹Precapprox2,2204times10^-20, omega=10^-5⟹Precapprox2,2204times10^-21, omega=10^-6⟹Precapprox2,2204times10^-22, omega=10^-7⟹Precapprox2,2204times10^-23, omega=10^-8⟹Precapprox2,2204times10^-24, omega=17 ⟹Precapprox3,7748times10^-15, omega=184 ⟹Precapprox4,0852times10^-14, omega=1575 ⟹Precapprox3,4969times10^-13, omega=17893⟹Precapprox3,9733times10^-12
A justificativa é que a precisão em ponto flutuante é relativa ao valor testado: conforme omega aumenta ou diminui, o menor incremento distinguível ( Prec) cresce ou decresce proporcionalmente.

Resposta

(a) O algoritmo retorna 2,220446049250313times10^-16, exatamente igual ao que o MATLAB dá em eps.
(b) Porque ao sair do laço o valor de A é metade do menor incremento que fez 1+A>1, então dobramos para recuperar a máquina epsilon.
(c) Para entrada omega, o algoritmo produz Precapprox varepsilonmáquinatimesomegaá. A tabela acima mostra como Prec varia linearmente com omega.

Exercícios relacionados