Apoio 2 - Gerson Geraldo H. Cavalheiro

Transcrição

Apoio 2 - Gerson Geraldo H. Cavalheiro
Universidade Federal de Pelotas
Bacharelado em Ciência da Computação
Introdução à Ciência da Computação
Prof. Gerson Cavalheiro
1/4
Apoio 2
Representação de Números em Ponto Flutuante
A representação de números inteiros (como 0, 1, 35, ­617, 313, 25.987, ­13.500) pode ser feita facilmente utilizando um conjunto de bits, organizados em bytes. Números ditos reais, ou seja, números que possuem uma parte inteira e uma parte fracionária, ambas separadas por vírgulas (como ­1,25 e 38,313) requerem uma forma alternativa de representação. Esta forma alternativa de representação considera diferentes componentes do número. Embora seja comum expressar os números reais apenas com apoio da vírgula para separar a parte inteira da parte real, outras visões podem ser consideradas.
Exemplos de representação de números reais
­1,25 = ­1,25 * 100 = ­0,125 * 10­1 = ­0,0125 * 10­2
38,313 = 38,313 * 100 = 0,38313 * 102 = 0,038313 * 103
3,1416 = 3,1416 * 100 = 0,31416 * 101 = 0,031416 * 102
82,0 = 82,0 * 100 = 0,82 * 102 = 0,082 * 103
Atenção à notação. Na notação brasileira a vírgula é utilizada para separar a parte inteira da parte fracionária de um número real. O uso do ponto é um facilitador introduzido para auxiliar na visualização do valor apresentado. A notação americana também utiliza ponto e vírgula. No entanto, a notação americana faz uso inverso: o ponto separa a parte inteira da fracionária e a vírgula é utilizada para auxiliar na visualização do número.
Observe nos exemplos acima que mesmo valores numéricos inteiros podem ser representados como números reais. Observe também que é possível criar uma representação genérica para tais números na forma:
+/­ número * base +/­ expoente
A questão que se coloca é como criar uma representação deste valor numérico interna ao computador (utilizando, portanto, uma seqüência de bits/bytes) que seja ao mesmo tempo eficiente em termos de consumo de recursos e portável. Uma forma comum é utilizar um conjunto de N bits (tipicamente N = 32 ou 64, para representar números em ponto flutuante com precisão simples ou dupla) para armazenar valores em ponto flutuante em uma forma normalizada.
Normalizar. Normalizar neste caso significa apresentar o valor assumindo um conjunto de regras padrão, de forma que todos os valores tenham a mesma estrutura.
Esta forma normalizada é a seguinte:
+/­ 0,mantissa * base +/­ expoente
onde o número é sempre representado com “0,”, ou seja, a mantissa representa os dígitos significantes do número e o expoente regula a precisão da representação.
Exemplos de representação normalizada de números reais
­1,25 = ­0,125 * 10­1
38,313 = 0,38313 * 102
3,1416 = 0,31416 * 101
82,0 = 0,82 * 102 Como os valores devem ser representados em uma seqüência de N bits, a configuração se dá da seguinte forma:
SN SE
Expoente
Mantissa
N bits: x bits para o Expoente, y bits para a Mantissa
onde:
Universidade Federal de Pelotas
Bacharelado em Ciência da Computação
Introdução à Ciência da Computação
Prof. Gerson Cavalheiro
2/4
•
•
•
•
•
SN é o sinal do número (+/­): 1 bit
SE é o sinal do expoente (+/­): 1 bit
Expoente é o valor numérico do expoente do número normalizado: x bits
Mantissa é o valor numérico dos dígitos significativos do número normalizado: y bits
N = 1 + 1 + x + y
Deve­se observar que nesta representação a base não é apresentada. Isto é evidente uma vez que toda a representação interna se dá utilizando a base numérica binária. Portanto, a base é 2. Desta forma, pode se afirmar que, considerando­se a representação acima, existem os seguintes limites de valores:
• O maior expoente possível é: 2x ­ 1
• A maior mantissa possível é 2y ­ 1
• O maior número real representável é +(0.111...1 x 2E), sendo E = 2x ­ 1
• O menor número real é ­(0.111...1 x 2E), sendo E = 2x ­ 1
• O menor real positivo é +(0.100...0 x 2 ­E), sendo E = 2x ­ 1
• O maior real negativo é ­(0.100...0 x 2 –E), sendo E = 2x ­ 1
Esta faixa de valores representa também o alcance e a precisão da representação. O alcance diz respeito ao número de bits ocupados para armazenar o expoente: quanto maior for o número de bits para o expoente, maior espectro de alcance do número. A precisão está relacionada ao número de bits alocados para representar a mantissa: quanto maior o número de bits utilizado, maior o número de dígitos significativos que podem ser armazenados. Dependendo do número de bits nos dois casos, podem ocorrer situações de overflow e underflow.
Overflow. Termo corrente na computação para designar que um valor não pode ser representado pois seu valor excede a capacidade de armazenamento disponível.
Underflow. Termo corrente na computação para designar que um valor não pode ser representado pois está contido entre 0 e o menor valor real normalizado representável.
Overflow ocorre quando o valor do expoente não pode ser armazenado no número de bits reservados ao expoente. Não importa se este valor for positivo ou negativo. Já a situação de underflow é mais pitoresca: ela ocorre quando o número a ser representado é maior que 0 (zero) mas é menor que o menor número representável. Assim, por maior que seja o expoente, ocorre uma descontinuidade na representação dos números na faixa de números próximas a 0 (zero).
Note que imprecisão é diferente de underflow. Enquanto valores numéricos muito próximos a 0 (zero) não podem ser representados, a limitação do número de bits para mantissa incorre em perda de precisão do valor efetivo, sendo armazenado um valor aproximado (portanto impreciso) do valor correto.
Assim, pode­se considerar que a retirada de um bit da representação do expoente para representação da mantissa aumenta a precisão de representação, pois diminui o “passo” de representação do número. No entanto, a perda de um bit no expoente implica na diminuição da faixa de valores representável.
Representação IEEE 754
O padrão de número 754 definido pelo Institute of Electrical and Electronics Engineers, também conhecido como norma IEEE 754, é empregado para representação de números em ponto flutuante em computadores. Este padrão foi definido em 1985 e é atualmente empregado na maioria dos processadores. A norma define como devem ser representados números em ponto flutuante com precisão simples (utilizando 32 bits) e com precisão dupla (64 bits). Em ambos os casos, a representação requer uma normalização do número com parte Universidade Federal de Pelotas
Bacharelado em Ciência da Computação
Introdução à Ciência da Computação
Prof. Gerson Cavalheiro
3/4
fracionária. A padronização é um importante recurso para unificar a representação de dados em diferentes máquinas, permitindo a comunicação de dados entre elas.
O formato de representação no padrão IEEE 754 é dado por:
S
exp
frac
1 bit de sinal
x bits para o expoente
y bits para os dígitos de valor
onde:
•
•
para precisão simples: x = 8 e y = 23 para precisão dupla: x = 11 e y = 52
A representação neste padrão apresenta algumas diferenças em relação à forma apresentada anteriormente.
●
O expoente. Observe que não é armazenado o sinal do expoente. O valor do expoente, pelo padrão IEEE 754 é armazenado pela notação com peso, também chamada de notação por excesso de valor. Nesta notação, o valor mais negativo que o expoente pode assumir é representado por 0 (zero). Assim temos que, com precisão simples, os limites dos valores são dados por excesso de 127 e em precisão dupla por excesso de 1023.
Exemplo de expoente para precisão simples:
● Expoente ­1: ­1 + 12710 = 12610 = 0111 11102
● Expoente +1: +1 + 12710 = 12810 = 1000 00002
●
A mantissa. A mantissa é armazenada no sentido “da esquerda para a direita”, ou seja: . Esta mantissa é armazenada na forma normalizada, de forma que o primeiro bit em 1 (um) ocorra à esquerda da vírgula. Este bit em 1 (um) não é armazenado, ficando subentendido.
Exemplo de normalização da mantissa para precisão simples:
● Mantissa 0,1310: 0,11012 = 1,1012 * 2­1
● Mantissa 5,1010: 101,1012 = 1,011012 * 22
Os dígitos na mantissa são representados por m1, m2, m3, ... my (lembrando, da esquerda para a direita), assim, o valor do número é então dado por:
(­1)S * (1 + (m1 * 2­1) + (m2 * 2­2) + (m3 * 2­3) +… (my * 2­y)) * 2(expoente­PESO)
ou, de forma genérica (na precisão simples, com PESO = 127):
(­1)S * (1 + mantissa) * 2(expoente­127)
Exercícios:
1. Pesquise:
a) limite máximo e mínimo para o expoente em precisão simples.
b) limite máximo e mínimo para o expoente em precisão dupla.
2. Mostre a representação binária do número ­0,7510 nas precisões simples e dupla no padrão IEEE 754.
3. Qual número decimal real é expresso pela seguinte palavra?
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
0
8
7
6
5
4
3
2
1
0
1
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Universidade Federal de Pelotas
Bacharelado em Ciência da Computação
Introdução à Ciência da Computação
Prof. Gerson Cavalheiro
4/4
Respostas:
1. Pesquise:
a) limite máximo e mínimo para o expoente em precisão simples: ± 2­126 to (2­2­23)×2127
b) limite máximo e mínimo para o expoente em precisão dupla.: ± 2­1022 to (2­2­52)×21023
2. Mostre a representação binária do número ­0,7510 nas precisões simples e dupla no padrão IEEE 754.
● ­0,75 pode ser representado como ­3/4 ou ­3/22
●
●
●
Em binário corresponde à: ­112/102 ou ­0,112 Em notação científica na base 2: ­0,112 Em notação científica normalizada na base 2: ­1,12 * 2­1
Como a representação genérica de um número em ponto flutuante (em precisão simples) é;
(­1)S * (1 + mantissa) * 2(expoente­127)
●
●
●
Como o valor com que a base deve ser elevada deve ser ­1, o expoente em questão é 126, para que (126­127) resulte em ­1.
Como a mantissa normalizada é ­1,12, o valor binário é 12 + 0,100000000000000000000002 Portanto, em precisão simples:
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
0
8
7
6
5
4
3
2
1
0
1
0
1
1
1
1
1
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
2
1
0
0
0
0
0
0
0
0
0
●
E em precisão dupla (com 52 zeros!):
(­1)S * (1 + 0,100...00) * 2(1022­1023)
●
Ou seja:
63
61
62
61
60
59
58
57
56
55
54
53
52
51
50
1
0
1
1
1
1
1
1
1
1
1
0
1
0
0
... ...
0
0
0
...
...
...
...
3.Qual número decimal real é expresso pela seguinte palavra?
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
0
8
7
6
5
4
3
2
1
0
1
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
●
●
●
●
O sinal 1, portanto o número é negativo.
O campo de expoente possui 100000012, que corresponde a 129.
A mantissa é dado por 1 * 2­2, portanto ¼, ou seja, 0,25.
Utilizando a equação básica:
(­1)S * (1 + mantissa) * 2(expoente­127)
●
Temos que:
(­1)1 * (1 + 0,25) * 2(129­127)
●
Portanto o valor armazenado é ­1*1,25*22 = ­1*1,25 * 4 = 5,0

Documentos relacionados