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 * 101 = 0,0125 * 102 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 * 101 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 Devese 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, considerandose 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, podese 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 * 21 ● 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 * 21) + (m2 * 22) + (m3 * 23) +… (my * 2y)) * 2(expoentePESO) ou, de forma genérica (na precisão simples, com PESO = 127): (1)S * (1 + mantissa) * 2(expoente127) 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: ± 2126 to (2223)×2127 b) limite máximo e mínimo para o expoente em precisão dupla.: ± 21022 to (2252)×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 * 21 Como a representação genérica de um número em ponto flutuante (em precisão simples) é; (1)S * (1 + mantissa) * 2(expoente127) ● ● ● Como o valor com que a base deve ser elevada deve ser 1, o expoente em questão é 126, para que (126127) 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(10221023) ● 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 * 22, portanto ¼, ou seja, 0,25. Utilizando a equação básica: (1)S * (1 + mantissa) * 2(expoente127) ● Temos que: (1)1 * (1 + 0,25) * 2(129127) ● Portanto o valor armazenado é 1*1,25*22 = 1*1,25 * 4 = 5,0