Vírgula flutuante
Normalização, formato IEEE 754 em precisão simples e dupla e um exemplo completo de codificação.
Os inteiros não chegam para representar grandezas contínuas como ou distâncias astronómicas. A vírgula flutuante resolve o problema com uma ideia emprestada da notação científica: guarda um número significativo e uma potência da base que posiciona a vírgula.
Normalização
Normalizar é escrever o número com exatamente um dígito diferente de zero antes da vírgula. Em base 10:
O dígito antes da vírgula passou a ser o 3, e o expoente regista quantas casas a vírgula andou. Em base 2, a forma normalizada começa sempre por 1,:
Multiplicar por desloca a vírgula quatro casas para a esquerda, desfazendo a normalização. Como em binário o único dígito não nulo é o 1, o bit à esquerda da vírgula é sempre 1 e nem precisa de ser guardado. Esta é a ideia do bit implícito, que poupa um bit em cada número guardado.
O formato IEEE 754
A norma IEEE 754 fixa como os três ingredientes, sinal, expoente e mantissa, se arrumam nos bits. Há dois tamanhos:
| Campo | Precisão simples (float, 32 bits) | Precisão dupla (double, 64 bits) |
|---|---|---|
| Sinal | 1 bit | 1 bit |
| Expoente | 8 bits | 11 bits |
| Mantissa | 23 bits | 52 bits |
O valor codificado é:
Aqui é o bit de sinal, é a mantissa (os bits à direita da vírgula, sem o 1 inicial) e é o expoente guardado. O expoente guardado tem um viés (bias): soma-se 127 (ou 1023) ao expoente verdadeiro para que o campo guardado seja sempre positivo e a comparação de expoentes funcione como comparação de inteiros sem sinal.
Exemplo completo
Codifica em precisão simples. Primeiro separa a parte inteira da fracionária: . Para , multiplica por 2 sucessivamente: (regista 1), (regista 0), (regista 1), (regista 1). A fração é , por isso:
Agora identifica os campos. O sinal é negativo, logo . A mantissa são os bits depois de 1,: 0011011, completados com zeros até 23 bits. O expoente verdadeiro é , logo o campo guardado é .
O resultado final, separado em sinal, expoente e mantissa, é:
1 10000010 00110110000000000000000
Para descodificar, faz o caminho inverso: dá o sinal negativo, dá o expoente , e a mantissa com o bit implícito dá .
Limites do formato
A vírgula flutuante cobre um intervalo enorme, mas nem todos os valores decimais são exatos em binário: , por exemplo, gera uma dízima binária infinita e é guardado com um pequeno erro de arredondamento. É por isso que somar dinheiro com float acumula erros e os programas financeiros usam inteiros de cêntimos ou tipos decimais. Guarda também esta regra prática: compara com que precisão o problema precisa antes de escolheres entre float (32 bits) e double (64 bits).
Experimenta: codifica em precisão simples. (Resposta: , logo , , mantissa
0101000...0, e o código é0 10000001 01010000000000000000000.)