Arquitectura de Computadores

Notas de estudo

Alberto José Proença

1999/00

 

Índice geral

 

Anexo B : Representação de reais em vírgula flutuante

  1. Notação científica
  2. Normalização na representação
  3. Intervalo e precisão de valores representáveis
  4. Formato binário dum valor em fp
  5. O bit escondido
  6. A norma IEEE 754 para valores em fp

 

 

  1. Notação científica

 A representação de um valor infinito de valores usando uma máquina finita vai obrigar a assumir um conjunto de compromissos, os quais, no caso dos reais, irão afectar não só a gama de valores representáveis, como ainda a sua precisão. A utilização da notação científica, do tipo:

Valor = ( -1 )^S * Mantissa * Radix^Exp

é ainda aquela que permite obter a melhor representação de um n.º real em vírgula flutuante (ou fp na terminologia inglesa) com um n.º limitado de dígitos. O valor do radix é de 10 na representação decimal, e pode ser 2 ou uma potência de 2 na representação interna num computador. A IBM usava nos seus mainframes um radix de 16, pois permitia-lhe aumentar o intervalo de representação de valores; contudo os problemas que tiveram com esta representação (ver 4.11) deram mais força à utilização do valor 2 como radix.

 

  1. Normalização na representação

A notação científica permite que um mesmo n.º possa ser representado de várias maneiras com os mesmos dígitos (por ex., 43.789E+12 , .43789E14, 43789E+09). Para facilitar a sua representação - omitindo a necessidade de representar o ponto/vírgula decimal - impõe-se a adopção de uma norma de representação, e diz-se que um dado n.º fp está normalizado quando cumpre essa norma. Alguns autores consideram que um n.º está normalizado quando a mantissa (ou parte fraccionária, F) se encontra no intervalo ]Radix , 1]. Por outras palavras, existe sempre um dígito diferente de 0 à esquerda do ponto decimal.

Num exemplo em decimal com 7 algarismos na representação de fp (5 para a mantissa e 2 para o expoente), o intervalo de representação dum fp normalizado, seria em valor absoluto [1.0000E-99, 9.9999E+99] . Existe aqui um certo desperdício na representação de fp usando 7 algarismos, pois fica excluído todo o intervalo [0.0001E-99, 1.0000E-99[ . Para se poder optimizar a utilização dos dígitos na representação de fp, aceitando a representação de valores menores que o menor valor normalizado, mas com o menor valor possível do expoente, se designa esta representação de desnormalizada.

Todas as restantes representações designam-se por não normalizadas.

 

  1. Intervalo e precisão de valores representáveis

 Pretende-se sempre com qualquer codificação obter o maior intervalo de representação possível e simultaneamente a melhor precisão (relacionada com a distância entre 2 valores consecutivos). Existindo um n.º limitado de dígitos para a representação de ambos os valores - F e Exp - há que ter consciência das consequências de se aumentarem ou diminuírem cada um deles.

O intervalo de valores representáveis depende essencialmente do Exp, enquanto a precisão vai depender do número de dígitos que for alocado para a parte fraccionária. Numa representação em binário, a dimensão mínima a usar para fp (que será sempre um múltiplo da dimensão da célula) deverá ser pelo menos 32. Se fosse 16, 1 bit seria para o sinal, e os restantes 15 seriam insuficientes mesmo para representar apenas a parte fraccionaria (daria uma precisão de 1 em cerca de 32 000...).

Usando 32 bits para representação mínima de fp, torna-se necessário encontrar um valor equilibrado para a parte fraccionária e para o expoente. Esse valor é 8 para o expoente - permite representar uma gama da ordem de grandeza dos 1040 - e pelo menos 23 para a parte fraccionária - permite uma precisão equivalente a 7 algarismos decimais.

 

  1. Formato binário dum valor em fp

 Existem 3 campos a representar nos 32 bits dum valor em fp: o sinal (1 bit), a parte fraccionária (23 bits) e o expoente (8 bits). Para se efectuar qualquer operação aritmética estes 3 campos terão de ser identificados e separados para terem um tratamento distinto na unidade que processa os valores em fp. A ordem da sua representação (da esquerda para a direita) segue uma lógica:

 

  1. O bit escondido

Um valor normalizado tem sempre um dígito diferente de zero à esquerda do ponto decimal. Se o sistema de numeração é decimal, esse dígito pode ser um de entre 9 possíveis; se o sistema de numeração é binário, esse dígito só pode ser um. Assim, e apenas na representação binária, esse dígito à esquerda do ponto decimal toma sempre o mesmo valor, e é um desperdício do espaço de memória estar a representá-lo fisicamente. Ele apenas se torna necessário para efectuar as operações, permanecendo escondido durante a sua representação. Ganha-se um bit para melhorar a precisão, permitindo passar para 24 o n.º de bits da parte fraccionária (numa representação com 32 bits).

 

  1. A norma IEEE 754 para valores em fp

A representação de valores em fp usando 32 bits e com o formato definido anteriormente permite ainda várias combinações para representar o mesmo valor. Por outro lado, não ficou ainda definido como representar os valores desnormalizados, bem como a representação de valores externos ao intervalo permitido com a notação normalizada.

A norma IEEE 754 define com clareza estas imprecisões, permitindo uma maior compatibilidade ao nível dos dados no porte de aplicações entre sistemas que adoptem a mesma norma. De momento todos os microprocessadores disponíveis comercialmente com unidades de fp suportam a norma IEEE 754 no que diz respeito aos valores de 32 bits. Aspectos relevantes na norma IEEE 754:

A norma IEEE 754 contempla ainda a representação de valores em fp que necessitem de maior intervalo de representação e/ou melhor precisão, por várias maneiras. A mais adoptada pelos fabricantes utiliza o dobro do n.º de bits, 64, pelo que é também conhecida pela representação em precisão dupla, enquanto a representação por 32 bits se designa por precisão simples. Para precisão dupla, a norma especifica, entre outros aspectos, que o expoente será representado por 11 bits e a parte fraccionária por 52 bits.