Lição
A teoria — Ponto flutuante284 palavras
Um número de ponto flutuante é um número inteiro multiplicado por uma potência de dois: (−1)s × 1.f × 2E−1023. O formato decide quantos bits pertencem a E e quantos a f, e essa única divisão define tanto o alcance do formato quanto a sua precisão ao distinguir dois números.
O que significa cada símbolo
s- o bit de sinal, 0 para positivo e 1 para negativo. Permanece isolado em vez de ser incorporado no número, razão pela qual o formato apresenta tanto um +0 como um −0.
E- o campo do expoente, armazenado com o acréscimo de 1023 para que possa assumir valores negativos sem precisar de um sinal próprio. É ele que escolhe em que intervalo o número se encontra, e é o intervalo que decide a distância entre os vizinhos.
f- a fração: 52 bits que sucedem a um 1 inicial que nunca é armazenado, dado que um número normalizado começa sempre por um. Estes 52 bits representam toda a precisão do formato, à qual o expoente não acrescenta nada.
- Pressupõe
- Que o número é finito e normal. Abaixo de 2−1022, o 1 inicial é omitido e o formato mantém-se sacrificando a precisão. Como resultado, o menor double positivo é 4,94 × 10−324 e carrega um único bit de significando.
- Falha quando
- Em dois lugares, ambos em código real. Comparar dois valores calculados com
=falha sempre que venham de vias distintas, porque rotas diferentes introduzem arredondamentos diferentes. Uma soma longa depende também da ordem de adição: some uma lista numa direção e depois na outra, e os totais divergem. Somar primeiro os termos menores é a forma de perder menos.
Problema resolvido na íntegra
-
Um sistema de pagamentos armazena montantes em libras no formato binary64. Mostre que £0,10 e £0,20 são ambos armazenados ligeiramente por excesso, que a sua soma não dá £0,30, e explique o que um engenheiro de pagamentos faz para solucionar o problema.
-
O valor 0,1 na base dois é 0,0001 seguido de 1001 a repetir-se infinitamente. Um décimo requer um cinco no seu denominador e uma fração binária é composta apenas por fatores de dois, de modo que a expansão nunca termina.
-
São mantidos 53 algarismos binários e os restantes são eliminados por arredondamento. Neste caso arredondam para cima, pelo que o valor armazenado fica 5,55 × 10⁻¹⁸ acima de 0,1. O passo de arredondamento na página ilustra essa direção com uma seta.
-
O número 0,2 corresponde a esses mesmos 53 algarismos mas com o expoente superior em uma unidade, logo o seu erro é o dobro exato: 1,11 × 10⁻¹⁷. Introduza 0,2 na caixa e compare os dois cartões de erro.
-
Quando somados, os dois valores armazenados recaem exatamente no ponto médio entre os dois números de dupla precisão de cada lado de 0,3. Em caso de empate, escolhe-se o vizinho que termina num bit par, que aqui corresponde ao valor imediatamente superior.
-
Assim, o resultado devolvido é 0,3000000000000000444089209850062616169452667236328125, e todos os cálculos seguintes vão arrastá-lo.
-
Agora digite 10 e 20 em vez de 0,1 e 0,2. Ambos são números inteiros bastante inferiores a 2⁵³, ambos são armazenados de forma exata, e 10 + 20 é 30 sem qualquer perda no processo.
Resposta
Guarde o dinheiro como um número inteiro da unidade mais pequena, pence em vez de libras, e a aritmética torna-se exata porque todos os inteiros até 2⁵³ são exatos. O único arredondamento que resta é aquele que você próprio escreve, no momento em que decidir fazê-lo, e para o qual pode apontar. A ferramenta mostra os dois lados em dez segundos: digite 0,1 e o cartão de erro não será nulo; digite 10 e será.
-