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 primeira equação

A segunda era segunda equação

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

  • OK, parece que você tem um número FP de 48 bits implementado em hardware de 16 bits. O que exatamente você quer dizer com " encontrar o valor mínimo / máximo "?
  • nada de errado com a<b?a:b e a>b?a:b
  • Eu também não estou certo. Você está tentando comparar dois números em um determinado epsilon ? Você está tentando determinar a faixa possível que pode estar dentro da margem de erro desse valor? Algo mais? Precisamos de mais contexto.
  • Desculpe, vou editar a pergunta para esclarecer. Gostaria de calcular a faixa em que um valor de FP de 48 bits, formatado em MIL-STD-1750A pode ser, do valor mínimo e máximo.

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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *