Na computação, o decimal128 é um formato de número de ponto flutuante decimal que ocupa 128 bits na memória. Introduzido oficialmente no IEEE 754-2008, ele é destinado a aplicações onde é necessário emular o arredondamento decimal de forma exata, como em cálculos financeiros e fiscais.

Formato

O formato decimal128 suporta 34 dígitos decimais de significando e um intervalo de expoente de −6143 a +6144, ou seja, a . Como o significando não é normalizado, a maioria dos valores com menos de 34 dígitos significativos possui múltiplas representações possíveis; , etc. Este conjunto de representações para um mesmo valor é chamado de coorte. O zero possui 12288 representações possíveis (24576 se ambos os zeros sinalizados forem incluídos, em duas coortes diferentes).

Codificação de valores decimal128

Sinal Combinação Continuação do significando 1 bit 17 bits 110 bits

O padrão IEEE 754 permite duas codificações alternativas para valores decimal128: A codificação binária, baseada em Decimal inteiro binário (BID): O significando é codificado como um inteiro não sinalizado escrito em binário. A codificação decimal, baseada em Decimal densamente empacotado (DPD): O significando é codificado como um inteiro não sinalizado escrito em decimal, com grupos de 3 dígitos empacotados juntos em um declet e uma regra especial para o dígito mais significativo.

Este padrão não especifica como sinalizar qual codificação está sendo usada, por exemplo, em uma situação onde valores decimal128 são comunicados entre sistemas.

Ambas as alternativas fornecem exatamente o mesmo conjunto de números representáveis: 34 dígitos de significando e valores de expoente possíveis.

Em ambos os casos, os 4 bits mais significativos do significando (que na verdade só possuem 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 5 bits no campo de combinação. As combinações restantes codificam infinitos e NaNs.

+ Decimal inteiro binário (BID) Campo de combinação Expoente Bits mais significativos do significando Outro Se a continuação do significando for zero, então o valor representado é zero. ±Infinito . Bit de sinal ignorado. O sexto bit do campo de combinação determina se o NaN é sinalizador.

+ Decimal densamente empacotado (DPD) Campo de combinação Expoente Dígito mais significativo do significando Outro 0 Se a continuação do significando for zero, então o valor representado é zero. 1 2 3 4 5 6 Se for , então isto é ±Infinito. 7 Se for , então isto é NaN. Bit de sinal ignorado. O sexto bit do campo de combinação determina se o NaN é sinalizador. 8 Se for , então isto é ±Infinito. 9 Se for , então isto é NaN

No caso de Infinito e NaN, todos os outros bits da codificação são ignorados. Assim, é possível inicializar uma matriz para Infinitos ou NaNs preenchendo-a com um único valor de byte.

Campo de significando Decimal Inteiro Binário (BID) Este formato usa um significando binário de 0 a = = 1ED09BEAD87C0378D8E63FFFFFFFF16 = . A codificação pode representar significandos binários de até = , mas valores maiores que são ilegais (e o padrão exige que as implementações os tratem como 0, se encontrados na entrada).

Como descrito acima, a codificação varia dependendo se os 4 bits mais significativos do significando estão no intervalo de 0 a 7 (00002 a 01112), ou superior (10002 ou 10012).

Se os 2 bits após o bit de sinal forem "00", "01" ou "10", então o campo do expoente consiste nos 14 bits seguintes ao bit de sinal, e o significando é composto pelos 113 bits restantes, com um bit 0 condutor implícito: s 00eeeeeeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 01eeeeeeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 10eeeeeeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt Isto inclui números subnormais onde o dígito condutor do significando é 0.

Se os 2 bits após o bit de sinal forem "11", then o campo do expoente de 14 bits é deslocado 2 bits para a direita (após o bit de sinal e os bits "11" subsequentes), e o significando representado fica nos 111 bits restantes. Neste caso, há uma sequência condutora implícita (ou seja, não armazenada) de 3 bits "100" no significando verdadeiro. s 1100eeeeeeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1101eeeeeeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1110eeeeeeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt A sequência de 2 bits "11" após o bit de sinal indica que há um prefixo implícito de 3 bits "100" no significando. Os bits "00", "01" ou "10" fazem parte do campo do expoente.

Para o formato decimal128, todos esses significandos estão fora do intervalo válido (eles começam com ) e, portanto, são decodificados como zero, mas o padrão é o mesmo que o de decimal32 e decimal64.

Nos casos acima, o valor representado é:

(−1)sinal × 10expoente−6176 × significando

Se os quatro bits após o bit de sinal forem "1111", então o valor é um infinito ou um NaN, conforme descrito acima:

s 11110 xx...x ±infinito s 11111 0x...x um NaN quieto (quiet NaN) s 11111 1x...x um NaN sinalizador (signalling NaN)

Campo de significando Decimal Densamente Empacotado (DPD) Nesta versão, o significando é armazenado como uma série de dígitos decimais. O dígito condutor está entre 0 e 9 (3 ou 4 bits binários), e o restante do significando usa a codificação Decimal densamente empacotado (DPD).

Os 2 bits condutores do expoente e o dígito condutor (3 ou 4 bits) do significando são combinados nos cinco bits que seguem o bit de sinal.

Os doze bits seguintes formam o campo de continuação do expoente, fornecendo os bits menos significativos do expoente.

Os últimos 110 bits formam o campo de continuação do significando, que consiste em onze declets de 10 bits. Cada declet codifica três dígitos decimais usando a codificação DPD.

Se os dois primeiros bits após o bit de sinal forem "00", "01" ou "10", então esses são os bits condutores do expoente, e os três bits seguintes são interpretados como o dígito decimal condutor (0 a 7): s 00 TTT (00)eeeeeeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 01 TTT (01)eeeeeeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 10 TTT (10)eeeeeeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] Se os dois primeiros bits após o bit de sinal forem "11", então os dois bits seguintes são os bits condutores do expoente, e o último bit é prefixado com "100" para formar o dígito decimal condutor (8 ou 9): s 1100 T (00)eeeeeeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 1101 T (01)eeeeeeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 1110 T (10)eeeeeeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] As duas combinações restantes (11110 e 11111) do campo de 5 bits são usadas para representar ±infinito e NaNs, respectivamente.

Os 8 valores decimais cujos dígitos são todos 8s ou 9s possuem quatro codificações cada. Os bits marcados com x na tabela da codificação DPD são ignorados na entrada, mas sempre serão 0 nos resultados computados.

Nos casos acima, com o significando verdadeiro como a sequência de dígitos decimais decodificados, o valor representado é:

Ver também Formato de ponto flutuante de precisão quádrupla Dupla precisão no formato de ponto flutuante

Categoria:Tipos de ponto flutuante