Representação de ponto flutuante do IEEE
Microsoft Visual C++ é consistente com os padrões numéricos do IEEE. Há três variedades internas de números reais. Real * 4 e real * 8 são usados no Visual C++. Real * 4 é declarado usando a palavra float. Real * 8 é declarado usando a palavra double. Na programação do Windows de 32 bits, o long double mapas de tipo de dados para double. No entanto, há suporte de linguagem assembly para cálculos usando o real * tipo de dados de 10.
Os valores são armazenados como segue:
Valor |
Armazenado como |
---|---|
real * 4 |
assinar o bit, expoente de 8 bits, 23 bits de mantissa |
real * 8 |
assinar o bit, expoente de 11 bits, 52 bits de mantissa |
real * 10 |
assinar o bit, expoente de 15 bits, mantissa de 64 bits |
Em real * 4 e real * 8 formatos, há uma suposta 1 de líderes de mantissa que não esteja armazenado na memória, portanto, os mantissas são realmente 24 ou 53 bits, embora apenas 23 ou 52 bits são armazenados. O real * 10 formato realmente armazena esse bit.
Os expoentes tendem pela metade de seus valores possíveis. Isso significa que você subtrair esta polarização de expoente armazenado para obter o expoente real. Se o expoente armazenado é menor do que a diferença, é realmente um expoente negativo.
Os expoentes tendem da seguinte maneira:
Expoente |
Polarizado por |
---|---|
8 bits (real * 4) |
127 |
bit 11 (real * 8) |
1023 |
15 bits (real * 10) |
16383 |
Esses expoentes não são potências de dez; eles são potências de dois. Ou seja, expoentes armazenados de 8 bits podem ser de até 127. O valor 2 ** 127 é basicamente equivalente ao 10 ** 38, que é o limite real de real * 4.
A mantissa é armazenado como uma fração do binária do formulário 1.XXX... . Essa fração tem um valor maior ou igual a 1 e menor que 2. Observe que os números reais são sempre armazenados no formulário normalizado; ou seja, a mantissa é esquerda deslocada de modo que o bit de ordem superior de mantissa é sempre 1. Porque este bit é sempre 1, será considerado (não guardados) em que o real * 4 e real * 8 formatos. O ponto de binário (não decimal) é considerado à direita do líder 1.
O formato, em seguida, para vários tamanhos é da seguinte maneira:
Formato |
BYTE 1 |
BYTE 2 |
BYTE 3 |
BYTE 4 |
... |
BYTE n |
---|---|---|---|---|---|---|
real * 4 |
SXXX XXXX |
XMMM MMMM |
MMMM MMMM |
MMMM MMMM |
|
|
real * 8 |
SXXX XXXX |
XXXX MMMM |
MMMM MMMM |
MMMM MMMM |
... |
MMMM MMMM |
real * 10 |
SXXX XXXX |
XXXX XXXX |
1MMM MMMM |
MMMM MMMM |
... |
MMMM MMMM |
Srepresenta o bit de sinal, o Xdo são bits de expoente e o Mdo são bits de mantissa. Observe que o bit mais à esquerda é assumido real * 4 e real * 8 formatos, mas está presente, como "1" em 3 de BYTE do real * formato 10.
Para deslocar para o ponto de binário corretamente, você primeiro unbias o expoente e move o ponto de binário para a direita ou esquerda o número apropriado de bits.
Exemplos
A seguir estão alguns exemplos em real * 4 de formato:
No exemplo a seguir, o bit de sinal é zero e o expoente armazenado é 0000 0, 128 ou 100 em binário, que é de 127 mais 1. A mantissa armazenado é 000 (1). 0000... 0000-0000, que tem um implícito líder binário e de 1 ponto, para que a mantissa real é um.
SXXX XXXX XMMM MMMM ... MMMM MMMM 2 = 1 * 2**1 = 0100 0000 0000 0000 ... 0000 0000 = 4000 0000
Mesmo que + 2, exceto que o bit de sinal está definido. Isso é verdadeiro para todos os números de ponto flutuante do formato IEEE.
-2 = -1 * 2**1 = 1100 0000 0000 0000 ... 0000 0000 = C000 0000
Aumenta o expoente mantissa mesmo, por um (o valor tendenciosa é 1 de 0000 129 ou 100 em binário.
4 = 1 * 2**2 = 0100 0000 1000 0000 ... 0000 0000 = 4080 0000
Mesmo expoente, mantissa é ampliada pela metade — é 100 (1). 0000...0000 a 0000, que, como esta é uma fração binária, é 1 1/2 (os valores de dígitos fracionários são a 1/2, 1/4, 1/8 e assim por diante).
6 = 1.5 * 2**2 = 0100 0000 1100 0000 ... 0000 0000 = 40C0 0000
Expoente mesmo como outras potências de mantissa dois, é um menos de dois a 127 ou 011 1111 1 em binário.
1 = 1 * 2**0 = 0011 1111 1000 0000 ... 0000 0000 = 3F80 0000
O expoente tendenciosa é 126, 011 1111 binário de em 0 e a mantissa é 100 (1). 0000... 0000 a 0000, que é 1 1/2.
.75 = 1.5 * 2**-1 = 0011 1111 0100 0000 ... 0000 0000 = 3F40 0000
Exatamente da mesma maneira que dois exceto que o bit que representa a 1/4 é definido de mantissa.
2.5 = 1.25 * 2**1 = 0100 0000 0010 0000 ... 0000 0000 = 4020 0000
1/10 é uma fração de repetição em binário. A mantissa é apenas tímido de 1.6 e expoente tendenciosa diz que o 1.6 deve ser dividido por 16 (é 011 1101 1 em binário, o que é 123 em decimal). O expoente true é 123 – 127 = – 4, o que significa que o fator pelo qual multiplicar é 2 ** – 4 = 1/16. Observe que a mantissa armazenado é arredondado o último bit — uma tentativa para representar o número de unrepresentable de precisão possível. (O motivo que 1/10 e 1/100 são não exatamente representável no binário é semelhante ao motivo que 1/3 é representável não exatamente no formato decimal.)
0.1 = 1.6 * 2**-4 = 0011 1101 1100 1100 ... 1100 1101 = 3DCC CCCD
0 = 1.0 * 2**-128 = all zeros--a special case.