Escolar Documentos
Profissional Documentos
Cultura Documentos
Vicente Helano
UFCA | Centro de Ciências e Tecnologia
De nição das operações
Dados 𝑥, 𝑦 ∈ ℝ , de nimos
𝑥 ⊕ 𝑦 = fl(fl(𝑥) + fl(𝑦))
𝑥 ⊖ 𝑦 = fl(fl(𝑥) − fl(𝑦))
𝑥 ⊗ 𝑦 = fl(fl(𝑥) × fl(𝑦))
𝑥 ⊘ 𝑦 = fl(fl(𝑥)/ fl(𝑦))
Sequência básica das operações
Para realizar 𝑥 ⊙ 𝑦, fazemos
1. arredondamos os operandos 𝑥 e 𝑦, obtendo os valores fl(𝑥) e fl(𝑦)
⋅
2. realizamos a operação aritmética de modo exato usando os valores de fl(𝑥) e
𝑦
fl( )
In [ ]: print(f'{res:1.2e}')
Over ow e under ow
= 3 , 𝑒min = −1 e 𝑒max = 2 .
Considere um sistema decimal com 𝑡
−1 2
Tomemos 𝑥 = (1,10)10 × 10 e 𝑦 = (7,00)10 × 10 , quanto valem 𝑥 ⊘ 300 e
2 ⊗ 𝑦?
In [ ]: x = 1.10 * 10**(-1) # ou 1.1e-1
y = 7.00 * 10**(2) x/300 = 0.0003666666666666667
div = x/300.0
prod = 2.0*y
print(f"x/300 = {div}")
print(f"2*y = {prod}")
Over ow e under ow 2*y = 1400.0
fl(0.000366 …) =
fl(1400) =
Over ow e under ow
Aviso: o comportamento do float da Python é muitas vezes diferente do estabelecido
no padrão IEEE.
In [ ]: import numpy as np
In [ ]: a = 1.0
b = 0.0
a/b
Perda de precisão
Em diversas ocasiões, podemos ter perda de precisão em operações de ponto utuante.
Precisamos citar duas das que mais ocorrem:
∞ 1 2
∑𝑘
𝑘=1
2
𝜋
= 6
O problema da Basileia
Desejamos aproximar a série por:
∑
100.000.000
𝜋 2
1
≈
6 𝑘=1
𝑘2
O problema da Basileia
Maiores primeiro:
In [ ]: n = 10000000
somaM = 0.0
for k in range(1,n+1):
somaM = somaM + 1.0/(k**2)
O problema da Basileia
Menores primeiro:
In [ ]: n = 10000000
somam = 0.0
for k in range(n,0,-1):
somam = somam + 1.0/(k**2)
O problema da Basileia
Comparação:
In [ ]: exato = (np.pi**2)/6
print("ER(MaioresPrimeiro): %.14e" % (abs(exato - somaM)/exato))
print("ER(MenoresPrimeiro): %.14e" % (abs(exato - somam)/exato))
Subtração de números próximos
Considere um sistema decimal com 𝑡 = 3 , 𝑒min = −1 e 𝑒max = 2 .
2
Calculemos 9,34 × 10 ⊖ 9,33 × 10
2
Subtração de números próximos
−
Agora, considere o problema de calcular o valor da função abaixo para 𝑥 = 10 ,
𝑘
𝑘 = 0, 1, … , 12 .
𝑓 (𝑥) =
1 − cos 𝑥
sen2 𝑥
Subtração de números próximos
In [ ]: def f(x):
return (1.0 - np.cos(x))/(np.sin(x)*np.sin(x))
Subtração de números próximos
In [ ]: def f(x):
return (1.0 - np.cos(x))/(np.sin(x)*np.sin(x))
In [ ]: for i in range(13):
x = 10.0**(-i)
print("%.15f %.15f" % (x, f(x)))
Subtração de números próximos
Resolvemos este problema multiplicando ambos o numerador e o denominador de 𝑓 por
1 + cos 𝑥 .
1 − cos 𝑥
𝑓 (𝑥) =
sen2 𝑥
Subtração de números próximos
In [ ]: def h(x):
return 1.0/(1.0 + np.cos(x))
Subtração de números próximos
In [ ]: def h(x):
return 1.0/(1.0 + np.cos(x))
In [ ]: for i in range(13):
x = 10.0**(-i)
print("%.15f %.15f %.15f" % (x, f(x), h(x)))
Análise de erros de aritmética
Considerando o arredondamento para o mais próximo, é possível mostrar que
fl(𝑥) − 𝑥| 1
ER(fl(𝑥)) =
|
𝑥
| |
≤ 2𝜀
In [ ]: import numpy as np
np.finfo(np.float64).eps
Análise de erros de aritmética
De nindo 𝛿 = [fl(𝑥) − 𝑥] /𝑥 e isolando fl(𝑥), obtemos
onde 𝛿 é o valor de uma perturbação usada para representar o erro que poderá ocorrer
ao nal da operação.
Exemplo
Sejam 𝑥 e 𝑦 números reais positivos.
Estime o erro relativo que ocorrerá na operação 𝑥 ⊕ 𝑦 em um sistema de ponto
utuante arbitrário
Exemplo
(𝑥 + 𝑦) − (𝑥 ⊕ 𝑦)|
Com efeito, o erro relativo será:
ER(𝑥 ⊕ 𝑦) =
|
|(𝑥 + 𝑦)|
|| 𝑥(𝛿1 + 𝛿3 ) + 𝑦(𝛿2 + 𝛿3 ) ||
≈| ( 𝑥 + 𝑦) |
| |
Exemplo
Tomemos 𝛿 = max {|𝛿1 + 𝛿3 |, |𝛿2 + 𝛿3 |} . Então,
𝑥
fl( ̂ + 𝑦)̂ = (𝑥̂ + 𝑦)(1
̂ + 𝛿1 ),