Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Microsoft C++ (MSVC) é consistente com os padrões numéricos IEEE. O padrão IEEE-754 descreve formatos de ponto flutuante, uma maneira de representar números reais no hardware. Existem pelo menos cinco formatos internos para números de vírgula flutuante que são representáveis no hardware visado pelo compilador MSVC. O compilador usa apenas dois deles. Os formatos de precisão única (4 bytes) e precisão dupla (8 bytes) são usados no MSVC. A precisão única é declarada usando a palavra-chave float. A precisão dupla é declarada usando a palavra-chave double. O padrão IEEE também especifica formatos de meia precisão (2 bytes) e precisão quádrupla (16 bytes), e um formato de precisão estendida dupla (10 bytes), que alguns compiladores C e C++ implementam como o tipo de long double dados. No compilador MSVC, o long double tipo de dados é tratado como um tipo distinto, mas o tipo de armazenamento é mapeado para double. Há, no entanto, suporte intrínseco e de linguagem assembly para cálculos usando os outros formatos, incluindo o formato de precisão estendida dupla, quando suportado por hardware.
Os valores são armazenados da seguinte forma:
| Valor | Armazenado como |
|---|---|
| de precisão única | bit de sinal, expoente de 8 bits, mantissa de 23 bits |
| Dupla precisão | bit de sinal, expoente de 11 bits, mantissa de 52 bits |
Nos formatos de precisão simples e dupla, há um 1 implícito na parte fracionária. A parte fracionária é chamada de significand (às vezes conhecida como mantissa). Este 1 principal não é armazenado na memória, então os significados são na verdade 24 ou 53 bits, mesmo que um bit a menos seja armazenado. O formato de precisão dupla estendida efetivamente armazena esse bit.
Os expoentes são enviesados por metade do seu valor possível. Isso significa que você subtrai esse viés do expoente armazenado para obter o expoente real. Se o expoente armazenado for menor que o viés, na verdade é um expoente negativo.
Os expoentes são tendenciosos da seguinte forma:
| Expoente | Influenciado por |
|---|---|
| 8 bits (precisão única) | 127 |
| 11 bits (precisão dupla) | 1023 |
Esses expoentes não são potências de dez; são potências de dois. Ou seja, os expoentes armazenados de 8 bits podem variar de -127 a 127, armazenados como 0 a 254. O valor 2127 é aproximadamente equivalente a 1038, que é o limite real da precisão única.
O significante é armazenado como uma fração binária da forma 1.XXX... . Esta fração tem um valor maior ou igual a 1 e menor que 2. Os números reais são sempre armazenados de forma normalizada. Ou seja, o significante é deslocado para a esquerda de tal forma que o bit de ordem alta do significante é sempre 1. Como esse bit é sempre 1, ele é assumido (não armazenado) nos formatos de precisão única e precisão dupla. Assume-se que o ponto binário (não decimal) está apenas à direita do 1 inicial.
O formato para representação de vírgula flutuante é o seguinte:
| Formato | byte 1 | byte 2 | byte 3 | byte 4 | ... | byte n |
|---|---|---|---|---|---|---|
| de precisão única | SXXXXXXX |
XMMMMMMM |
MMMMMMMM |
MMMMMMMM |
||
| Dupla precisão | SXXXXXXX |
XXXXMMMM |
MMMMMMMM |
MMMMMMMM |
... | MMMMMMMM |
S representa o bit do sinal, o X's são os bits expoentes tendenciosos e os M's são os bits significativos. O bit mais à esquerda é assumido em formatos de precisão única e precisão dupla.
Para deslocar o ponto binário corretamente, você primeiro despolariza o expoente e, em seguida, move o ponto binário para a direita ou esquerda o número apropriado de bits.
Valores especiais
Os formatos de vírgula flutuante incluem alguns valores que são tratados especialmente.
Zero
O zero não pode ser normalizado, o que o torna irrepresentável na forma normalizada de um valor de precisão única ou dupla. Um padrão especial de bits, composto por todos os zeros, representa 0. Também é possível representar -0 como zero com o bit de sinal definido, mas -0 e 0 sempre se comparam como iguais.
Infinidades
Os valores +∞ e −∞ são representados por um expoente de todos e um significante que é todos zeros. Positivo e negativo são representados usando o sinal bit.
Subnormais
É possível representar números de menor magnitude do que o menor número na forma normalizada. Eles são chamados de números subnormais ou denormais . Se o expoente for composto apenas por zeros e o significante for diferente de zero, então o bit líder implícito do significante é considerado como zero e não como um. A precisão dos números subnormais diminui à medida que o número de zeros à esquerda no significante aumenta.
NaN - Não é um número
É possível representar valores que não são números reais, como 0/0, no formato de ponto flutuante IEEE. Um valor desse tipo é chamado de NaN. Um NaN é representado por um expoente de todos e um significante diferente de zero. Existem dois tipos de NaNs, NaNs silenciosos , ou QNaNs, e NaNs de sinalização , ou SNaNs. NaNs silenciosos têm um líder no significante, e são propagados através de uma expressão. Eles representam um valor indeterminado, como o resultado da divisão pelo infinito, ou multiplicando um infinito por zero. NaNs de sinalização têm um zero à frente no significante. Eles são usados para operações que não são válidas, para sinalizar uma exceção de hardware de ponto flutuante.
Exemplos
Seguem-se alguns exemplos em formato de precisão única:
Para o valor 2, o bit de sinal é zero. O expoente armazenado é 128, ou 1000 0000 em binário, que é 127 mais 1. O significante binário armazenado é (1.) 000 0000 0000 0000 0000 0000, que tem um 1 e um ponto binário implícitos, portanto, o significante real é um.
Valor Fórmula Representação binária Hexadecimal 2 1 * 21 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000 O valor -2. O mesmo que +2, exceto que o bit de sinal está definido. A mesma coisa é verdade para o negativo de todos os números de vírgula flutuante do formato IEEE.
Valor Fórmula Representação binária Hexadecimal -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000 O valor 4. O mesmo significante, expoente aumenta em um (valor enviesado é 129, ou 100 0000 1 em binário.
Valor Fórmula Representação binária Hexadecimal 4 1 * 22 0100 0000 1000 0000 0000 0000 0000 0000 0x40800000 O valor 6. Mesmo expoente, o significado é maior pela metade. É (1.) 100 0000 ... 0000 0000, que, por ser uma fração binária, é 1 1/2 porque os valores dos dígitos fracionários são 1/2, 1/4, 1/8 e assim por diante.
Valor Fórmula Representação binária Hexadecimal 6 1,5 * 22 0100 0000 1100 0000 0000 0000 0000 0000 0x40C00000 O valor 1. Igualmente significativo que outros poderes de dois, o expoente tendencioso é um a menos de dois em 127, ou 011 1111 em binário.
Valor Fórmula Representação binária Hexadecimal 1 1 * 20 0011 1111 1000 0000 0000 0000 0000 0000 0x3F800000 O valor 0,75. O expoente tendencioso é 126, 011 1111 0 em binário, e o significante é (1.) 100 0000 ... 0000 0000, que é 1 1/2.
Valor Fórmula Representação binária Hexadecimal 0,75 1,5 * 2-1 0011 1111 0100 0000 0000 0000 0000 0000 0x3F400000 O valor 2,5. Exatamente o mesmo que dois, exceto que o bit que representa 1/4 é definido no significante.
Valor Fórmula Representação binária Hexadecimal 2,5 1,25 * 21 0100 0000 0010 0000 0000 0000 0000 0000 0x40200000 1/10 é uma fração repetitiva em binário. O significado é um pouco menor que 1,6, e o expoente tendencioso diz que 1,6 deve ser dividido por 16. (É 011 1101 1 em binário, que é 123 em decimal.) O expoente verdadeiro é 123 - 127 = -4, o que significa que o fator pelo qual multiplicar é 2-4 = 1/16. O significante armazenado é arredondado para cima no último bit na tentativa de representar o número não representável com a maior precisão possível. (A razão pela qual 1/10 e 1/100 não são exatamente representáveis em binário é semelhante à razão pela qual 1/3 não é exatamente representável em decimal.)
Valor Fórmula Representação binária Hexadecimal 0.1 1,6 * 2-4 0011 1101 1100 1100 1100 1100 1100 1101 0x3DCCCCCD O zero é um caso especial. Ele usa a fórmula para o valor positivo mínimo possível representável, que são todos zeros.
Valor Fórmula Representação binária Hexadecimal 0 1 * 2-128 0000 0000 0000 0000 0000 0000 0000 0000 0x00000000