(30 Pontos) Considere uma máquina cuja representação de números é dada por um sistema de ponto flutuante
, isto é, base binária, 8 dígitos na mantissa e expoente no intervalo
.
(a) Represente os números
e
nessa máquina.
(b) Os números
e
podem ser representados exatamente no sistema?
Justifique sua resposta para cada número.
(a) Represente os números
(b) Os números
Passo 1
O que o enunciado pede: representar os números
,
e
na máquina de ponto flutuante
e dizer se cada um é representável exatamente nessa máquina, justificando.
Informações dadas e presumidas (tudo que vamos usar): \n
Informações dadas e presumidas (tudo que vamos usar): \n
- A base é binária:
. \n - A mantissa tem
dígitos: na forma normalizada a mantissa tem exatamente 8 dígitos binários com o primeiro dígito não nulo; em binário isso significa que o primeiro dígito é . Assim escrevemos um número normalizado como com . Em notação mais direta usamos (o primeiro dígito é o e temos então 7 bits fracionários efetivos). \n - O expoente
deve estar no intervalo inteiro . \n - O enunciado não fixa modo de arredondamento; vou usar o modo usual “arredondar para o mais próximo” (round to nearest, ties to even) ao reduzir a expansão binária ao limite de 8 dígitos de mantissa. Vou explicitar os bits de guarda/sticky quando necessário. \n
Passo 2
Breve aula: como representar um número real em
. \n
- Primeiro escrevo o número em binário com ponto binário. \n
- Depois normalizo para a forma
. Aqui são os 7 bits fracionários que cabem (total 8 dígitos contando o inicial). \n - Se a expansão binária tiver mais de 7 bits fracionários, usamos arredondamento: olhamos o bit seguinte (guard) e os bits além dele (sticky). Regra simplificada que vou usar: se guard = 0 ⇒ não incrementa; se guard = 1 e os bits seguintes não são todos zero ⇒ incrementa a mantissa; se exatamente tie (guard=1 e sticky=0) aplicamos tie-to-even (não vou ter muitos ties exatos neste exercício, mas é a regra padrão). \n
- Se o expoente necessário ficar fora de
o número não pode ser representado (overflow/underflow), mas aqui trabalharemos com expoentes pequenos. \n
Passo 3
Representação de
. \n
- Converter para binário: parte inteira
em binário é . A parte fracionária converte assim: \n
→ bit . \n
→ bit (resto ). \n
→ bit . \n
→ bit (resto ). \n
Logo a parte fracionária é exatamente. \n - Então
. \n - Normalizo: mover o ponto 3 casas à esquerda para obter leading 1: \n
- A mantissa normalizada tem a forma
. Aqui, após o ponto temos exatamente 7 bits: . Não sobrou nenhum bit além desses, portanto não há necessidade de arredondamento. \n - Conclusão para
: representação na máquina é e é EXATAMENTE representável (não houve truncamento nem arredondamento).
Passo 4
Representação de
. \n
- Note que
, então ao normalizar teremos expoente e precisamos representar a mantissa . \n - Precisamos converter a parte fracionária
para binário, obtendo os primeiros bits suficientes para decidir o arredondamento (pelo menos bits fracionários + bit de guarda e alguns além para sticky). Faço multiplicações sucessivas: \n
→ bit . \n
→ bit . \n
→ bit . \n
→ bit . \n
→ bit . \n
→ bit (resto ). \n
→ bit (resto ). \n
Próximo:→ bit (este é o bit de guarda, se precisarmos). \n - Assim os primeiros bits fracionários de
(após o 1 inicial) são (7 bits) e o bit seguinte (guard) é . Havia bits diferentes de zero depois do guard (sticky) porque vimos posteriormente que aparecem mais 1s em posições posteriores ao guard (a expansão não termina em zeros), então sticky = 1. \n - Aplicando a regra de arredondamento para o mais próximo: como o bit de guarda é
, não incrementamos a mantissa; ficamos com . \n - Conclusão para
: a representação na máquina (arredondada para nearest) é . Como a expansão binária da parte decimal de é infinita (não é uma fração com denominador potência de ), NÃO é representável exatamente — houve arredondamento.
Passo 5
Representação de
. \n
- Converter a parte inteira:
. Em binário . A parte fracionária é . Então . \n - Normalizo: mover o ponto 10 casas para a esquerda para obter leading 1: \n
onde depois do ponto temos a sequência de bits
(essa sequência tem 11 bits após o 1: oito zeros, depois
). \n
3) Precisamos guardar só 7 bits fracionários. Os primeiros 7 bits após o 1 são todos zeros: . O bit seguinte (guard) é também
. Porém existem bits não nulos depois do guard (sticky = 1), porque mais à frente há três uns. Pela regra de arredondamento, guard =
implica que não incrementamos a mantissa. \n
4) Assim a mantissa na máquina fica e o expoente é
. A representação da máquina é
. \n
5) Note que esse número vale exatamente em decimal. Portanto a máquina armazena
como
(erro absoluto
). Além disso, o expoente
está justamente no limite superior permitido mas ainda dentro do intervalo, logo não houve overflow; houve, sim, perda de precisão por arredondamento. \n
6) Conclusão para : representação na máquina
e
NÃO é representável exatamente.
3) Precisamos guardar só 7 bits fracionários. Os primeiros 7 bits após o 1 são todos zeros:
4) Assim a mantissa na máquina fica
5) Note que esse número vale exatamente
6) Conclusão para