Você está na página 1de 12

Aritmética de ponto flutuante

Prof. Felipe Duque


felipe.duque@ufpe.br
29 de março de 2020

Apesar de o cálculo numérico ter suas raı́zes anteriores à era cristã, envolvendo
cálculos manuais ou com o auxı́lio de ferramentas como varas de contagem, foi so-
mente no século XX, com a concepção e difusão dos computadores eletrônicos, que a
humanidade começou a desfrutar dos métodos numéricos em grande escala. Hoje, por-
tanto, quem realiza os cálculos são os computadores - não mais “a pessoa que computa”
mas “a coisa que computa”.
Logo, o humano passa a operar o computador, e, para tal, precisa lidar com as
peculiaridades da matemática realizada pela máquina - a aritmética de máquina.
Motivação: na maioria das calculadoras, o resultado do cálculo 254 − 25−4 é igual
a 390625, que é igual a simplesmente 254 . O que ocorreu com a parcela 25−4 ?

1 Representação de números
Para nós, realizar contagens baseadas nos dedos das mãos (i.e., nas bases 5 ou 10) pode
parecer absolutamente intuitivo1 , mas a fabricação de hardware que permite apenas a
comutação entre dois estados é extremamente barata - um transistor, unidade básica da
lógica digital, é, hoje, milhares de vezes mais barato do que um grão de arroz! Logo, a
representação binária (i.e., na base dois) tornou-se pervasiva nos computadores digitais.
Mas qual é a diferença, na prática, entre representações em diferentes bases?
A nossa representação decimal implica que há 10 sı́mbolos diferentes para represen-
tar os números. Valores maiores do que 10 são representados por meio de combinações
dos sı́mbolos permitidos. Cada posição nessa composição carrega diferentes pesos:
quanto mais à esquerda, maior o peso do sı́mbolo, i.e., em 2210 (“22” na base 10),
o “2” à esquerda tem maior valor do que o da direita. A representação binária tem
exatamente a mesma filosofia, mas permite apenas 2 sı́mbolos: 0 e 1.
1
Muitos povos primitivos aparentemente não tinham motivação para contar além de dois! Uma
tribo da Tasmânia, por exemplo, contava “um, dois, vários”. O costume de considerar o número
“três” como um número além de todos os outros, entretanto, deveria nos ser muito mais familiar do
que parece. É provável que “três”, em várias lı́nguas, tenha origem em algum radical similar a “trans”
(“além”), que tem uma forte conexão com “vários”. Por exemplo, no francês, très bien significa “muito
bem”; no latim, ter felix significa “muito feliz”; no grego, trismegistos significa “o melhor”.

1
29 de março de 2020

Na representação binária, cada sı́mbolo (bit) tem um peso associado a potências de


base 2, dependendo de sua posição no número, como pode ser visto a seguir:

310 = 112 = 21 + 20 , (1)


610 = 1102 = 22 + 21 , (2)
1810 = 100102 = 24 + 21 . (3)

Note que, na base 2, para representar 4 números, são necessários 2 bits; para
representar 8, são necessários 3 bits; para representar n, são necessários log2 n bits (ou
seja, k bits permitem 2k representações).
É interessante que a regra de formação dos números nas diferentes bases também
se estende aos números fracionários:

3,510 = 11,12 = 21 + 20 + 2−1 , (4)


8,37510 = 1000,0112 = 23 + 2−2 + 2−3 , (5)
4,12510 = 100,0012 = 22 + 2−3 . (6)

1.1 Representação em ponto fixo


Num computador, os números normalmente são representados numa quantidade fixa
de bits, que pode depender da finalidade da máquina. Por exemplo, máquinas simples,
como microprocessadores embutidos num forno de microondas, podem dispor de apenas
8 bits para representar seus números, totalizando 28 = 256 valores distintos. Se apenas
valores inteiros forem necessários, a máquina poderá representar os números entre
0 e 255. Entretanto, é comum que números fracionários sejam utilizados para, por
exemplo, realizar conversões analógico-digitais ou digital-analógicas. Para permitir a
representação de números fracionários, a seguinte pergunta pode ser feita: onde será
localizado o ponto decimal (a vı́rgula)?
A resposta dessa pergunta é uma decisão de projeto, que depende da faixa de valores
a serem utilizados na aplicação. Com 8 bits, algumas possı́veis posições da vı́rgula e
sua faixa de valores permitidos podem ser vistos a seguir:

 ,  ⇒ x ∈ [0; 127,5] (7)


 ,  ⇒ x ∈ [0; 15,9375] (8)
 ,  ⇒ x ∈ [0; 1,9921875], (9)

