Introdução à programação e aos algoritmos

João Araujo Ribeiro · Capítulo 12 de 103

Páginas do PDF

Introdução à programação e aos algoritmos

1.6 Números Reais

Saber representar inteiros em um computador é algo bastante útil, mas não suficiente. Muitas operações são realizadas com números reais. No Brasil usamos a vírgula para separar a parte inteira da decimal, porém em muitos países usa-se o ponto como separador. Assim, o que chamamos no Brasil de vírgula decimal, nesses países é o ponto decimal.

Então, como podemos representar esses números com vírgula (ponto) dentro de um computador para fazer cálculos mais complexos? Expandindo a equação 1.1 para incluir as potências à direita da vírgula, temos:

 

ou seja, usamos as potências negativas da base para criar números com dígitos à direita da vírgula. Um número binário usa potências negativas de 2, desta forma:

 

Nas potências positivas, como visto anteriormente, somamos 1, 2, 4, 8 e assim por diante. No caso de dígitos à direita da vírgula, somamos 1/2, 1/4, 1/8, e assim por diante. Uma maneira prática de descobrir quais dígitos serão 1 e quais serão 0 é usar sucessivas multiplicações. Desse modo, se quisermos transformar 12,375 em 10 binário, primeiro pegamos a parte inteira e convertemos em binário. Como já visto, ficaria 1100 2. Agora vamos para a parte à direita da vírgula, 375. Temos que somar potências negativas de 2 para obter este número. Vamos multiplicar por 2 sucessivas vezes. Sempre que o resultado der maior ou igual a 1 damos continuidade às multiplicações com apenas a parte não inteira no passo seguinte:

Usando o resultado da parte à esquerda da vírgula, de cima para

 

baixo, obtemos a sequência de bit 011, que na base 2, em potências negativas, significa:

 

Deste modo, o número 12,375 seria representado em binário 10

por 1100,011 2.

A representação de números reais tem suas limitações.

Enquanto qualquer número inteiro decimal pode ser representado com dígitos binários, muitas vezes não conseguimos representar precisamente um número real com casas decimais. Um exemplo significativo é simplesmente o número 0,1 . Vamos convertê-lo em 10 binário, usando o método das multiplicações.

 

Chegamos ao resultado 0,00011 que representa o número 2

0 × 2–1 + 0 × 2–2 + 0 × 2–3 + 1 × 2–4 + 1 × 2–5 = 0 + 0 + 0 + 0,062510

+ 0,03125 = 0,09375 . Um resultado bem próximo, mas de 10 10

qualquer modo diferente de 0,110. Com mais bits binários podemos aproximar o resultado de 0,1 . Por exemplo, com o número binário 10

0,000110011 2, o resultado seria 0,09960937510, chegando mais próximo, porém por mais dígitos que usemos, nunca será igual a 0,1 . 10

A maneira de armazenar este número de forma binária é definir quantos bits vamos usar para a parte inteira e quantos serão usados para a parte à direita da vírgula. Nesse caso estamos falando de representação em vírgula fixa (ou ponto fixo). Este método tem suas desvantagens, pois a computação científica trabalha com números muito grandes, e essa representação em vírgula fixa não seria suficiente para todas as aplicações. É aí que entra a representação em vírgula flutuante.

Nos primórdios da Computação, cada fabricante escolhia seu método de representação de números em vírgula flutuante, o que causava certa confusão e consequente incompatibilidade entre os equipamentos. Atualmente existe um padrão que regula a representação desses números binários no computador: o padrão IEEE 754. IEEE é uma organização profissional criada em 1963 e dedicada ao avanço tecnológico. Nesse padrão, adotado em 1985, a IEEE regula os detalhes da representação de números binários em vírgula flutuante. Ninguém é obrigado a segui-lo, mas seu equipamento ficaria incompatível com o restante do mundo.

No padrão IEEE 754, os números binários em vírgula flutuante seguem a chamada representação científica de números reais. Nos números com vírgula decimal, essa representação consiste em escrever o número como o produto entre um número e uma potência de 10.

 

em que a mantissa é um número real cujo valor absoluto é maior ou igual a 1 e menor que 10, e o expoente é um número inteiro qualquer. Isto quer dizer que a mantissa deve possuir apenas um dígito à esquerda da vírgula. Na base dez, este número está entre 1, incluso, e 10, excluso. Por exemplo, se usamos 5 dígitos, esse número absoluto poderia estar entre 1,0000 e 9,9999, sem jamais chegar a dez. Seguem alguns exemplos de números escritos segundo esta regra:

 

Na base binária, o dígito à esquerda da vírgula na mantissa será

sempre 1, diferente da base 10, na qual esse número pode estar entre 1 e 9, inclusive. Isto facilita a representação no computador, pois esse dígito não precisa ser armazenado, uma vez que seu valor já é conhecido. Assim, para armazenar este tipo de número precisamos de:

• um bit de sinal para a mantissa;

• um campo para o expoente; e

• um campo para a mantissa.

A Figura 1.10 representa a organização desses campos em um

número real, segundo a especificação IEEE 754.

 

Figura 1.10 Campos de um número real no padrão IEEE 754.

 

O expoente pode ser positivo ou negativo. No padrão IEEE 754,

este número é armazenado na representação por excesso, com um valor polarizador de nn–1–1. O padrão preconiza a organização

mostrada na Tabela 1.4 para as classes de números em precisão simples e precisão dupla.

Tabela 1.4 Classes de números em ponto flutuante no padrão IEEE 754

 

Classe Tamanho Expoente Mantissa Polarizador

 

Precisão 32 bits 8 bits 23 bits 127

simples

 

Precisão dupla 64 bits 11 bits 52 bits 1023

 

Vamos analisar a representação do número 12,375 10, que em binário é 1100,011 . Começamos deslocando a vírgula até que reste 2

apenas um dígito à esquerda da vírgula. Cada deslocamento unitário representa uma multiplicação por 2, assim:

1100,0112 = 1,1000112 × 23.

Para representarmos este número de acordo com o padrão IEEE 754, prosseguimos:

• o bit de sinal é igual a zero, pois a mantissa é positiva,

• o expoente é 3, no caso da classe de precisão simples; o

número polarizador é 127. Dessa maneira, somamos 127 + 3 = 130, e convertendo para binário com 8 bits obtemos 1000 0010 , 2

• a mantissa é 100011, pois subentendemos que o primeiro

dígito é um. Inserimos bits zero até completar os 23 bits do padrão.

Finalmente, juntando tudo, a Figura 1.11 representa o número em precisão simples.

Figura 1.11 Número 12,375 em precisão simples segundo o padrão

IEEE 754.

 

O padrão também oferece uma representação para os números

especiais zero, –infinito, +infinito e NaN (sigla em inglês para Not a

Number, que significa Não é um número). Veja a Tabela 1.5.

 

Tabela 1.5 Valores especiais no padrão IEEE 754

 

Valor Sinal Expoente Mantissa

 

zero 0 0 0

 

+in nito 0 Todos 1 0

 

–in nito 1 Todos 1 0

 

NaN 0 Todos 1 Diferente de zero

 

EXERCÍCIO 1.16

 

Escreva os binários equivalentes a –215,5 na notação com vírgula xa. Qual o

número mínimo de bits necessários?