top of page

Aplicação FNR (Floating-point Numbers Representation)


Na representação em vírgula flutuante (em inglês, floating point) a posição da vírgula não é fixa, variando de operando para operando.


O formato dos números em vírgula flutuante tem dois campos: a parte decimal, que contém o valor propriamente dito, vamos representar pela letra D; e o expoente que representa um fator de escala (define a posição da vírgula, basicamente), vamos representar pela letra E. Para além destes dois campos, existe também um bit de sinal S que toma o valor 0 se o número for positivo e 1 se o número for negativo, como veremos mais adiante.


Teremos então um formato deste tipo:

[S][ E ][ D ]

Legenda:

S: Sinal

E: Expoente

D: Parte decimal

O IEEE (Institute of Electrical and Electronic Engineers) propôs uma recomendação, conhecida por formato IEEE. Esta recomendação define os dois formatos suportados pela generalidade dos processadores: o formato de precisão simples e o formato de precisão dupla. Na precisão simples, os operandos são de 32 bits, dos quais 8 são expoente e 23 a parte decimal (o bit em falta é o bit de sinal). Na precisão dupla, os operandos são de 64 bits, com 11 bits para o expoente e 52 para a parte decimal.


Por sua vez, o expoente é representado sempre com um deslocamento fixo, o que permite obter expoentes negativos para a representação de valores fraccionários pequenos. Em precisão simples, este deslocamento é de 127, e em precisão dupla, de 1023. Isto significa que o expoente verdadeiro é calculado por E-127 ou E-1023, respetivamente.


Assim, os valores representados no formato IEEE são, com precisão simples, por S(1,D)*2^(E-127) e, com precisão dupla, por S(1,D)*2^(E-1023).


As seguintes imagens dão uma melhor visão do que foi falado até aqui:

Então, mas como é que representamos o número 3,5 em precisão simples, por exemplo?


Boa pergunta! O algoritmo é apresentado a seguir:


Algoritmo


1. Colocar o número no formato: S(1,D)*2(expoente)

1.1 Se o número for maior ou igual a 2

a. Enquanto o número for maior ou igual a 2

Dividir o número por 2

(o expoente é o número de divisões)

1.2 Senão Se o número for menos que 1

b. Enquanto o número for menor que 1

Multiplicar o número por 2

(o expoente é o número negativo de multiplicações)

1.3 Senão

(o expoente é 0)

2. Colocar o número no formato IEEE: S(1,D)*2(expoente-127 ou -1023)

3. Encontrar o bit de sinal, os bits para a parte decimal e os bits para o expoente.


Na prática, fazemos assim:


1º passo: Colocar o número no formato: S(1,D)*2(expoente)


O número é maior que 2?

A resposta é sim. 3,5 > 2.


Recorrendo ao algoritmo, a primeira condição é precisamente a condição verificada no 1º passo, logo só temos de fazer o que nos diz o algoritmo, dividir o número 3,5 por 2 enquanto for maior ou igual a 2.


Então, vem:

3,5 / 2 = 1,75


1,75 < 2. Já não são necessárias mais divisões.


Qual é então o valor do expoente?

Se seguirmos o algoritmo, percebemos que é igual ao número de divisões que foram feitas, neste caso, apenas 1 divisão.


Nota: expoente = 1


Já podemos escrever o número no formato S(1,D)*2(expoente), como é indicado na alínea 1. do algoritmo: 3,5 = 1,75*2^(1)


2º passo: Colocar o número no formato IEEE: S(1,D)*2(expoente-127 ou -1023)


Como queremos representar o número em precisão simples, o deslocamento do expoente é de 127. O valor verdadeiro do expoente é E-127 = 1; E=128.


No formato IEEE: 3,5 = 1,75*2^(128-127)


Sinal: 0 (o número é positivo)


3º passo: Encontrar o bit de sinal, os bits para a parte decimal e os bits para o expoente.


Parte decimal: 0,75 = 0,5 + 0,25; (ver imagem acima)


0,5 = 1/2^1

0,25 = 1/2^2


Sequência de bits: 11000000000000000000000


Expoente: 128 = 2^8 = 10000000


Resultado final: 0 10000000 11000000000000000000000

[S][ E ][ D ]


Resultado em HEX: 0x40600000


Se chegaram até aqui, estão de parabéns. Muitos são aqueles que desistem no início. Como puderam ver, dá algum trabalho até se chegar ao resultado final, principalmente aquela parte de conversão para binário. Foi por esta razão que decidi automatizar todo este processo, que é o papel de qualquer Engenheiro, e com apenas um click obtenho a representação de qualquer número instantaneamente.


Apresento-vos a minha aplicação de seu nome "FNR" - Floating Numbers Representation, realizada no âmbito da disciplina de Arquitetura de Computadores com o objetivo de automatizar todo este processo que é a representação de números em vírgula flutuante.


Deixo aqui alguns screenshots da aplicação e o link para poderem fazer o download gratuitamente do ficheiro .apk para instalar nos vossos dispositivos Android! Usem e abusem.

[tamanho: 808KB | compatibilidade: versão 4.0 ou superior]

A "FNR":

Até à próxima!

 

Envia as tuas sugestões para: dicasdeinformatica2015@gmail.com

Qualquer dúvida, não hesites em contactar-me!

POSTS RECENTES:
bottom of page