Estou tentando calcular o mínimo / máximo, ou o menor ao maior intervalo de valor de um tipo de ponto flutuante de 48 bits MIL-STD-1750A (PDF) (WIKI) .
Ex: Como um intervalo duplo é 1.7E +/- 308
Eu olhei em volta em busca de equações e não tenho certeza se o que encontrei vai funcionar.
A primeira equação que encontrei foi
Não tenho certeza por onde começar com isso, se eles estão corretos no que eu preciso.
Alguém me transmitirá seu conhecimento e me ajudará a resolver isso?
Comentários
Resposta
Para ponto flutuante de 32 bits, o valor máximo é mostrado na Tabela III:
0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.
Nós pode decompor a mantissa / expoente em um valor decimal (próximo) da seguinte maneira:
7FFFFF <base-16> = 8,388,607 <base-10>.
Existem 23 bits de significância, então dividimos 8.388.607 por 2 ^ 23 .
8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)
tanto quanto o expoente:
7F <base-16> = 127 <base-10>
e agora multiplicamos a mantissa por 2 ^ 127 (o expoente)
8,388,607 / 2^23 * 2^127 = 8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38
Este é o maior valor de ponto flutuante de 32 bits porque a maior mantissa é usada e o maior expoente.
O ponto flutuante de 48 bits adiciona 16 bits de mantissa com significado de locador, mas deixa o expoente com o mesmo tamanho. Assim, o valor máximo seria representado em hexadecimal como
mansissa=7FFFFFFFFF, exponent=7F.
novamente, podemos calcular
7FFFFFFFFF <base-16> = 549,755,813,887 <base-10>
o expoente máximo ainda é 127, mas precisamos dividir por [23 + 16 = 39, então:] 2 ^ 39. 127-39 = 88, então multiplique por 2 ^ 88:
549,755,813,887 * 2^88 = 1.7014118346015974672186595864716 * 10^38
Este é o maior valor de ponto flutuante de 48 bits porque usamos a maior mantissa possível e o maior expoente possível.
Portanto, os valores máximos são:
1.7014116317805962808001687976863 * 10^38, for 32-bit, and, 1.7014118346015974672186595864716 * 10^38, for 48-bit
O valor máximo para 48 bits é apenas ligeiramente maior do que para 32 bits, o que é lógico, visto que alguns bits são adicionados ao final da mantissa.
(Para ser exato, o número máximo para o formato de 48 bits pode ser expresso como um número binário que consiste em 39 1 “s seguidos por 88 0” s.)
(O menor é apenas o negativo desse valor. O mais próximo de zero sem ser zero também pode ser facilmente calculado conforme acima: use o menor mantissa possível (positiva): 0000001 e o menor expoente possível: 80 em hexadecimal ou -128 em decimal)
Para sua informação
Alguns formatos de ponto flutuante usam um oculto não representado 1
bit na mantissa (isso permite um bit extra de precisão na mantissa, como f a seguir: o primeiro dígito binário de todos os números (exceto 0 ou denormais, veja abaixo) é um 1
, portanto, não temos que armazenar isso 1
, e temos um pouco mais de precisão). Este formato específico não parece fazer isso.
Outros formatos de ponto flutuante permitem mantissa desnormalizada, que permite representar números (positivos) menores que o menor expoente, trocando bits de precisão por potências adicionais (negativas) de 2. É fácil de suportar se também não suportar o escondido, um pouco mais difícil se suportar.
8.388.607 / 2 ^ 23 é o valor que você obteria com mantissa = 0x7FFFFF e expoente = 0x00. Não é o valor de bit único, mas sim o valor com uma mantissa completa e neutra, ou mais especificamente, uma zero expoente.
A razão pela qual este valor não é diretamente 8388607 e requer divisão (por 2 ^ 23 e, portanto, é menor do que o que você poderia esperar) é que o ponto de raiz implícito está na frente da mantissa, em vez de depois dela. Então, pense em (um bit de sinal, seguido por um ponto de raiz, seguido por vinte e três 1 bits) para a mantissa e +/- 111111111111 (nenhum ponto de raiz aqui, apenas um inteiro, neste caso, 127 ) para o expoente.
mantissa = 0x7FFFFF com expoente = 0x7F é o maior valor que corresponde a 8388607 * 2 ^ 104, onde 104 vem de 127-23: novamente, subtraindo 23 potências de dois porque a mantissa tem o ponto de raiz no inicio. Se o ponto de raiz estivesse no final, então o maior valor (0x7FFFFF, 0x7F) seria de fato 8.388.607 * 2 ^ 127.
Entre outras, existem maneiras possíveis de considerarmos um único valor de bit para o mantissa. Um é mantissa = 0x400000 e o outro é mantissa = 0x000001. sem considerar o ponto de raiz ou o expoente, o primeiro é 4.194.304 e o último é 1. Com um expoente zero e considerando o ponto de raiz, o primeiro é 0,5 (decimal) e o último é 0,00000011920928955078125. Com um expoente máximo (ou mínimo), podemos calcular os valores máximos e mínimos de um único bit.
(Observe que o último formato em que a mantissa tem zeros à esquerda seria considerado desnormalizado em alguns formatos de número, e sua representação normalizada seria 0x400000 com um expoente de -23).
Comentários
- Tenho uma dúvida. Fazendo 8.388.607 / 2 ^ 23 dá o que um único bit na mantissa pode representar. Então, como 8.388.607 / 2 ^ 23 * 2 ^ 127 representa o valor máximo?
- @hariprasad, vou colocar um pós-escrito na resposta, pois é muito difícil de explicar no formato de comentário.
- onde está o valor mínimo? ele ' é solicitado no título!
- @CharlieParker, ao contrário de representações inteiras onde mínimo e máximo são deslocados, formatos de ponto flutuante usam sinal & representações de magnitude, onde a magnitude é composta por um expoente e uma mantissa. O número máximo na magnitude do sinal é então (1) positivo (o bit do sinal é 0) e (2) o maior expoente possível e (3) a maior mantissa possível. O número mínimo é idêntico: exceto que o bit de sinal muda, por isso é (1) negativo (o bit de sinal é 1), ainda (2) o maior expoente possível e (3) a maior mantissa possível. Como expliquei acima, o número mínimo é apenas -max, então apenas coloque um
-
sinal.
Resposta
Você pode emprestar de como o ponto flutuante IEEE é disposto para comparação rápida: sinal, expoente, mantissa. no entanto, nesse PDF vejo que a mantissa e o expoente estão invertidos.
Isso significa que para comparar você “terá que primeiro verificar o bit de sinal e se um ainda não for o vencedor, você compara os expoentes e depois compara a mantissa.
Se um for positivo e o outro for negativo então o positivo é o máximo.
Se ambos forem positivos e um expoente for maior, então ele é o máximo (se ambos são negativos, então é o mínimo)
Da mesma forma para mantissa.
a<b?a:b
ea>b?a:b