sábado, junho 27, 2009

REPRESENTAÇÃO DE DADOS

REPRESENTAÇÃO DE NÚMEROS REAIS
Até agora, passamos por cima de alguns outros problemas. Os dados numéricos podem ser fracionários (tais como 57,683). Como representar essa parte fracionária (após a vírgula que a separa da parte inteira), de forma que permita processamento eficiente e armazenamento com pouco consumo de memória? Vamos analisar esses problemas logo à frente.

NÚMEROS REAIS
Números reais são aqueles com parte fracionária (por exemplo, 57,683). Estamos acostumados a representar esses números no formato parte inteira, vírgula (ou ponto), parte fracionária:

Esta representação, embora cômoda para cálculos no papel, não é adequada para processamento no computador.

REPRESENTAÇÃO EM PONTO FLUTUANTE
Consideremos o número 57,683 usado acima como exemplo. Este número pode ser também expresso como 57,683 x 100. E também poderia ser expresso com 57683 x 10-3 ou ainda 0,57683 x 102. Na realidade, qualquer número - inteiro ou fracionário - pode ser expresso neste formato número x base expoente, em que variamos duas coisas: a posição da vírgula (que delimita a parte fracionária) e a potência à qual elevamos a base. Essa representação é denominada representação em ponto flutuante, pois o ponto varia sua posição, modificando, em conseqüência, o valor representado.

REPRESENTAÇÃO NORMALIZADA
Na representação normalizada, o número é preparado movendo a vírgula para a direita ou para a esquerda de forma que o número seja menor que 1, o mais próximo possível de 1, obviamente multiplicado por uma potência da base de forma a manter o valor do número. Em geral, isso significa que o primeiro dígito significativo seguirá imediatamente ao ponto (ou vírgula).
Por exemplo:
57,68310 --> normalizando ==> 0,57683 x 102
0,000462810 --> normalizando ==> 0,4628 x 10-3
0,000010112 --> normalizando ==> 0,1011 x 2-4

De forma genérica, podemos representar a forma normalizada:
± número x base ±expoente
A parte do número representado dessa forma normalizada (os algarismos significativos), damos o nome de mantissa.e portanto podemos representar:
± 0,M x B ± e
onde M é a mantissa, B é a base e e é o expoente.

REPRESENTAÇÃO DE NÚMEROS REAIS NO COMPUTADOR
Uma forma comum de representação de números reais no computador pode ser expressa como segue:

Pode-se notar que a base não é expressa. Como a base, para cada computador, será sempre a mesma, não há necessidade de apresentar a base na representação (no exemplo, a base é 2). Dizemos que a base é implícita.
Para cada computador, o número total M de bits para a representação, o número de bits para SN (sinal do número), para SE (sinal do expoente), para a mantissa e para o expoente, são pré-definidos em projeto.
Assim, podemos concluir que, quanto maior o número de bits para o expoente, maior será a faixa de números que o computador pode representar (maior alcance); e quanto maior o número de bits para a mantissa, maior a precisão da representação. Porém, reduzindo-se a mantissa, perde-se precisão e há maior a necessidade de truncar o número (truncar um número é cortar algarismos significativos que não podem ser representados).