onde x é qualquer número passı́vel de representação em cada configuração. Note que,


quanto menor a parte inteira, maior a precisão fracionária, e vice-versa. Em qualquer
caso, entretanto, a quantidade de números passı́veis de representação é sempre igual.

2
29 de março de 2020

A partir do exposto na Eq. (9), podemos depreender que, na representação em


ponto fixo, os números reais x na base β são descritos como
n
X
x=± xi b−i , (10)
i=k

onde k ≤ 0, n > 0 e 0 ≤ xi < β. Se a base for binária, β = 2, xi ∈ {0; 1} e a


quantidade de bits é igual a n + |k| + 1. O valor n + 1 representa a quantidade de bits
à esquerda da vı́rgula, e |k|, à direita da vı́rgula. Na base binária, normalmente um bit
é reservado para indicar o sinal do número. Essa forma de representar números com
sinal é conhecida como complemento-2, mas não será objeto de nosso estudo.
O modo de representar números fracionários acima exposto dá à luz uma aritmética
própria: aritmética de ponto fixo, já que o ponto decimal tem posição fixa. Não estare-
mos interessados nas minúcias das operações pertinentes a essa aritmética. Vale notar,
entretanto, que processadores digitais de sinais (DSPs, de digital signal processor )2 e
alguns microprocessadores mais simples utilizam aritmética de ponto fixo.
Algumas caracterı́sticas da aritmética de ponto fixo incluem:

• pequena faixa dinâmica (i.e., distância entre o maior e o menor valores repre-
sentáveis);

• distância fixa entre números consecutivos;

• boa precisão para uma quantidade fixa de bits;

• facilidade de realizar operações matemáticas.

1.2 Representação em ponto flutuante


Uma dificuldade prática na utilização da representação de ponto fixo é o estabeleci-
mento da posição do ponto decimal. Diferentes posições podem ser necessárias para
diferentes aplicações, já que, como vimos, essa posição determina a faixa dinâmica do
sistema.
Para resolver esse problema, podemos permitir que o ponto decimal flutue. Podemos
utilizar parte dos bits do sistema para especificar a posição da vı́rgula. Por exemplo,
em 3,14 · 103 , a vı́rgula está, na realidade, 3 casas à direita da posição naquela notação.
Já em 3,14 · 10−2 , a vı́rgula está 2 casas à esquerda. Note que o número, em si, mudou,
mas o coeficiente (conhecido como mantissa ou significando) que multiplica a potência
permaneceu constante. Foi o expoente que determinou o local da vı́rgula. Ou seja,
para permitir que a vı́rgula flutue, podemos separar os bits em duas regiões: mantissa
e expoente. Essa nova representação origina a aritmética de ponto flutuante.
2
DSPs são hardwares altamente paralelizados especializados em realizar cálculos em grande quan-
tidade & velocidade. DSPs são utilizados majoritariamente para filtrar sinais diversos, como vı́deos
em alta definição, áudio, sinais sı́smicos etc.

3
29 de março de 2020

Dessa forma, se tivermos, por exemplo, 8 bits para representar um número em


ponto flutuante, podemos definir que 5 bits serão utilizados para a mantissa e 3, para
o expoente. Logo, a mantissa pode variar de 0 a 31, e o expoente, de 0 a 7. Note como
essa representação amplia drasticamente a faixa dinâmica:

