formato de ponto flutuante decimal64 - decimal64 floating-point format

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.

Regras de codificação decimal densamente compactadas
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

Referências