Na computação, o decimal32 é um formato de número de ponto flutuante decimal que ocupa 4 bytes (32 bits) na memória do computador.
Propósito e uso
editarAssim como os formatos binary16 e binary32, o decimal32 utiliza menos espaço do que o formato binary64, que é o mais comum na prática.
Intervalo e precisão
editarO decimal32 suporta valores "normais", que podem ter uma precisão de 7 dígitos desde até , além de valores "subnormais" com uma precisão relativa degradada até (um único dígito), zeros sinalizados, infinitos sinalizados e NaN (Not a Number). A codificação é um tanto complexa, conforme detalhado abaixo.
O formato binário com o mesmo tamanho de bits, o binary32, possui um intervalo aproximado que vai do mínimo subnormal , passando pelo mínimo normal com precisão total de 24 bits de , até o máximo de .
Codificação de valores decimal32
editarOs valores decimal32 são codificados em um formato "não normalizado" próximo ao "formato científico", combinando alguns bits do expoente com os bits mais significativos do significando em um "campo de combinação".
| Sinal | Combinação | Bits restantes do significando |
|---|---|---|
| 1 bit | 11 bits | 20 bits |
| s | mmmmmmmmmmm | tttttttttttttttttttt |
Além dos casos especiais de infinitos e NaNs, existem quatro pontos relevantes para compreender a codificação do decimal32:
- Codificação BID vs. DPD: a BID (binary integer decimal) utiliza um valor inteiro positivo para o significando, sendo voltada para software e projetada pela Intel; já a DPD (densely packed decimal) codifica todos os dígitos do significando exceto o primeiro, sendo voltada para hardware e promovida pela IBM. As diferenças são detalhadas abaixo. Ambas as alternativas fornecem exatamente o mesmo intervalo de números representáveis: até 7 dígitos de significando e valores de expoente possíveis. O padrão IEEE 754 permite essas duas codificações distintas sem especificar uma forma de denotar qual delas está em uso, por exemplo, em uma situação onde valores decimal32 são transmitidos entre sistemas.
- Ao contrário dos formatos binários, os significandos dos formatos decimais não são normalizados (os dígitos iniciais podem ser 0), e, portanto, a maioria dos valores com menos de 7 dígitos significativos possui múltiplas representações possíveis. Por exemplo, , , e têm todos o mesmo valor de . Esses conjuntos de representações para um mesmo valor são chamados de coortes, e os diferentes membros podem ser usados para indicar quantos dígitos do valor são conhecidos com precisão.
- As codificações combinam dois bits do expoente com os 3 ou 4 bits iniciais do significando em um "campo de combinação", que varia para significandos "grandes" vs. "pequenos". Isso permite maior precisão e alcance, com a desvantagem de que algumas funções simples como ordenação e comparação, frequentemente usadas em programação, não funcionam diretamente no padrão de bits; elas exigem computações para extrair o expoente e o significando para então tentar obter uma representação alinhada pelo expoente. Esse esforço é parcialmente compensado por economizar o trabalho de normalização, mas contribui para o desempenho mais lento dos formatos decimais. Atenção: BID e DPD usam bits diferentes do campo de combinação para essa finalidade.
- Diferentes interpretações do significando como inteiro vs. fração, e o respectivo viés diferente a ser aplicado ao expoente: para o decimal32, o que é armazenado nos bits pode ser decodificado como a base elevada à potência do "valor armazenado para o expoente menos o viés de 95" vezes o significando interpretado como (com o ponto decimal após o primeiro dígito, significando fracionário), ou a base elevada à potência do "valor armazenado para o expoente menos o viés de 101" vezes o significando interpretado como (sem ponto decimal, significando inteiro). Ambos produzem o mesmo resultado, conforme a versão de 2019[1] do padrão IEEE 754 na cláusula 3.3, página 18. Isso se aplica tanto à codificação BID quanto à DPD. Para formatos decimais, a segunda visão é mais comum, enquanto para formatos binários a primeira é a mais utilizada, sendo os valores de viés diferentes para cada formato.
Em todos os casos para o decimal32, o valor representado é:
- , com o significando interpretado como um inteiro positivo.
Alternativamente, ele pode ser interpretado como , com os dígitos do significando interpretados como , onde o ponto decimal o torna uma fração.
Para Infinito, além do bit de sinal, todos os bits restantes são ignorados (ou seja, os campos do expoente e do significando não têm efeito). Para NaNs, o bit de sinal não tem significado no padrão e é ignorado. Portanto, NaNs com e sem sinal são equivalentes, embora alguns programas exibam NaNs com sinal. O bit determina se o NaN é quieto (0) ou sinalizador (1). Os bits do significando formam a carga útil (payload) do NaN e podem conter dados definidos pelo usuário (por exemplo, para distinguir como os NaNs foram gerados). Assim como nos significandos normais, a carga útil dos NaNs pode estar tanto na codificação BID quanto na DPD.
A numeração de bits utilizada nas tabelas para, por exemplo, está na direção oposta à utilizada no documento oficial do padrão IEEE 754 ().
| Campo de combinação | Expoente | Significando | Descrição | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| m10 | m9 | m8 | m7 | m6 | m5 | m4 | m3 | m2 | m1 | m0 | ||||
| Campo de combinação não iniciado com '11', bits ab = 00, 01 ou 10 | ||||||||||||||
| a | b | c | d | m | m | m | m | e | f | g | abcdmmmm | (0)efgtttttttttttttttttttt | Número finito com significando < 8388608, cabe em 23 bits. | |
| Campo de combinação iniciado com '11', mas não 1111, bits ab = 11, bits cd = 00, 01 ou 10 | ||||||||||||||
| 1 | 1 | c | d | m | m | m | m | e | f | g | cdmmmmef | 100gtttttttttttttttttttt | Número finito com significando > 8388607, precisa de 24 bits. | |
| Campo de combinação iniciado com '1111', bits abcd = 1111 | ||||||||||||||
| 1 | 1 | 1 | 1 | 0 | Infinito | |||||||||
| 1 | 1 | 1 | 1 | 1 | 0 | NaN quieto (quiet NaN) | ||||||||
| 1 | 1 | 1 | 1 | 1 | 1 | NaN sinalizador (with payload no significando) | ||||||||
O expoente "bruto" resultante é um inteiro binário de 8 bits onde os bits iniciais não são '11', resultando em valores de = , devendo-se subtrair o viés correspondente. O significando resultante pode ser um inteiro binário positivo de 24 bits até , mas os valores acima de são "ilegais" e devem ser tratados como zeros. Para obter os dígitos decimais individuais, o significando deve ser dividido por 10 repetidamente.
| Campo de combinação | Expoente | Significando | Descrição | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| m10 | m9 | m8 | m7 | m6 | m5 | m4 | m3 | m2 | m1 | m0 | ||||
| Campo de combinação não iniciado com '11', bits ab = 00, 01 ou 10 | ||||||||||||||
| a | b | c | d | e | m | m | m | m | m | m | abmmmmmm | (0)cde tttttttttt tttttttttt | Número finito com primeiro dígito pequeno no significando (). | |
| Campo de combinação iniciado com '11', mas não 1111, bits ab = 11, bits cd = 00, 01 ou 10 | ||||||||||||||
| 1 | 1 | c | d | e | m | m | m | m | m | m | cdmmmmmm | 100e tttttttttt tttttttttt | Número finito com primeiro dígito grande no significando (8 ou 9). | |
| Campo de combinação iniciado com '1111', bits abcd = 1111 | ||||||||||||||
| 1 | 1 | 1 | 1 | 0 | Infinito | |||||||||
| 1 | 1 | 1 | 1 | 1 | 0 | NaN quieto (quiet NaN) | ||||||||
| 1 | 1 | 1 | 1 | 1 | 1 | NaN sinalizador (with payload no significando) | ||||||||
O expoente "bruto" resultante é um inteiro binário de 8 bits onde os bits iniciais não são '11', fornecendo valores de = , devendo-se subtrair o viés correspondente. O primeiro dígito decimal do significando é formado a partir dos bits (0)cde ou 100e como um inteiro binário. Os dígitos subsequentes são codificados nos campos de 'declet' de 10 bits 'tttttttttt' de acordo com as regras DPD (veja abaixo). O significando decimal completo é obtido concatenando o dígito decimal inicial com os dígitos decimais restantes.
A conversão de DPD de 10 bits para BCD de 3 dígitos para os declets é dada pela tabela a seguir. são os bits do DPD, e são os três dígitos BCD. Note que a numeração de bits aqui utilizada para, por exemplo, está na direção oposta à utilizada no documento oficial do padrão IEEE 754 (). Além disso, os dígitos decimais são indexados a partir de 0 aqui, enquanto possuem índice de base 1 no artigo do IEEE 754. Os bits sobre fundo branco não contam para o valor, mas sinalizam como interpretar ou deslocar os outros bits. O conceito consiste em indicar quais dígitos são pequenos () e codificados em três bits, e quais não são, sendo então calculados a partir de um prefixo '100' e de um bit que especifica se é 8 ou 9.
Predefinição:Densely packed decimal
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 acima são ignorados na entrada, mas sempre serão 0 nos resultados calculados (as codificações não padronizadas preenchem a lacuna entre e ).
A vantagem desta codificação é o acesso aos dígitos individuais decodificando ou codificando apenas 10 bits; a desvantagem é que algumas funções simples, como ordenação e comparação, frequentemente usadas em programação, não funcionam diretamente no padrão de bits, exigindo primeiro a decodificação para dígitos decimais (e eventualmente a recodificação para inteiros binários).
Uma codificação alternativa em seções BID curtas, com declets de 10 bits codificando de a e utilizando simplesmente a faixa de 0 a 999, forneceria a mesma funcionalidade de acesso direto aos dígitos com impacto quase nulo no desempenho de sistemas modernos, preservando a opção de ordenação e comparação orientadas ao padrão de bits. No entanto, a codificação exibida acima foi a escolhida historicamente, podendo oferecer melhor desempenho em implementações de hardware.
História
editarO decimal32 foi introduzido na versão de 2008[2] do IEEE 754, adotado pela ISO como ISO/IEC/IEEE 60559:2011.[3]
Curiosidades
editarA codificação DPD é relativamente eficiente, não desperdiçando mais do que cerca de 2,4% de espaço em comparação com a BID, pois os valores possíveis em 10 bits são apenas um pouco maiores do que o necessário para codificar todos os números de 0 a 999.
O zero possui 192 representações possíveis (384 quando ambos os zeros sinalizados são incluídos).
Os formatos decimais incluem valores denormais para uma degradação suave da precisão próximo ao zero. No entanto, ao contrário dos formatos binários, eles não são marcados e não necessitam de um expoente especial; no decimal32, eles são apenas valores pequenos demais para ter a precisão total de 7 dígitos, mesmo com o menor expoente.
Nos casos de infinito e NaN, todos os outros bits da codificação são ignorados. Portanto, é tecnicamente possível inicializar uma matriz para infinitos ou NaNs preenchendo-a com um único valor de byte, embora na prática os dados sejam transmitidos para a memória por palavras, e não por bytes.
Veja também
editar- ISO/IEC 10967, aritmética independente de linguagem
- Tipo de dado primitivo
- Notação Q
Referências
editar- ↑ 754-2019 - IEEE Standard for Floating-Point Arithmetic ( caution: paywall ). [S.l.: s.n.] 2019. ISBN 978-1-5044-5924-2. doi:10.1109/IEEESTD.2019.8766229
- ↑ IEEE Computer Society (29 de agosto de 2008). IEEE Standard for Floating-Point Arithmetic. [S.l.]: IEEE. ISBN 978-0-7381-5753-5. doi:10.1109/IEEESTD.2008.4610935. IEEE Std 754-2008
- ↑ «ISO/IEC/IEEE 60559:2011». 2011