Ponto flutuante hexadecimal IBM - IBM hexadecimal floating-point

O ponto flutuante hexadecimal (agora chamado de HFP pela IBM ) é um formato para codificação de números de ponto flutuante introduzido pela primeira vez nos computadores IBM System / 360 e com suporte em máquinas subsequentes com base nessa arquitetura, bem como máquinas que foram concebidas para serem aplicativos. compatível com System / 360.

Em comparação com o ponto flutuante IEEE 754 , o formato HFP tem um significando mais longo e um expoente mais curto . Todos os formatos HFP têm 7 bits de expoente com uma polarização de 64. O intervalo normalizado de números representáveis ​​é de 16 −65 a 16 63 (aproximadamente 5,39761 × 10 −79 a 7,237005 × 10 75 ).

O número é representado pela seguinte fórmula: (−1) sinal × 0. significando × 16 expoente − 64 .

32 bits de precisão única

Um número HFP de precisão única (chamado de "curto" pela IBM) é armazenado em uma palavra de 32 bits:

1 7 24 (largura em bits)
S Exp Fração  
31 30 ... 24 23 ... 0 (índice de bits) *
* A documentação da IBM numera os bits da esquerda para a direita, de forma que o bit mais significativo seja designado como o bit número 0.

Nesse formato, o bit inicial não é suprimido e o ponto de raiz (hexadecimal) é definido à esquerda do significando (fração na documentação da IBM e nas figuras).

Como a base é 16, o expoente nesta forma é cerca de duas vezes maior que o equivalente no IEEE 754, para ter uma faixa de expoente semelhante em binário, seriam necessários 9 bits de expoente.

Exemplo

Considere codificar o valor -118.625 como um valor de ponto flutuante de precisão única HFP.

O valor é negativo, então o bit de sinal é 1.

O valor 118,625 10 em binário é 1110110,101 2 . Este valor é normalizado movendo o ponto de raiz para a esquerda quatro bits (um dígito hexadecimal) por vez até que o dígito mais à esquerda seja zero, resultando em 0,01110110101 2 . Os dígitos restantes mais à direita são preenchidos com zeros, resultando em uma fração de 24 bits de 0,0111 0110 1010 0000 0000 0000 2 .

O valor normalizado moveu o ponto de raiz dois dígitos hexadecimais para a esquerda, produzindo um multiplicador e expoente de 16 +2 . Uma tendência de +64 é adicionada ao expoente (+2), resultando em +66, que é 100 0010 2 .

Combinar o sinal, o expoente mais o viés e a fração normalizada produz esta codificação:

S Exp Fração  
1 100 0010 0111 0110 1010 0000 0000 0000  

Em outras palavras, o número representado é −0,76A000 16 × 16 66 - 64 = −0,4633789… × 16 +2 = −118,625

Maior número representável

S Exp Fração  
0 111 1111 1111 1111 1111 1111 1111 1111  

O número representado é + 0.FFFFFF 16 × 16 127 - 64 = (1 - 16 −6 ) × 16 63 ≈ +7,2370051 × 10 75

Menor número normalizado positivo

S Exp Fração  
0 000 0000 0001 0000 0000 0000 0000 0000  

O número representado é +0,1 16 × 16 0 - 64 = 16 −1 × 16 −64 ≈ +5,397605 × 10 −79 .

Zero

S Exp Fração  
0 000 0000 0000 0000 0000 0000 0000 0000  

Zero (0,0) é representado na forma normalizada como todos os bits zero, que é aritmeticamente o valor +0,0 16 × 16 0 - 64 = +0 × 16 −64 ≈ +0,000000 × 10 −79 = 0. Dada uma fração de todos- bits zero, qualquer combinação de bit de sinal positivo ou negativo e um expoente polarizado diferente de zero produzirá um valor aritmeticamente igual a zero. No entanto, a forma normalizada gerada para zero pelo hardware da CPU é totalmente de bits zero. Isso é verdadeiro para todos os três formatos de precisão de ponto flutuante. A adição ou subtração com outros valores do expoente pode perder a precisão no resultado.

Problemas de precisão

Como a base é 16, pode haver até três bits zero à esquerda no significando binário. Isso significa que quando o número é convertido em binário, pode haver apenas 21 bits de precisão. Devido ao efeito de "precisão oscilante", isso pode fazer com que alguns cálculos sejam muito imprecisos. Isso tem causado críticas consideráveis

Um bom exemplo de imprecisão é a representação do valor decimal 0,1. Não tem representação binária ou hexadecimal exata. No formato hexadecimal, é representado como 0,19999999 ... 16 ou 0,0001 1001 1001 1001 1001 1001 1001 1001 ... 2 , ou seja:

S Exp Fração  
0 100 0000 0001 1001 1001 1001 1001 1010  

Isso tem apenas 21 bits, enquanto a versão binária tem 24 bits de precisão.

Seis dígitos hexadecimais de precisão são aproximadamente equivalentes a seis dígitos decimais (ou seja, (6 - 1) log 10 (16) ≈ 6,02). Uma conversão de float hexadecimal de precisão simples em string decimal exigiria pelo menos 9 dígitos significativos (ou seja, 6 log 10 (16) + 1 ≈ 8,22) para converter de volta para o mesmo valor float hexadecimal.

64 bits de precisão dupla

O formato HFP de precisão dupla (chamado de "longo" pela IBM) é igual ao formato "curto", exceto que o campo de fração é mais largo e o número de precisão dupla é armazenado em uma palavra dupla (8 bytes):