Considerando-se a representação acima, na base implícita 2:
maior expoente possível E: 2x - 1
maior mantissa possível: 2y - 1
maior número real: +(0.111...1 x 2E) sendo E = 2x - 1
menor número real: -(0.111...1 x 2E) sendo E = 2x - 1
menor real positivo: +(0.100...0 x 2 -E sendo E = 2x - 1
maior real negativo: -(0.100...0 x 2 -E sendo E = 2x - 1

FAIXA DE REPRESENTAÇÃO

Como vimos anteriormente, a representação em ponto flutuante tem limites de alcance e de precisão. O alcance é limitado pelo número de bits do expoente. A precisão é determinada pelo número de bits da mantissa.
Ocorre overflow quando o valor absoluto do dado a ser representado excede a capacidade de representação, porque o número de bits do expoente (neste caso, positivo) é insuficiente para representar o dado.

Um outro problema ocorre na região de números próximos de zero, que tem o maior expoente negativo possível. Ocorre underflow quando o valor absoluto do dado a ser representado é tão pequeno que fica menor que o menor valor absoluto representável. Nesse caso, o expoente é negativo mas não representa os números muito próximos de zero e ocorre uma descontinuidade na representação, com os números próximos a zero não sendo representados.
Underflow não é o mesmo que imprecisão. Dados na faixa de underflow não podem ser representados, ocorrendo estouro no expoente. No caso de imprecisão, a normalização permite que o dado seja representado, porém com perda de precisão.

CARACTERÍSTICA
Característica é o expoente, representado na forma de excesso de n, ou seja,
CARACTERÍSTICA = EXPOENTE + EXCESSO
A representação substituindo expoente por característica acarreta que todas as características serão positivas, de forma que é possível eliminar a representação do sinal do expoente.

Se CARACTERÍSTICA = EXPOENTE + EXCESSO,
sendo M o número de bits para a representação da característica, temos:

0 = - 2M-1 + EXCESSO logo: EXCESSO = + 2M-1

EXEMPLO DE REPRESENTAÇÃO EM PONTO FLUTUANTE
a) Representação no IBM /370
A família IBM /370 representa os dados em ponto flutuante com base implícita = 16, no seguinte formato:

sendo
SN = sinal do dado
CARACTERÍSTICA = o expoente, representado na forma de excesso de n, ou seja,
CARACTERÍSTICA = EXPOENTE + EXCESSO
No caso da IBM, o excesso é de 6410, portanto: CARACTERÍSTICA = EXPOENTE + 6410

Exemplificando: expoente = 810, logo característica = 810 + 6410 = 7210

Assim, uma característica entre 0 e 6310 significa que o expoente é negativo, enquanto uma característica entre 65 e 127 significa que o expoente é positivo (característica igual a 6410 significa expoente igual a 0)..

Exemplo: Representar 25,510
Como a base implícita é 16, vamos converter para hexadecimal: 25 / 16 = 1, resto 9 logo: 2510 = 1916
Parte fracionária: 0.5 x 16 = 8,0
Logo: 25,510 = 19,816 x 160
Normalizando: 19,816 x 160 = 0,19816 x 162. Em binário com 24 bits, a mantissa normalizada será:
0,19816 = 0001.1001.1000.0000.0000.0000

Obs.: Como o número 0,19816 será representado em 24 bits, os bits não representativos (à direita) serão preenchidos com zeros.
Como o expoente é 2, a característica será: 210 + 6410 = 6610. Em binário com 7 bits, será: 100.0010
Portanto, a representação será:

b) Representação no PDP 11
Os microcomputadores PDP 11 representam os dados em ponto flutuante com base implícita = 2, no seguinte formato:

sendo
SN = sinal do dado
CARACTERÍSTICA = o expoente, representado na forma de excesso de n, ou seja,
CARACTERÍSTICA = EXPOENTE + EXCESSO
No caso do PDP 11, o excesso é de 12810, portanto: CARACTERÍSTICA = EXPOENTE + 12810

Exemplificando: expoente = - 28 logo característica = - 2810 + 12810 = 10010

Assim, uma característica entre 0 e 12710 significa que o expoente é negativo, enquanto uma característica entre 129 e 255 significa que o expoente é positivo (característica igual a 1280 significa expoente igual a 0).

Exemplo: Representar 25,510
Como a base implícita é 2, vamos converter para binário: 2510 = 110012
Parte fracionária: 0.5 x 2 = 1,0
Logo: 25,510 = 11001,12 x 20
Normalizando: 11001,12 x 20 = 0,1100112 x 25.
Obs.: Como a base implícita no PDP 11 é 2, o número normalizado começará SEMPRE por 0,1. Assim, como o primeiro dígito da mantissa será sempre 1, o PDP 11 economiza um bit na mantissa não armazenando o primeiro bit da mantissa, já que está implícito que todos os números terão mantissa iniciando com 1. O bit economizado dessa forma permite que, embora a mantissa no PDP seja representada com 23 bits e no IBM /370 com 24 bits, a precisão na representação é a mesma.
Obs.1: Leia-se o SEMPRE da obs. acima como quase sempre. A única exceção corre por conta do zero, que nesse caso tem um tratamento especial.
Em binário com 23 bits, a mantissa normalizada será (lembrando que o primeiro bit 1 não é representado):
0,1100112 = 100.1100.0000.0000.0000.0000

Obs.: Como o número 0,1100112 será representado em 23 bits, os bits não representativos (à direita) serão preenchidos com zeros.
Como o expoente é 5, a característica será: 510 + 12810 = 13310. Em binário com 8 bits, será: 1000.0101
Portanto, a representação será:

Exercício: Qual das representações de ponto flutuante nos dois computadores exemplificados acima tem o maior alcance?
Resp.: O alcance de uma representação depende do valor da base implícita, elevado ao maior valor que a característica pode assumir.
O maior alcance será o que tiver o maior valor de Be ou seja, base elevada ao maior valor possível da característica.
O IBM /370 tem 7 bits para característica (maior característica = 63) e base implícita 16, portanto 1663 = (24) 63 = 2252
O PDP tem 8 bits para característica (maior característica = 127) e base implícita 2, portanto 2127
Conclusão: A representação em ponto flutuante do IBM /370 tem maior alcance que a do PDP 11.