formato de ponto flutuante decimal64 - decimal64 floating-point format
Formatos de vírgula flutuante |
---|
IEEE 754 |
Outro |
Na computação , decimal64 é um formato de numeração de computador de ponto flutuante decimal que ocupa 8 bytes (64 bits) na memória do computador. Destina-se a aplicações em que é necessário emular exatamente o arredondamento decimal, como cálculos financeiros e fiscais.
Decimal64 suporta 16 dígitos decimais de significando e um intervalo de expoentes de −383 a +384, ou seja, ± 0,000 000 000 000 000 × 10 −383 a ± 9,999 999 999 999 999 × 10 384 . (Equivalentemente, ± 0 000 000 000 000 000 × 10 −398 a ± 9 999 999 999 999 999 × 10 369. ) Em contraste, o formato binário correspondente, que é o tipo mais comumente usado, tem um intervalo aproximado de ± 0,000 000 000 000 001 × 10 −308 a ± 1,797 693 134 862 315 × 10 308 . Como o significando não é normalizado, a maioria dos valores com menos de 16 dígitos significativos tem várias representações possíveis; 1 × 10 2 = 0,1 × 10 3 = 0,01 × 10 4 , etc. Zero tem 768 representações possíveis (1536 se ambos os zeros com sinal forem incluídos).
O ponto flutuante decimal é um formato de ponto flutuante decimal relativamente novo, formalmente introduzido na versão 2008 do IEEE 754 , bem como no ISO / IEC / IEEE 60559: 2011 .
Representação de valores decimais 64
Assinar | Combinação | Continuação do expoente | Significado e continuação |
---|---|---|---|
1 bit | 5 bits | 8 bits | 50 bits |
s | mmmmm | xxxxxxxx | cccccccccccccccccccccccccccccccccccccccccccccccccccccc |
O IEEE 754 permite dois métodos alternativos de representação para valores decimais 64. A norma não especifica como significar qual representação é usada, por exemplo, em uma situação onde valores decimais 64 são comunicados entre sistemas:
- No método de representação binária , o significando de 16 dígitos é representado como um inteiro positivo codificado binário, com base em decimal inteiro binário (BID).
- No método de representação decimal , o significando de 16 dígitos é representado como um inteiro positivo codificado decimal, com base em decimal densamente compactado (DPD) com 5 grupos de 3 dígitos (exceto o dígito mais significativo codificado especialmente) são cada um representado em decletos (10 sequências de bits). Isso é bastante eficiente, porque 2 10 = 1024 é apenas um pouco mais do que o necessário para conter todos os números de 0 a 999.
Ambas as alternativas fornecem exatamente o mesmo intervalo de números representáveis: 16 dígitos de significando e 3 × 2 8 = 768 valores expoentes decimais possíveis. (Todos os valores expoentes decimais possíveis armazenáveis em um número binário64 são representáveis em decimal64, e a maioria dos bits do significando de um binário64 são armazenados mantendo aproximadamente o mesmo número de dígitos decimais no significando.)
Em ambos os casos, os 4 bits mais significativos do significando (que na verdade têm apenas 10 valores possíveis) são combinados com os 2 bits mais significativos do expoente (3 valores possíveis) para usar 30 dos 32 valores possíveis de um 5 bits campo. As combinações restantes codificam infinitos e NaNs .
Campo de combinação | Expoente Msbits | Significand Msbits | Outro |
---|---|---|---|
00mmm | 00 | 0xxx | - |
01mmm | 01 | 0xxx | - |
10mmm | 10 | 0xxx | - |
1100m | 00 | 100x | - |
1101m | 01 | 100x | - |
1110m | 10 | 100x | - |
11110 | - | - | ± infinito |
11111 | - | - | NaN. Bit de sinal ignorado. O primeiro bit do campo de continuação do expoente determina se NaN está sinalizando. |
Nos casos de Infinity e NaN, todos os outros bits da codificação são ignorados. Assim, é possível inicializar um array para Infinities ou NaNs preenchendo-o com um único valor de byte.
Campo significativo binário inteiro
Este formato usa um significando binário de 0 a 10 16 - 1 = 9 999 999 999 999 999 = 2386F26FC0FFFF 16 = 1000 1110000110 1111001001 1011111100 0000111111 1111111111 2 .
A codificação, completamente armazenada em 64 bits, pode representar significandos binários até 10 × 2 50 - 1 = 11 258 999 068 426 239 = 27FFFFFFFFFFFF 16 , mas valores maiores que 10 16 - 1 são ilegais (e o padrão requer implementações para tratar como 0, se encontrado na entrada).
Conforme descrito acima, a codificação varia dependendo se os 4 bits mais significativos do significando estão no intervalo de 0 a 7 (0000 2 a 0111 2 ) ou superior (1000 2 ou 1001 2 ).
Se os 2 bits após o bit de sinal forem "00", "01" ou "10", o campo expoente consiste nos 10 bits seguintes ao bit de sinal e o significando são os 53 bits restantes, com um 0 inicial implícito pedaço:
s 00eeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 01eeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 10eeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt
Isso inclui números subnormais em que o dígito de significando inicial é 0.
Se os 2 bits após o bit de sinal forem "11", então o campo expoente de 10 bits é deslocado 2 bits para a direita (após o bit de sinal e os bits "11" posteriores), e o significando representado está no restante 51 bits. Neste caso, há uma sequência implícita (ou seja, não armazenada) de 3 bits inicial "100" para a maioria dos bits do significando verdadeiro (nos bits inferiores restantes ttt ... ttt do significando, nem todos os valores possíveis são usava).
s 1100eeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1101eeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1110eeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt
A sequência de 2 bits "11" após o bit de sinal indica que há um prefixo de 3 bits implícito "100" para o significando. Compare ter um prefixo "1" implícito de 1 bit no significando dos valores normais para os formatos binários. As sequências de 2 bits "00", "01" ou "10" após o bit de sinal fazem parte do campo expoente.
Os bits iniciais do campo de significando não codificam o dígito decimal mais significativo; eles são simplesmente parte de um número binário puro maior. Por exemplo, um significand de 8 000 000 000 000 000 é codificada como binário 0111 0001101011 1111010100 1001100011 0100000000 0000000000 2 , com as principais 4 bits que codifica 7; o primeiro significando que requer um 54º bit é 2 53 = 9 007 199 254 740 992 . O mais significativo válido é 9 999 999 999 999 999, cuja codificação binária é (100) 0 1110000110 1111001001 1011111100 0000111111 1111111111 2 (com os 3 bits mais significativos (100) não armazenados, mas implícitos, conforme mostrado acima; e o próximo bit é sempre zero em codificações válidas).
Nos casos acima, o valor representado é
- (−1) sinal × 10 expoente − 398 × significando
Se os quatro bits após o bit de sinal forem "1111", o valor será infinito ou NaN, conforme descrito acima:
s 11110 xx...x ±infinity s 11111 0x...x a quiet NaN s 11111 1x...x a signalling NaN
Campo de significando decimal densamente compactado
Nesta versão, o significando é armazenado como uma série de dígitos decimais. O dígito inicial está entre 0 e 9 (3 ou 4 bits binários), e o resto do significando usa a codificação decimal densamente compactada (DPD).
Os 2 bits iniciais do expoente e o dígito inicial (3 ou 4 bits) do significando são combinados nos cinco bits que seguem o bit de sinal.
Os oito bits a seguir são o campo de continuação do expoente, fornecendo os bits menos significativos do expoente.
Os últimos 50 bits são o campo de continuação de significando, que consiste em cinco declínios de 10 bits . Cada declet codifica três dígitos decimais usando a codificação DPD.
Se os primeiros dois bits após o bit de sinal forem "00", "01" ou "10", então esses são os bits iniciais do expoente e os três bits "TTT" depois disso são interpretados como o dígito decimal inicial ( 0 a 7):
s 00 TTT (00)eeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 01 TTT (01)eeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 10 TTT (10)eeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]
Se os primeiros dois bits após o bit de sinal forem "11", os segundos 2 bits serão os bits iniciais do expoente, e o próximo bit "T" será prefixado com bits implícitos "100" para formar o dígito decimal inicial ( 8 ou 9):
s 1100 T (00)eeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 1101 T (01)eeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 1110 T (10)eeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]
As duas combinações restantes (11 110 e 11 111) do campo de 5 bits após o bit de sinal são usadas para representar ± infinito e NaNs, respectivamente.
A transcodificação DPD / 3BCD para os declínios é fornecida pela tabela a seguir. b9 ... b0 são os bits do DPD e d2 ... d0 são os três dígitos BCD.
Valor codificado DPD | Dígitos decimais | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Espaço de código (1024 estados) | b9 | b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | d2 | d1 | d0 | Valores codificados | Descrição | Ocorrências (1000 estados) | |
50,0% (512 estados) | uma | b | c | d | e | f | 0 | g | h | eu | 0 abc | 0 def | 0 ghi | (0–7) (0–7) (0–7) | Três pequenos dígitos | 51,2% (512 estados) | |
37,5% (384 estados) | uma | b | c | d | e | f | 1 | 0 | 0 | eu | 0 abc | 0 def | 100 i | (0–7) (0–7) (8–9) | Dois pequenos dígitos, um grande |
38,4% (384 estados) | |
uma | b | c | g | h | f | 1 | 0 | 1 | eu | 0 abc | 100 f | 0 ghi | (0–7) (8–9) (0–7) | ||||
g | h | c | d | e | f | 1 | 1 | 0 | eu | 100 c | 0 def | 0 ghi | (8–9) (0–7) (0–7) | ||||
9,375% (96 estados) | g | h | c | 0 | 0 | f | 1 | 1 | 1 | eu | 100 c | 100 f | 0 ghi | (8–9) (8–9) (0–7) | Um pequeno dígito, dois grandes |
9,6% (96 estados) | |
d | e | c | 0 | 1 | f | 1 | 1 | 1 | eu | 100 c | 0 def | 100 i | (8–9) (0–7) (8–9) | ||||
uma | b | c | 1 | 0 | f | 1 | 1 | 1 | eu | 0 abc | 100 f | 100 i | (0–7) (8–9) (8–9) | ||||
3,125% (32 estados, 8 usados) | x | x | c | 1 | 1 | f | 1 | 1 | 1 | eu | 100 c | 100 f | 100 i | (8–9) (8–9) (8–9) | Três dígitos grandes, bits b9 e b8 não se importam | 0,8% (8 estados) |
Os 8 valores decimais cujos dígitos são todos 8s ou 9s têm quatro codificações cada. Os bits marcados com x na tabela acima são ignorados na entrada, mas sempre serão 0 nos resultados calculados. (O 8 × 3 = 24 codificações não padrão preenche a lacuna entre 10 3 = 1000 e 2 10 = 1024.)
Nos casos acima, com o significando verdadeiro como a sequência de dígitos decimais decodificados, o valor representado é
Veja também
- ISO / IEC 10967 , Aritmética Independente de Linguagem
- Tipo de dados primitivo
- Dezembro 64