Representação de Ponto Flutuante

Representação de números fracionários na Base 2

Como na base 10, posições à direita da vírgula correspondem a potências negativas de 2:

101,101 = 22+20+21+23 = 5,625

Representação IEEE

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

Armazenamento - float e double

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,xxxx
armazena-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
Referência