Partilhar via


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.

Consulte também

Referência

Por que os números de ponto flutuante podem perder precisão