Já são tantas as vezes que expliquei o processo de conversão de um número qualquer para o formato binário em vírgula flutuante de acordo com a Norma IEEE-754 que desta vez, apeteceu-me escrever sobre isto. 🙂 Quem não quiser ler o que segue e preferir saltar para a versão condensada, clique aqui.
Entre outras coisas, a Norma IEEE-754 especifica dois níveis de precisão: simples e dupla. O primeiro nível ocupa 32 bits, o segundo, 64 bits. Para quem programa em linguagem C, o primeiro nível de precisão corresponde a uma variável do tipo float, o segundo, a uma variável do tipo double.
Atente à distribuição dos bits, de acordo com o nível de precisão do formato:
Tomemos por exemplo o número 94.0254, para o converter para um número em vírgula flutuante com precisão simples (32-bits) de acordo com a Norma IEEE-754. Este número é composto por duas partes: uma inteira (94) e uma fraccionária (0.0254).
1) Comecemos por converter para binário a parte inteira. Não vou entrar nos detalhes da conversão de um número entre os formatos Decimal e Binário. Há muita literatura sobre este assunto e muitos conversores automáticos online…
Portanto, a parte inteira fica: 1011110
2) Em seguida, converte-se a parte fraccionária. Mais uma vez, abstenho-me de entrar nos detalhes deste tipo de conversão. Creio que tal como a imagem anterior, a imagem abaixo é self-explanatory.
Portanto, o número Real convertido para binário fica:
3) O passo seguinte consiste na normalização do número convertido para o formato 1.xxxxxx… Isto é, operar o número original por forma a que a parte inteira fique “reduzida” a uma unidade. Para tal, usa-se a operação SHIFT LOGICAL RIGHT, ou simplesmente, divide-se por 2 e multiplica-se por 2, tantas vezes quantas as necessárias:
A última linha do processo acima, apresenta o número 94.0254, convertido para um número binário normalizado, multiplicado por 2^6, para satisfazer um dos requisitos da Norma IEEE-754. A parte em fundo cor de rosa, corresponde à parte fraccionária que aparecerá na trama final de 32 bits. São apenas 23 bits (os que cabem na precisão simples). Os restantes bits ficam truncados, originando um erro na representação do número original.
4) O 6 a fundo amarelo do passo anterior será adicionado a um BIAS, definido pela Norma IEEE-754, de acordo com o nível de precisão pretendido:
float (32 bits): BIAS = 127 (expoente de 8 bits)
double (64 bits): BIAS = 1023 (expoente de 11 bits)
O resultado desta soma corresponde ao valor da parte correspondente ao EXPOENTE do número em vírgula flutuante. Este expoente fica então (a fundo verde):
5) Por fim, o bit mais significativo da trama de 32 bits (64, no caso da precisão dupla), corresponde ao bit de Sinal. Este bit é igual a 1 se o valor original for negativo. Neste exemplo, este bit (a fundo azul na representação abaixo) fica igual a Zero.
6) Juntanto as parcelas todas, obtém-se a representação de 94.0254 no formato vírgula flutuante com precisão simples de acordo com a Norma IEEE-754:
————————
Resumidamente: