Home > Tecnologia > Informática > Arquitectura de Computadores > Conversão binário-decimal com vírgula flutuante

Conversão binário-decimal com vírgula flutuante

Vimos no artigo anterior, como converter bases numéricas mas para valores inteiros. Contudo, se queremos fazer uma conversão entre binário e decimal, com números de vírgula flutuante, a resolução já requer mais algumas noções extra!

Vamos analisar estes casos apenas para binário e decimal, voltando a um exemplo básico em decimal.

Considere-se o número:

0,145

Temos, então, uma décima (peso de 0,1), 4 centésimas (peso de 0,01) e 5 milésimas (peso de 0,001).

Traduzindo em potências de base 10, temos:

Conversão binário-decimal com vírgula flutuante

Conversão de binário para decimal com vírgula flutuante

Vejamos, agora, um número binário:

0,01

Se para a parte inteira, usávamos potências de base 2 positivas, para a parte decimal usamos potências de base 2 negativas. À semelhança do que vimos em decimal, teremos:

Conversão binário-decimal com vírgula flutuante

Logo: 0,01 (2) = 0,25 (10)

Vejamos agora um número binário mais completo e usemos também a amiga tabela:

101,11

22 = 421 = 220 = 12-1 = 0,502-2 = 0,25
101,11

Temos, então:

Conversão binário-decimal com vírgula flutuante

Logo: 101,11 (2) = 5,75 (10)

Mas nem tudo é sempre assim tão simples se considerarmos um limite dado pela precisão que podemos ter com um determinado número de bits. Seja o limite dado por 7 bits e considere-se ainda o seguinte binário (repare-se que neste caso representamos os zeros à direita para completar 7 bits):

0,1100100

Fazendo as contas temos:

Conversão binário-decimal com vírgula flutuante

Agora, a questão está num problema que existe até nos conversores de digital para analógico. Trata-se da resolução ou precisão! Um número binário está limitado a um determinado número de combinações possíveis e, mesmo com casas decimais, enfrentamos também esse problema.

Repare-se que temos 7 dígitos binários na representação das casas decimais. Sabemos que, na parte inteira, 7 bits podem representar um total de 27 combinações, ou seja, 128 combinações. Para a parte decimal, depois da vírgula, temos também apenas 128 representações possíveis, mas estas não são lineares como para a parte inteira. Basta ver que:

0,10 = 0,5

0,01 = 0,25

0,11 = 0,75

Ou seja, temos intervalos não contínuos de números decimais! Não quer dizer que não tenhamos um 0,1 ou um 0,7 pois estes podem aparecer com mais bits, como veremos em seguida. O problema reside em saber se com 7 bits conseguimos representar todo o valor que obtivemos: 0,78125.

Para garantirmos que o valor decimal resultante respeita a resolução, ou precisão, que temos com 7 bits, temos a seguinte condição genérica:

10p ≤ 2n, com p o número de algarismos (precisão) para as casas decimais e n o número de bits. No caso, sabemos que temos 7 bits, ou seja, a condição será: 10p ≤ 27.

Para determinar p, temos que fazer um cálculo adicional e temos, para tal, uma fórmula um pouco mais complicada, pois envolve um logaritmo de base 10.

A fórmula genérica, usando as mesmas letras p e n, é:

Conversão binário-decimal com vírgula flutuante

Em que a função ⌊x⌋ representa a função de nome Inglês “floor”, que devolve o maior número inteiro menor ou igual que x.

Para o nosso caso, que temos 7 bits, temos que:

Conversão binário-decimal com vírgula flutuante

Ou seja, temos apenas dois algarismos de precisão!

Assim, chegamos à conclusão que, atendendo a uma resolução de 7 bits, o nosso resultado será:

0,1100100 (2) = 0,78 (10)

Para terminar esta parte, considere-se que teríamos resoluções ou precisões de 10 e 16 bits…

Com 10 bits, o binário seria representado por:

0,110010000

Teríamos então:

Conversão binário-decimal com vírgula flutuante

Então, a solução já seria dada por:

0,1100100000 (2) = 0,781 (10)

E com 16 bits, teríamos o binário representado por:

0,110010000000000

Calculando o número de algarismos de precisão:

Conversão binário-decimal com vírgula flutuante

Arredondando, a solução seria:

0,1100100000000000 (2) = 0,7813 (10)



Conversão de decimal para binário com vírgula flutuante

Terminamos este artigo com a conversão de um número fraccionário de base 10 para binário.

Se para convertermos um inteiro utilizamos divisões sucessivas por 2, para casas decimais usamos multiplicações sucessivas por 2, mas com uma regra específica, até chegar a um resultado final exacto de 1.

Vejamos um dos resultados anteriores:

0,25

Usemos uma tabela para ajudar nesta fase:

0,25 x 2 =0,50
0,50 x 2 =1,00

Explicando, passo a passo, temos:

Multiplicamos o valor 0,25 por 2 e obtemos 0,50. Não temos ainda um resultado final de 1, por isso voltamos a multiplicar, agora 0,50 por 2 e obtemos 1 (1,00).

Agora, de cima para baixo, juntamos os resultados inteiros temos que:

0,25 (10) = 0,01 (2)

Este foi um exemplo simples, consideremos agora o número:

0,75

Parece simples… Façamos agora os cálculos passo a passo, com atenção:

0,75 x 2 = 1,50

Repare-se que temos um resultado maior que 1 e não exactamente 1,00! Se multiplicarmos por 2 teremos 3, e 3 não existe em binário! Que fazer?

Pegamos então nas casas decimais e continuamos com a parte inteira a zero!

0,50 x 2= 1,00

Finalmente chegámos a 1,00. Pegamos de novo nos inteiros de cima para baixo e temos que:

0,75 (10) = 0,11 (2)

Esta é a regra para este tipo de cálculo.

Vejamos outro decimal, já conhecido:

0,78125

Aplique-se o mesmo raciocínio:

0,78125 x 2 = 1,5625

0,5625 x 2 = 1,125

0,125 x 2 = 0,25

0,25 x 2 = 0,5

0,5 x 2 = 1

E lá temos o nosso 0,11001 em binário.

Neste caso, que não especificámos a precisão, será apresentado assim. Mas se pensarmos em ter 8 bits de precisão, teremos:

0,78125 (10) = 0,11001000 (2)

Se considerarmos menos bits de precisão, por exemplo 4, teremos que “truncar” o resultado para 0,1100.

O problema da resolução ou precisão verifica-se em números mais complicados. O seguinte número em base 10 pode parecer simples, mas vejamos:

0,32

Aplicando as regras:

0,32 x 2 = 0,64

0,64 x 2 = 1,28

0,28 x 2 = 0,56

0,56 x 2 = 1,12

0,12 x 2 = 0,24

0,24 x 2 = 0,48

0,48 x 2 = 0,96

0,96 x 2 = 1,92

Quando paramos? Tudo depende da precisão que queremos em números de bits!

Juntemos agora inteiros com casas decimais! Seja o número de base 10:

58,125

Neste caso, tratamos cada uma das partes!

Comecemos pela parte inteira, aplicando as divisões sucessivas por 2:

Conversão binário-decimal com vírgula flutuante

Temos então que 58 é, em binário, 111010.

Agora as casas decimais:

0,125 x 2 = 0,25

0,25 x 2 = 0,50

0,50 x 2 = 1,00

Temos então que 0,125 é, em binário, 0,001.

Juntando tudo, concluímos que:

58,125 (10) = 111010,001 (2)

Próximo artigo 



Este artigo foi escrito com a antiga grafia.

About Carlos Santos

Frequência em mestrado de Engenharia Electrotécnica e de Computadores. Programador freelancer: Websites, Aplicações Web (JAVA e PHP), J2SE/J2EE, C/C++ e Android. Explicador e formador em informática, matemática e electrotecnia. Formação presencial ou remota através de Skype e Team Viewer. Interesses: Música, áudio, vídeo, ciência, astronomia e mitologia.

3 comments

  1. oi, boa tarde. muito bom seu artigo spbre conversões com numeros com virgulas. voce tambem poderia explicar como converter hexadecimal com virgula em decimal? e vice-versa?

  2. Boa Noite Professor Carlos Santos

    Gostei bastante de seu artigo, inclusive mostrei para alguns alunos meus. Sou Professor da Faculdade SENAI de Blumenau-SC no Brasil. No entanto surgiu uma dúvida. Qual seria o seu e-mail para que eu possa lhe expor essa dúvida?

    Atenciosamente!
    Professor Jairo Gayo

    • Caro Professor Jairo Gayo.
      Antes demais, obrigado pelo seu feedback. Agradeço também a gentileza em chamar-me de Professor, mas não o sou, apesar de dar explicações e afins.
      Pode contactar-me para carlos.santos[at]out4mind.com
      Espero conseguir ajudá-lo na sua questão.
      Sugestão: Pode também colocar a questão por aqui, sempre ficará disponível para outros utilizadores. 🙂

Leave a Reply

Your email address will not be published and it is optional.