Um pouco sobre números de ponto flutuante (floats e doubles)
Representação de números reais
Nos computadores atuais:
- É impossível a representação de números reais em computadores binários digitais porque a representação binária é discreta.
- Em qualquer linguagem de programação utilizamos representações que prevêem algum grau de arredondamento.
Antes de começar a falar de ponto flutuante vamos ver um pouco de ponto fixo.
Ponto fixo
Denotamos um número de ponto fixo quando especificamos o número de casas para a parte inteira e fracionária (matisse).
Exemplo: Ponto fixo 1.15 (Um bit para a parte inteira e quinze para a parte fracionária).
Na figura acima, podemos ver que reservei um bit para a parte inteira do número e 15 para a fracionária.
Dessa forma sempre teremos números menores que dois, pois como está reservado somente um bit para a parte inteira, o maior valor que esse bit pode valer é 1. A parte fracionária começa do 2^-1 e vai até o 2^-15. Esses valores são interpretados literalmente.
Por exemplo, o valor binário 1010 0000 0000 0000 corresponde a 2^0 + 2^-2 = 1.25.
Dessa forma, o menor número seria 0000 0000 0000 0000
E o maior: 1111 1111 1111 1111.
Ponto flutuante (IEEE 754)
Precisão simples
- Possui 32 bits
Uso dos bits:
- Sinal – Um bit que indica se o número é positivo (0) ou se é negativo (1).
- Expoente – Um byte que contem o expoente. O expoente corresponde a soma do expoente com 127 (ou seja, para encontrar o verdadeiro valor do expoente, deve-se subtrair esse byte de 127. Atenção: o expoente com valor zerado (00h) ou todo ativado (FFh) tem significado especial
- Parte fracionária (matissa) – Representa a parte fracionária do número.
Que estranho? Cadê a parte inteira do número? Aonde ela está sendo representada?
Resposta: O ponto flutuante proposto pela IEEE 754 sugere que usemos números em notação científica de modo que (em binário):
101.11 x 2 ^ 15 = 1.0111 x 2 ^ 17
Ou seja: quando trabalhamos com notação científica, se temos um número que tenha mais de uma casa inteira, mechemos no expoente de modo que fique com uma. O mesmo ocorre aqui, e se esse valor vai ser sempre 1 nesse caso, não precisamos colocar ele lá. Assim ganhamos uma casa pro expoente.
Mas, como assim sempre 1? E se eu quiser representar o zero?
Aí caímos naqueles significados especiais, lembra?
Vamos ver:
Onde s = sinal, e = expoente, m = matisse.
Observações: e = 0 e m ≠ 0 indica que o número está em uma representação não-normalizada.
Fonte da tabela: Wikipedia.
Talvez no próximo post eu termine de falar sobre pontos flutuantes.
Leave a Reply