Você está na página 1de 23

Natureza da Informação

Números de Ponto Flutuante

Prof. Thiago Covões

Baseado nos slides do Prof. Fabrício Olivetti


Representação binária

o Vimos como representações binárias de números


inteiros
o Sinal magnitude
o Complemento de 2
o Vimos uma representação binária para um
número não-inteiro
o Separando alguns bits para a parte inteira e outra para a
parte fracionária
o (10,111)2 = 2 + 0,5 + 0,25 + 0,125 = (2,875)10
o Posição da vírgula definida a priori

2
Representação binária

o Exemplo, números representados por 4 bits:


o Um bit à direita da vírgula, três à esquerda:
o Parte inteira: 0 a 7
o Parte fracionária: 0 ou 0,5
o Como representar 3,2? Aproximar → 3,0 ou 3,5 → 0110 ou 0111
o Dois bits à direita da vírgula, dois à esquerda:
o Parte inteira: 0 a 3
o Parte fracionária: 0, 0,25, 0,5 ou 0,75
o Como representar 3,2? Aproximar → 3,25 → 1101 → menor erro
o Maior número representável é 3,75

3
Representação número real

o Como tomar essa decisão independente de aplicação?


o É necessária uma representação mais flexível!
o Tenha bits suficientes para representar grandes
magnitudes
o Tenha bits suficientes para representar de forma precisa
números com muitas casas decimais

o Precisamos que o separador decimal “flutue” na


representação
o Esses são os números de ponto flutuante :-D

4
Notação científica normalizada

o Podemos representar o número 12,34 como:


o 1,234 x 101
0,1234 x 102
123,4 x 10-1
1234 x 10-2
Para evitar essa multiplicidade, utilizaremos a notação
científica normalizada: um único dígito antes da
vírgula sendo ele não-zero (exceto para representar o número zero, claro!)
1,234 x 10

5
Notação científica normalizada

o Temos portanto um número (N)2 no formato:


o N = F x BE
o F é a parte fracionária (mantissa)
o O nome soa estranho? Lembre-se que um dígito não-zero em
binário só pode ser 1!

o B é a base = 2
o E é o expoente

6
Como isso nos ajuda?

o Vamos supor que temos 5 bits para representar


números reais
o 2 bits para o expoente
o Mapeados para –1, 0, 1 e 2
o 00 -> -1
o 01 -> 0

o 10 -> 1
o 11 -> 2

o 3 bits para a mantissa

7
Como isso nos E F Valor

ajuda?
Decimal
0 0 1 0 0 0,500

0 0 1 0 1 0,625

0 0 1 1 0 0,750

0 0 1 1 1 0,850

0 1 1 0 0 1,000

0 1 1 0 1 1,250

(1,750)10 = 1,11 x 20 0 1 1 1 0 1,500

(0,11)2 = 2-1 + 2-2 = 0,5 + 0,25 0 1 1 1 1 1,750

1 0 1 0 0 2,000

1 0 1 0 1 2,500

1 0 1 1 0 3,000

1 0 1 1 1 3,500

1 1 1 0 0 4,000

1 1 1 0 1 5,000

1 1 1 1 0 6,000

1 1 1 1 1 7,000

8
Como isso nos E F Valor

ajuda?
Decimal
0 0 1 0 0 0,500

0 0 1 0 1 0,625

0 0 1 1 0 0,750
Isso é
0 0 1 1 1 0,850
desperdício!
0 1 1 0 0 1,000

0 1 1 0 1 1,250

(1,750)10 = 1,11 x 20 0 1 1 1 0 1,500

(0,11)2 = 2-1 + 2-2 = 0,5 + 0,25 0 1 1 1 1 1,750

1 0 1 0 0 2,000

1 0 1 0 1 2,500

1 0 1 1 0 3,000

1 0 1 1 1 3,500

1 1 1 0 0 4,000

1 1 1 0 1 5,000

1 1 1 1 0 6,000

1 1 1 1 1 7,000

9
Como isso nos ajuda?

10
Floating point number (IEEE-754)

o Permite representar números "grandes" ou


"pequenos"
o Vamos falar apenas dos números de precisão
simples (32 bits)
o Nas linguagens de programação, esse tipo de
número é normalmente conhecido por float
o O número tem 3 partes:
o Sinal Sinal Expoente (E) Mantissa (F)
o Mantissa 1 bit 8 bits 23 bits
32 bits
o Expoente

11
Floating point number (IEEE-754) G

o Por exemplo:
o (101101)2 = +1,01101 x 25

Sinal Expoente (E) Mantissa (F)


0 ???????? 01101000000000000000000

12
Floating point number (IEEE-754)

o Com 8 bits poderíamos representar:


o 28 = 256 expoentes diferentes!

o Por exemplo, [-127, +128]

o Mas, o padrão reserva dois expoentes


para casos especiais (mais sobre isso depois)
o 00000000
o 11111111

13
Floating point number (IEEE-754)

o Com 8 bits poderíamos representar


(representação binária sem sinal):

o 28 = 256 expoentes diferentes!

o Desconsiderando dois casos especiais.

o Temos: [-126, +127].

o Então, seja Ereal o expoente real e Ecomp o


expoente que será armazenado, temos:
o Ecomp = Ereal + 127

14
Floating point number (IEEE-754)

o Voltando ao exemplo:
o (101101)2 = +1,01101 x 25

o Ecomp = 5 + 127 = (132)10 = (10000100)2

Sinal Expoente (Ecomp) Mantissa (F)


0 10000100 01101000000000000000000

15
Floating point number (IEEE-754)

o Forma geral:
o -1S x (1+F) x 2Ecomp

Ecomp = Ereal + 127


Ereal = Ecomp - 127
Sinal (S) Expoente (Ecomp) Mantissa (F)
? ???????? ???????????????????????

16
Exemplo

o 1011010010001
+ 1,011010010001 x 212+127
(139)10 = (10001011)2

Sinal Expoente (E) Mantissa (F)


0 10001011 01101001000100000000000

17
Exemplo – Caminho inverso

Sinal Expoente (E) Mantissa (F)


1 10010001 10001110001000000000000

-1S x (1+F) x 2Ecomp-127


Ereal = (10010001)2 - (01111111)2 = (00010010)2
Ereal = (145)10 - (127)10 = (18)10
-11 x (1 + 0,10001110001) x 218
(-) 110 0011 1000 1000 0000
(-407680)10

18
Floating point number (IEEE-754)

o Números extremamente grandes e pequenos


podem ser representados:
o Maior magnitude ~ ± 3,4 x 1038

o Menor magnitude ~ ± 1,2 x 10-38

19
Floating point number (IEEE-754)

o Casos específicos:
o Lembra que dois expoentes foram
reservados (00000000 e 11111111)?
o E=0; F≠0 → (-1)S × 2-126 × 0,F

o E=0; F=0 → Zero (com sinal)

o E=255; F≠0 → Not a Number (NaN)

o E=255; F=0 → Infinito (com sinal)

20
Exercício

o Converter o número 3,248 x 104 para o


formato de 32 bits (precisão simples) de
ponto flutuante binário.

22
Exercício

o Converter o número 3,248 x 104 para o


formato de 32 bits (precisão simples) de
ponto flutuante binário.
o 3,248 x 104 = 32480

o (32480)10 = (111111011100000)2

o (111111011100000)2 = 1,11111011100000 x 214


o Ecomp = 14 + 127 = (141)10 = (10001101)2

Sinal Expoente (E) Mantissa (F)


0 10001101 11111011100000000000000

23

Você também pode gostar