Como na base 10, posições à direita da vírgula correspondem a potências negativas de 2:
101,101 = 22+20+2-1+2-3 = 5,625
Vários formatos propostos, mas hoje em dia a maioria dos processadores utiliza o padrão 754 IEEE para aritmética binária de ponto flutuante.
São 3 precisões:
Tipo #bits Precisão Representação Aproximada Single precision (float) 32 24 2-126 -> 2127 Double precision (double) 64 53 2-1022 -> 21023 * Double extended precision 80 63 2-16382 -> 216383 * em decimal ~= 2,23 x 10-308 -> 1,79 x 10308
Os 32 ou 64 bits armazenam, de forma compacta, um número na forma (-1)S x M x 2 E, onde S é o sinal, M a mantissa e E o expoente. Um número qualquer poderia ter diversas representações com essa forma. Para evitar ambiguidade, considera-se a representação normalizada, onde 1 <= M < 2
Para precisão simples temos 1 bit de sinal, 8 para o expoente e 23 para a mantissa. Para precisão dupla temos 1 bit de sinal, 10 para o expoente e 53 para a mantissa.
simples |1| 8 | 23 | |S| E | M | dupla |1| 11 | 52 |
O bit de sinal é 0 para positivos e 1 para negativos. Como a mantissa é sempre da forma
1,xxxxarmazena-se apenas a parte fracionária, ou seja, existe sempre um "1" implícito.
O expoente, que pode ser positivo ou negativo, não é armazenado
em complemento a 2, e sim em uma representação conhecida como
excesso ou bias 2^(n-1)-1, onde n é o número de bits usado
para armazenar o expoente.
Ou seja, cada expoente e
é representado,
na precisão simples, por e+127
, e na precisão dupla,
por e+1023
.
Como exemplo, considere o número 178,125. Qual a sua representação em precisão dupla (double)?
178d = 128 + 32 + 16 + 2 = 1011 0010 0,125d = 0,001 ou seja, 178,125 = 1011 0010,001 = 1,011 0010 001 x 2^7 logo para double E = 7 + 1023 -> 1000000 0110b 0100 0000 0110 0110 0100 0100 0000 0000 ... 0000b = 4066440000000000h
casos especiais:
zero S = 0 E = 0 M = 0 +inf S = 0 E = 111...111 M = 0 -inf S = 1 E = 111...111 M = 0 NaN S = 0 E = 111...111 M diferente de 0