0|{z} 0 0 0} = 0 · 20 = 0
0 0 0| 0{z (11)
expoente mantissa

1|{z} 1 1 1} = 31 · 27 = 3968.
1 1 1| 1{z (12)
expoente mantissa

Ou seja, enquanto na representação em ponto fixo temos, no máximo, uma faixa


dinâmica entre 0 e 28 − 1 = 255 (quando a vı́rgula está depois do bit mais à direita),
na representação em ponto flutuante já obtivemos uma faixa entre 0 e 3968 com a
configuração especificada no último parágrafo. Note que diferentes combinações dos
tamanhos da mantissa e do expoente resultam em diferentes faixas dinâmicas.
A partir do exposto, podemos concluir que, na representação em ponto flutuante,
um número real x na base b ≥ 2 tem a forma

x = ± m be , (13)
onde 1 ≤ m < b é a mantissa (que é um número em ponto fixo!) e e ∈ Z, é o
expoente. O número zero é um caso à parte: ele sempre pertence a todas as máquinas,
e é representado com mantissa zero. Comumente, as máquinas especificam a faixa de
variação do expoente, sendo e1 o menor, e e2 , o maior. Ademais, também se especifica
a quantidade t ∈ N de dı́gitos significativos da mantissa. Ou seja, se t = 3 e b = 10,
a mantissa m pode variar entre 1,00 e 9,99. Uma máquina F de ponto flutuante na
base b, com t dı́gitos significativos, menor expoente e1 e maior, e2 , é normalmente
representada como

F (b, t, e1 , e2 ). (14)
Logo, se temos a máquina F (10, 3, −5, 5), sabemos que o número x = 3,142·102 não
pertence a F porque esta só suporta 3 dı́gitos significativos, enquanto o número tem
4. Também os números y = 0,000000314 e z = 31400000 não pertencem a F devido
a valores não permitidos nos expoentes. Para verificar, podemos representar cada um
dos números no formato da Eq. (13): y = 3,14 · 10−7 e z = 3,14 · 106 , evidenciando
valores proibidos dos expoentes.
Conclui-se, portanto, que, apesar de tratarmos de números reais, apenas um subcon-
junto finito dos números reais pertence a máquinas de ponto flutuante, mesmo dentro
da sua faixa dinâmica - isso também ocorre com números representados em ponto fixo.
O que será, então, que ocorre se, na máquina F acima, uma operação matemática
resultar no número 3,142, que não pertence a F ? Veremos em breve.
Distância entre dois números consecutivos. A ampliação da faixa dinâmica
em máquinas de ponto flutuante não vem sem certos efeitos colaterais. O primeiro se

4
29 de março de 2020

refere à distância entre dois números consecutivos, chamada, em inglês, de gap. Na


máquina F (10, 3, −5, 5), os números 3,14 · 101 e 3,15 · 101 são vizinhos, i.e., não há
entre eles nenhum outro número pertencente a F . Note que a distância entre eles é
0,1. Mas os números 7,17 · 105 e 7,18 · 105 também são vizinhos, e o gap entre eles é
1000. Ou seja, diferentemente dos números em ponto fixo, a distância entre números
vizinhos numa máquina de ponto flutuante não é fixa - logo, a distribuição dos números
numa máquina de ponto flutuante não é uniforme. Isso naturalmente nos leva a uma
pergunta: qual é o maior (e o menor) gap em F ?
Para encontrar o maior gap, perceba que podemos escolher os vizinhos de maiores
magnitudes permitidas pela máquina. Logo, 9,99 · 105 e 9,98 · 105 preenchem esse
requisito. O gap procurado é a diferença entre eles:

9,99 · 105 − 9,98 · 105 = 0,01 · 105 = 103 . (15)


De forma semelhante, para encontrar o menor gap, podemos escolher os vizinhos
de menores magnitudes: 1,00 · 10−5 e 1,01 · 10−5 , cuja diferença é igual a

1,01 · 10−5 − 1,00 · 10−5 = 0,01 · 10−5 = 10−7 . (16)


Precisão dos números em ponto flutuante. Outro efeito colateral da ampliação
da faixa dinâmica é que os números em ponto flutuante são menos precisos do que
aqueles em ponto fixo, para uma mesma quantidade de bits de representação. Ora, se
a máquina de ponto flutuante precisa utilizar parte dos bits para representar o expoente,
sobram menos bits para representar a mantissa. Como a mantissa é um número em
ponto fixo, temos menos bits para a mantissa do que terı́amos se não houvesse a reserva
para o expoente. Logo, a mantissa tem menos casas decimais do que um número em
ponto fixo que utiliza todos os bits.
Além disso, na representação em ponto flutuante, erros de arredondamento (con-
forme veremos em breve) podem assumir valores muito maiores do que aqueles na
representação em ponto fixo, especialmente no caso de números vizinhos perto das
extremidades de representação da máquina.
Outros efeitos colaterais. Por fim, outros efeitos colaterais são muito mais
graves. Por exemplo: na máquina F , o que acontece se somarmos 7,15·105 a 1,43·10−5 ?
Terı́amos, por extenso, 7,15001431̇05 , que não pertence a F ! Estudaremos esses efeitos
numéricos mais adiante.
Quantidade de números representáveis pela máquina. Vimos que apenas um
subconjunto finito dos reais pode ser representado por uma máquina. Uma pergunta
que surge é: quantos números têm representação exata em dada máquina F ? Queremos
encontrar N(F ). A resposta pode vir da análise combinatória. Por exemplo, se temos
a máquina F (10, 3, −5, 5), podemos construir o seguinte esquema, que representa todas
as combinações possı́veis de números passı́veis de representação pela máquina:

5
29 de março de 2020

−5 a 5
00 a 99
z}|{
z}|{
 ,   ·10  .
± |{z} (17)
1a9

Logo, lembrando que o zero é um caso especial da mantissa, a expressão a seguir


fornece a quantidade procurada:

N(F ) = 2 · 9 · 102 · (5 − (−5) + 1) + 1 = 19801. (18)


onde constam:

• possı́veis sinais (2);

• possı́veis valores para o primeiro dı́gito da mantissa (9);

• possı́veis valores para os 2 dı́gitos pós-vı́rgula da mantissa (102 );

• possı́veis valores do expoente (11), e

• a inclusão do numeral zero.

Note que entre −5 e 5 há 11 valores possı́veis, pois o expoente zero deve ser incluı́do.
Generalizando3 a Eq. (18), temos, para F (b, t, e1 , e2 ) e e1 < 0:

N(F ) = 2 · (b − 1) · bt−1 · (e2 − e1 + 1) + 1. (19)


Região representada na reta real. Obtidos os valores de maior e menor magni-
tude (xmax e xmin ), podemos expressar a região passı́vel de representação de determi-
nada máquina na reta real, como mostra a Figura 1.

overflow underflow overflow

−xmax −xmin 0 −xmin xmax

Figura 1: Região representada por uma máquina de ponto flutuante.

Note que o elemento zero, apesar de “cercado” por números não-representáveis,


pertence a qualquer máquina. Matematicamente, temos que o subconjunto F dos
números reais passı́veis de representação numa máquina é:
3
Pessoalmente, eu nunca memorizo a fórmula. Recomendo que, sempre que precisar utilizá-la,
tentem chegar a ela pelo raciocı́nio. Acredito que são menores as chances de erro.

6
29 de março de 2020

F = [−xmax ; −xmin ] ∪ {0} ∪ [xmin ; xmax ]. (20)


Ressalte-se que não são representáveis todos os valores reais no conjunto acima, mas
apenas aqueles com t dı́gitos significativos. Note, também, que há lacunas entre |xmin |
e 0, e entre |xmax | e |∞|. A primeira é conhecida como região de underflow : se alguma
operação matemática resultar num número nessa região, o computador o representará
como zero. A segunda é a região de overflow. Se alguma operação matemática resul-
tar num número de magnitude maior do que |xmax |, o comportamento da máquina é
indefinido 4 .
Resumindo, então, algumas propriedades da representação em ponto flutuante, tem-
se que:

• a faixa dinâmica é consideravelmente maior do que com ponto fixo;

• a distância entre vizinhos (gap) não é constante: quanto maiores os números,


maior o gap;

• a distribuição dos números não é uniforme: os números de menores magnitudes


são mais numerosos;

• a precisão é menor do que aquela obtida com ponto fixo;

• operações aritméticas podem resultar em underflow ou overflow - isso também


ocorre com a representação em ponto fixo.

2 Aritmética de ponto flutuante


Como já mencionamos, nosso foco será na representação em ponto flutuante. Vimos que
uma máquina F (b, t, e1 , e2 ) consegue representar um subconjunto finito dos números
reais. Logo, pode-se esperar que alguma operação possa resultar num número que não
pertence a F . As operações realizadas com números pertencentes a uma dada máquina
de ponto flutuante constituem a aritmética de ponto flutuante. Ela deve lidar, por
exemplo, com o caso de determinada operação resultar num número que não pertence
à máquina.
Notação cientı́fica & arredondamento. Antes de realizarmos operações aritméticas,
recomenda-se que os números estejam em notação cientı́fica, como mostram os exem-
plos a seguir:
4
Na prática, há uma padronização mais moderna que evita o comportamento abrupto de zerar o
valor (flush to zero) no underflow. O padrão IEEE-754 estabeleceu um underflow gradual, ou seja,
são permitidos valores na região de underflow, com algumas regras especiais. Já no overflow, o mesmo
padrão IEEE-754 estabeleceu que o valor será representado como infinito.

7
29 de março de 2020

x = 271828 = 2,71828 · 105 . (21)


y = 3141,5 = 3,1415 · 103 (22)

Obtida a representação em notação cientı́fica, precisamos verificar se o número


pertence à máquina em análise. Caso afirmativo, o número segue inalterado. Caso
contrário, será preciso realizar um arredondamento, i.e., o número não terá uma repre-
sentação exata: a máquina o representará como o número mais próximo dentro do seu
conjunto de números representáveis.
Por exemplo, na máquina F (10, 4, −5, 5), x e y não teriam representação exata.
Logo, F busca o valor mais próximo dentro do seu conjunto permitido. O número x se-
ria arredondado para x = 2,718 · 105. Para chegar a esse valor, o seguinte procedimento
pode ser adotado:

1. Transforme o número em notação cientı́fica;

2. Se a máquina tem t dı́gitos significativos, preserve os t + 1 primeiros dı́gitos (sem


se preocupar com a vı́rgula);

3. Se o t + 1-ésimo dı́gito for:

(a) maior do que 5, adicione 1 ao t-ésimo dı́gito;


(b) igual a 5, adicione 1 ao t-ésimo termo se este for ı́mpar.

Seguindo esses passos, temos que y seria arredondado para y = 3,142 · 103 .
Adição & subtração. Agora estamos prontos para aprender as 4 operações
básicas. Vamos calcular x + y na máquina F descrita acima. O procedimento a seguir
pode ser utilizado para realizar adições (subtrações) em máquinas de ponto flutuante.

1. Coloque ambos os números em notação cientı́fica;

• x = 2,718 · 105 e y = 3,142 · 103 .

2. Se necessário, arredonde os números para que possam ser representados na máquina;

• Ambos os números pertencem a F .

3. Represente o número de menor expoente com o mesmo expoente do outro número;

• y = 0,03142 · 105 .

4. Some (subtraia) as mantissas e mantenha a base e os expoentes;

• z = x + y = 2,74942 · 105 .

5. Coloque o valor resultante em notação cientı́fica;

8
29 de março de 2020

• z = 2,74942 · 105 .

6. Arredonde o valor resultante de forma que “caiba” na máquina em questão.

• z = 2,749 · 105 .

Voltando ao exemplo motivador do inı́cio do capı́tulo, estamos, agora, aptos a


responder à seguinte questão: por que, em algumas calculadoras, o resultado de 254 −
25−4 é simplesmente 254 ?
Se considerarmos que a calculadora utiliza o tipo float da linguagem C, que fornece
uma máquina semelhante a K(10, 8, −38, 38), temos:

254 = 3,90625 · 105 (23)


25−4 = 2,56 · 10−6. (24)

Ao transformar o menor expoente no maior, realizando a soma e arredondando,


temos:

25−4 = 0,0000000000256 · 105 ⇒ (25)


3,90625 · 105 + 0,0000000000256 · 105 = 3,9062500000256 · 105 ⇒ (26)
3,9062500000256 · 105 ∈
/K ⇒ (27)
3,90625 · 10 + 0,0000000000256 · 105
5
≃ 3,90625 · 105 . (28)

Logo, a parcela 25−4 é ignorada frente à parcela 254 .


Multiplicação & divisão. Podemos calcular x · y e x/y na máquina F por um
procedimento muito semelhante ao da adição e subtração:

1. Coloque ambos os números em notação cientı́fica;

2. Se necessário, arredonde os números para que possam ser representados na máquina;

3. Multiplique (divida) as mantissas e some (subtraia) os expoentes;

• z = x · y = 8,539956 · 108 .

4. Coloque o valor resultante em notação cientı́fica;

• z = 8,539956 · 108 .

5. Arredonde o valor resultante de forma que “caiba” na máquina em questão.

• z resultará em overflow ! Ou seja, a máquina F não consegue representar a


multiplicação especificada.

9
29 de março de 2020

Erros numéricos. Se um número x precisa ser arredondado para x para ser


corretamente representado numa máquina, há um erro entre x e x chamado de erro
de arredondamento. Esse erro pode ser atenuado, ou até eliminado, com o aumento da
precisão da máquina.
Entretanto, caso queiramos representar um número irracional, como π ou e, não há
máquina que possa eliminar o erro de representação. Nesse caso, diz-se que o erro é do
tipo inerente.
Semelhante ao erro inerente é o erro de truncamento, que ocorre quando se substitui
um processo matemático infinito por um processo finito. Como exemplo, sabe-se que
a função ex pode ser aproximada pelo seguinte somatório:

x
X xk
e = . (29)
k=0
k!
Entretanto, é impossı́vel realizar esse cálculo exatamente, já que são necessários infini-
tos termos. Podemos considerar apenas os n primeiros termos - com isso, estaremos
incorrendo no erro de truncamento.
Cálculo do erro. Quando uma máquina não consegue representar um número x
exatamente, ela procura aquele x possı́vel mais próximo. Com isso, há uma discrepância
entre x e x. Esse erro pode ser calculado de três formas:

• ∆x = |x − x|: erro absoluto;


∆x
• δx = x
: erro relativo;

• px = 100 · δx: erro percentual.

Se determinada máquina G representa x = 9 como x = 10, temos ∆x = 1. Se


determinada máquinha H representa x = 9999 como x = 10000, temos, igualmente,
que ∆x = 1. Mas intuitivamente sabemos que H é mais precisa do que G, já que esta
não consegue resolver sequer uma parte em nove, enquanto aquela não consegue resolver
uma parte em quase dez mil. Matematicamente, são os erros relativo e percentual que
embasam essa afirmação. Para G, δx = 1/9; para H, δx = 1/9999. Logo, o erro da
máquina G é bastante superior ao da H.

2.1 Leitura extra: efeitos numéricos


Agora é a hora de analisarmos com mais cuidado a aritmética de ponto flutuante.
Alguns efeitos numéricos em aritmética de ponto flutuante já foram causas de muitos
transtornos no mundo real.
Em 1991, durante a Guerra do Golfo, um mı́ssil iraquiano conseguiu penetrar a
defesa antiaérea estadunidense, matando 28 pessoas. Eis a explicação. O sistema
de defesa havia sido programado para funcionar durante curtos intervalos de tempo -
quando algum alerta de mı́ssil fosse emitido -, mas, por alguma razão, ele já estava em

10
29 de março de 2020

h 0,001 0,002 0,004 0,008 0,016 0,032


f (3,253)

10 10 7,5 6,25 6,875 27,5

estado de alerta por vários dias, sem parar. Acontece que o marcador de tempo, usado
para calcular a trajetória do mı́ssil de defesa, era em ponto flutuante. Após vários dias
em execução, o relógio não era mais incrementado pelo mesmo problema da expressão
254 − 24−4 : uma parcela tornou-se irrelevante em relação à outra. Logo, o sistema não
conseguia mais calcular corretamente o momento e a trajetória dos mı́sseis de defesa.
O objetivo desta seção é fortalecer o senso crı́tico do engenheiro ao trabalhar com
aritmética de ponto flutuante.
Cancelamento subtrativo. Considere que, na máquina F (10, 4, −5,5), desejemos
calcular a derivada de f (x) = x2 em x = 3,253. Pela teoria, sabemos que f ′ (3,253) =
6,506. Numericamente, vamos tentar chegar a esse resultado por meio da expressão da
derivada obtida pelo limite:

f (x0 + h) − f (x0 )
f ′ (x0 ) = lim . (30)
h→0 h
Intuitivamente, podemos presumir que, quanto mais próximo de 0 estiver h, mais
preciso será nosso cálculo. A Tabela (2.1) mostra os resultados obtidos para h variando
de 0,032a0,001.
Note que a melhora não foi monotônica com a redução de h. De forma mais
especı́fica, para os dois menores valores de h, houve significante piora no valor de
f ′ (3,253). Por que isso ocorre?
Esse é o fenômeno do cancelamento subtrativo, bastante conhecido na análise numérica.
O resultado do cancelamento é a perda - muitas vezes catastrófica - da precisão quando
um número é subtraı́do de outro muito próximo. No exemplo acima, isso ocorre de
forma mais pronunciada quando h se aproxima de zero, fazendo f (x0 +h) muito próximo
de f (x0 ). Para entender melhor como ocorre essa perda de precisão, vamos a um exem-
plo mais simples.
Consdere que, na mesma máquina, seja realizada a operação x − y = z, onde
x = 8,000 · 102 , y = 6,000 · 102 e, portanto, z = 2,000 · 102 . Note que, na verdade,
x pode representar qualquer valor no intervalo [7,9995 · 102 ; 8,0005 · 102 [, enquanto
y ∈ [5,9995 · 102 ; 6,0005 · 102 [. Logo, z pode representar valores no intervalo [1,999 ·
102 ; 2,001 · 102 ]. Essa faixa de variação de z normalmente não acarreta problemas, já
que o comprimento do intervalo é uma fração muito pequena do valor obtido para z,
que pode representar valores entre 0,9995z e 1,0005z.
Considere, agora, que x = 6,002 · 102. Temos, portanto, z = 2,000 · 10−1 = 0,2. Mas,
agora, z pode representar valores no intervalo [0,1; 0,3]. Ou seja, z pode representar
valores que vão desde 0,5z até 1,5z! A subtração resultou numa desastrosa perda de
precisão: esse é o efeito numérico do cancelamento subtrativo.
Como lidar com esse efeito? Na verdade, não existe uma fórmula pronta para lidar
com cada caso. No caso da derivada, comumente tomam-se outras expressões mais

11
29 de março de 2020

robustas ao efeito. As mais utilizadas são vistas na Eq. 32.

f (x + h) − f (x − h)
f ′ (x) ≃ (31)
2h
f (x − 2h) − 8f (x − h) + 8f (x + h) − f (x + 2h)
f ′ (x) ≃ . (32)
12h

Épsilon (ǫ) da máquina. Lembre-se de que, no exemplo motivador deste capı́tulo,


algumas calculadoras podem exibir 254 − 25−4 = 254 . Ou seja, um número x somado
a y 6= 0 resultou em x. Entretanto, é possı́vel que a mesma calculadora forneça o
resultado correto para 254 − 25−2 . Deve existir, portanto, um certo valor máximo de y
a partir do qual a máquina não mais incorre nesse erro.
O ǫ da máquina busca encontrar esse valor máximo quando x = 1. Ou seja, ǫ
de determinada máquina é o maior número de ponto flutuante y tal que y + 1 não é
distinguı́vel de 1:

ǫ = max (y | 1 + y = 1). (33)


Como exemplo, para F (10, 4, −5, 5), temos ǫ = 5,999 · 10−4 .
É interessante que a existência do ǫ acarreta um efeito contraintuitivo. Considere
que queremos calcular

a+b+c (34)
a=1 (35)
b=ǫ (36)
c = ǫ. (37)

Note que, se calcularmos primeiro a + b, obtemos

(a + b) + c = (1 + ǫ) +ǫ = 1 + ǫ = 1. (38)
| {z }
=1

Por outro lado, se calcularmos primeiro b + c,

a + (b + c) = 1 + (ǫ + ǫ) = 1 + 2ǫ 6= 1. (39)
Ou seja, a existência do ǫ implica que, em aritmética de ponto flutuante, a lei da
associatividade das operações não existe. Uma forma de lidar com esse efeito é sempre
começar as subtrações e adições pelos menores valores.

12

Você também pode gostar