1 7 56 (largura em bits)
S Exp Fração  
63 62 ... 56 55 ... 0 (índice de bits) *
* A documentação da IBM numera os bits da esquerda para a direita, de forma que o bit mais significativo seja designado como o bit número 0.

O expoente para este formato cobre apenas cerca de um quarto do intervalo do formato binário IEEE correspondente.

14 dígitos hexadecimais de precisão são aproximadamente equivalentes a 17 dígitos decimais. Uma conversão de float hexadecimal de precisão dupla em string decimal exigiria pelo menos 18 dígitos significativos para converter de volta para o mesmo valor float hexadecimal.

128 bits de precisão estendida

Chamado de precisão estendida pela IBM, um formato HFP de precisão quádrupla foi adicionado à série System / 370 e estava disponível em alguns modelos S / 360 (S / 360-85, -195 e outros por solicitação especial ou simulado por software de sistema operacional ) O campo de fração de precisão estendida é mais amplo, e o número de precisão estendida é armazenado como duas palavras duplas (16 bytes):

Peça de alta ordem
1 7 56 (largura em bits)
S Exp Fração (alta ordem de 14 dígitos)  
127 126 ... 120 119 ... 64 (índice de bits) *
Peça de baixa ordem
8 56 (largura em bits)
Não utilizado Fração (baixa ordem de 14 dígitos)  
63 ... 56 55 ... 0 (índice de bits) *
* A documentação da IBM numera os bits da esquerda para a direita, de forma que o bit mais significativo seja designado como o bit número 0.

28 dígitos hexadecimais de precisão é aproximadamente equivalente a 32 dígitos decimais. Uma conversão de HFP de precisão estendida em string decimal exigiria pelo menos 35 dígitos significativos para converter de volta para o mesmo valor de HFP. O expoente armazenado na parte de ordem inferior é 14 a menos que na parte de ordem superior, a menos que seja menor que zero.

Operaçoes aritimeticas

As operações aritméticas disponíveis são somar e subtrair, normalizadas e não normalizadas, e comparar. A pré-normalização é feita com base na diferença do expoente. Multiplique e divida valores pré-normalizados não normalizados e trunque o resultado após um dígito de guarda. Há uma operação de redução pela metade para simplificar a divisão por dois. A partir de ESA / 390, há uma operação de raiz quadrada. Todas as operações têm um dígito de guarda hexadecimal para evitar perda de precisão. A maioria das operações aritméticas trunca como simples calculadoras de bolso. Portanto, 1 - 16 −8 = 1. Nesse caso, o resultado é arredondado para longe de zero.

IEEE 754 em mainframes IBM

Começando com o S / 390 G5 em 1998, os mainframes IBM também incluíram unidades de ponto flutuante binárias IEEE que estão em conformidade com o padrão IEEE 754 para aritmética de ponto flutuante . O ponto flutuante decimal IEEE foi adicionado ao IBM System z9 GA2 em 2007 usando millicode e em 2008 ao IBM System z10 em hardware.

Os mainframes IBM modernos suportam três radices de ponto flutuante com 3 formatos hexadecimais (HFP), 3 formatos binários (BFP) e 3 formatos decimais (DFP). Existem duas unidades de ponto flutuante por núcleo; um com suporte para HFP e BFP e outro com suporte para DFP; há um arquivo de registro, FPRs, que contém todos os 3 formatos. A partir do z13 em 2015, os processadores adicionaram um recurso de vetor que inclui 32 registradores de vetor, cada um com 128 bits de largura; um registro de vetor pode conter dois números de ponto flutuante de 64 bits ou quatro de 32 bits. Os 16 registradores de ponto flutuante tradicionais são sobrepostos nos novos registradores de vetor, de forma que alguns dados possam ser manipulados com as instruções de ponto flutuante tradicionais ou com as instruções de vetor mais recentes.

Usos especiais

O formato IBM HFP é usado em:

  • Arquivos de transporte SAS 5 (.XPT), conforme exigido pela Food and Drug Administration (FDA) para as submissões de estudo de New Drug Application (NDA),
  • Arquivos de dados GRIB (GRIdded Binary) para trocar a saída de modelos de previsão do tempo ( formato de ponto flutuante de precisão única IEEE na versão atual),
  • Arquivos de formato GDS II (Graphic Database System II) ( OASIS é o substituto), e
  • Arquivos no formato SEG Y (Society of Exploration Geophysicists Y) (ponto flutuante de precisão única IEEE foi adicionado ao formato em 2002).

Como a IBM é o único fornecedor remanescente de hardware usando o formato HFP, e como as únicas máquinas IBM que suportam esse formato são seus mainframes, poucos formatos de arquivo exigem isso. Uma exceção é o formato de arquivo SAS 5 Transport, que o FDA exige; nesse formato, "Todos os números de ponto flutuante no arquivo são armazenados usando a representação de mainframe IBM. [...] A maioria das plataformas usa a representação IEEE para números de ponto flutuante. [...] Para ajudá-lo na leitura e / / ou escrevendo arquivos de transporte, estamos fornecendo rotinas para converter de representação IEEE (big endian ou little endian) para representação de transporte e vice-versa. " O código para o formato da IBM também está disponível em LGPLv2.1 .

Sistemas que usam o formato de ponto flutuante IBM

Veja também

Referências

Leitura adicional