Friday 10 November 2017

Opção binária de representação de ponto flutuante normalizado


Estou um pouco confuso sobre como normalizar números em C. Eu sei que se você tiver algo como o valor binário 1101.101 de ponto flutuante, ele é normalizado como 1.101101 x 23 movendo as posições de decimal 3 para a esquerda. No entanto, não tenho certeza como fazer isso no código. Então, se eu tenho 10010000 exp 0 e eu quero obter 01001000 exp 1, o campo de fração é 001 eo resultado final é 010001. Se eu tiver um número de 8 bits e os 2 bits de liderança são 00, eu quero movê-lo até que eu Encontrar um 1, ou se eu tiver um bit líder de 01 então ele já está normalizado. Similary para um líder 2 bits de 11 eu movê-lo para a esquerda. Então, se o meu número era de 32 bits, 1 para o sinal, 8 para o expoente, 23 para a mantissa, eu faria algo como: E, em seguida, vários mais se declarações para os outros 2 números de bit de liderança (00, 10) Claro se meu código lógico está certo. Como você diz, você precisa extrair o sinal, mantissa e expoente. O diagrama acima, tirado da Wikipedia, mostra como é definido para o formato de ponto flutuante de precisão simples mais comum, IEEE 754. Para extrair cada parte precisamos fazer isso em três etapas detalhadas abaixo. Eu não tenho o código C, mas vou mostrar os passos que você precisa tomar. Depois de extrair as 3 partes, basta colocá-las nas posições de bit mostradas no diagrama acima. Se seu um número unsigned este é sempre 0. Se seu assinado seu o MSB. 2. Exponente Se o número estiver assinado e negativo você precisará virar todos os bits e adicionar 1 para torná-lo positivo. Se não, você pode deixá-lo como ele é. Para extrair o expoente devemos saber onde o ponto binário está destinado a ser. Seja a posição do ponto binário b (no seu exemplo, seu 3). Deixe o primeiro bit do MSB que é 1 ser p (no seu exemplo é 6). Deixando o expoente ser e. 3. Mantissa Isto será igual aos bits da posição p-1 para o bit 0.Como representar 0.148 2 na aritmética de ponto flutuante normalizado com o formato (0.148) (0.00100101111.) 2 Deslocamos 3 bits para a esquerda para fazer Normalizou (1,00101111) 2 2. Exponente 1164 (75) (1001011) 2 e Mantissa (01001111) 2. Portanto, a representação de ponto flutuante é (0100101100101111) 2 (4B2F) Representação A Mas se armazenarmos a mantisse desnormalizada em registro de 8 bits, então não armazenará os últimos três 1s e então a mantisa teria normalizado de (0.00100101) 2 para (1.00101000 ) 2 inserindo 3 0s em vez de 1s. A representação teria sido (0100101100101000) 2 (4B28) Representação B Então, ao normalizar, o processador leva em conta os bits de mantisa desnormalizados além de 8 bits também. Ou simplesmente arreda-se qual é o correto: A ou B Ele armazena a mantisa Em representação de ponto fixo. Como tudo funciona? Estou tentando ajudar alguém com algum dever de casa e estou obtendo respostas erradas. A questão é a seguinte: Representar -0.10937510 em representação de ponto flutuante normalizado com uma mantissa complementar de dois bits fracionários de 5 bits e um complemento de complemento de dois dígitos inteiros de 3 bits. Eu escrevi as seguintes notas: Vamos resolver a resposta à pergunta: -0.10937510 Passo 1: Converter em binário. 0 0. 0 0 0 1 1 1 0 0 Etapa 2: Multiplicar por 1 (20) - (00,00011100) 2 x 20 Passo 3: Deslocar para fazer o número inteiro da mantisa Precisamos fazer 6 turnos para a esquerda Por que temos 0.000111 Shift 1 00.00111 Shift 2 000.0111 Shift 3 0000.111 Shift 4 00001.11 Shift 5 000011.1 Shift 6 0000111 Portanto, obtemos, - (1112) x 2 (-6) Passo 4: Converter mantisa. Nesta questão, fomos solicitados a converter em complemento duplo (fração de 5 bits) Portanto, precisamos converter 111 para dois complementos e fazer isso 5 bit Passo A: Converter em complemento (5 bits) -00111 11000 Etapa B: Converter para Twos complemento (5 bits) 11000 00001 110012 Etapa 5: Converte o máximo exponente 2-bit twos complemento 2 (-6) Portanto, precisamos converter -6 para binário (complemento duplo) Etapa A: Converter para binário 1 1 0 Etapa B : Converter para os complementos (3-bit) 110 001 Etapa C: Converter para twos complementar 010 A resposta é, então, 11001 0102 Como você pode ver, 2-6 parece errado para um complemento de 3 bits twos. Alguém pode apontar o que eu poderia estar fazendo errado Normalmente o significand (não mantissa 1) é deslocado para que o mais significativo um bit está em uma determinada posição, não assim o significand é um inteiro. O formato IEEE 754 normaliza o significado para 1. dddd. Onde cada d é um dígito na base sendo usado. Shifting seu valor para mover o primeiro bit para essa posição gera um expoente de 4. Você teria 1.110 2 2 4. Para representar o significando em dois complemento, adicionamos um outro bit à esquerda, produzindo 01.110 2 2 4. e então Aplicar a negação para produzir 10.010 para o significand e 100 para o expoente. No entanto, pode haver alguma variação nos detalhes. O significado é normalizado para 1. dddd ou .1 dddd. É o significand cinco bits antes de adicionar um bit de sinal ou depois Você tem exemplos de valores com representações conhecidas neste formato Ou mais detalhes sobre o formato 1 Significand é o termo preferido. Um significand é linear, uma mantisa é logarítmica. Representação do Ponto de Fusão 8211 Noções básicas Existem postagens na representação do formato de ponto flutuante. O objetivo deste artigo é fornecer uma breve introdução ao formato de ponto flutuante. A descrição a seguir explica a terminologia e os detalhes principais da representação de ponto flutuante binário IEEE 754. A discussão limita-se a formatos de precisão simples e dupla. Normalmente, um número real em binário será representado no seguinte formato, onde eu e F n serão 0 ou 1 de partes inteiras e de fração, respectivamente. Um número finito também pode ser representado por quatro componentes inteiros, um sinal (s), uma base (b), um significante (m) e um expoente (e). Em seguida, o valor numérico do número é avaliado como (-1) s x m x b e Onde m lt b Dependendo da base e do número de bits usados ​​para codificar vários componentes, o padrão IEEE 754 define cinco formatos básicos. Entre os cinco formatos, os formatos binário32 e binário64 são de precisão única e formatos de dupla precisão, respectivamente, na qual a base é 2. Tabela 8211 1 Formato de precisão de representação de precisão: conforme mencionado na tabela 1, o formato de precisão única tem 23 bits para significando ( 1 representa o bit implícito, detalhes abaixo), 8 bits para o expoente e 1 bit para o sinal. Por exemplo, o número racional 92 pode ser convertido em formato de flutuação de precisão única como segue, o resultado que se diz ser normalizado. Se for representado com 1 bit principal, isto é 1.001 (2) x 2 2. (Da mesma forma que o número 0.000000001101 (2) x 2 3 é normalizado, ele aparece como 1.101 (2) x 2 -6). Omitir isto implícito 1 no extremo esquerdo dá-nos a mantissa do número do flutuador. Um número normalizado fornece mais precisão do que o correspondente número desnormalizado. O bit mais significativo implícito pode ser usado para representar significand ainda mais preciso (23 1 24 bits) que é chamado de representação subnormal. Os números de ponto flutuante devem ser representados na forma normalizada. Os números subnormais caem na categoria de números des-normalizados. A representação subnormal reduz ligeiramente o intervalo exponente e não pode ser normalizada uma vez que isso resultaria em um expoente que não se encaixa no campo. Os números subnormais são menos precisos, ou seja, eles têm menos espaço para bits diferentes do zero no campo de fração do que os números normalizados. De fato, a precisão cai à medida que o tamanho do número subnormal diminui. No entanto, a representação subnormal é útil para preencher lacunas de escala de ponto flutuante perto de zero. Em outras palavras, o resultado acima pode ser escrito como (-1) 0 x 1.001 (2) x 2 2 o que produz os componentes inteiros como s 0, b 2, significando (m) 1.001, mantissa 001 e e 2. A correspondente O número flutuante de precisão simples pode ser representado em binário como mostrado abaixo, onde o campo de expoente é suposto ser 2, contudo codificado como 129 (1272) chamado expoente polarizado. O campo do expoente está em formato binário simples, que também representa expoentes negativos com uma codificação (como a magnitude do sinal, o complemento 1s, o complemento 2s, etc.). O expoente enviesado é usado para a representação de expoentes negativos. O expoente tendencioso tem vantagens em relação a outras representações negativas na realização de comparação bit a bit de dois números de ponto flutuante para igualdade. Um viés de (2 n-1 8211 1), onde n é de bits usados ​​em expoente, é adicionado ao expoente (e) para obter expoente (E) polarizado. Portanto, o expoente polarizado (E) de número de precisão simples pode ser obtido como A faixa de expoente no formato de precisão simples é -126 a 127. Outros valores são usados ​​para símbolos especiais. Nota: Quando descompactamos um número de ponto flutuante, o expoente obtido é um expoente tendencioso. Subtraindo 127 do expoente polarizado, podemos extrair expoente não-tendencioso. Formato de Precisão Dupla: Como mencionado na Tabela 1, o formato de dupla precisão tem 52 bits para significand (1 representa bit implícito), 10 bits para expoente e 1 bit para sinal. Todas as outras definições são as mesmas para o formato de dupla precisão, exceto para o tamanho de vários componentes. A menor mudança que pode ser representada na representação de ponto flutuante é chamada de precisão. A parte fracionada de um único número de precisão normalizada tem exatamente 23 bits de resolução, (24 bits com o bit implícito). Isso corresponde a log (10) (2 23) 6.924 7 (a característica do logaritmo) dígitos decimais de precisão. Da mesma forma, no caso de números de precisão dupla, a precisão é log (10) (2 52) 15.654 16 dígitos decimais. A precisão na representação de ponto flutuante é regida pelo número de bits significativos, enquanto o intervalo é limitado pelo expoente. Nem todos os números reais podem ser representados exatamente em formato de ponto flutuante. Para qualquer número que não seja número de ponto flutuante, há duas opções para aproximação por ponto flutuante, digamos, o número de ponto flutuante mais próximo menor que x como x eo número de ponto flutuante mais próximo maior que x como x. Uma operação de arredondamento é realizada em número de bits significativos no campo mantisse com base no modo selecionado. O modo arredondado faz com que x seja definido como x, o modo arredondado faz com que x seja definido como x, a rodada em direção ao modo zero faz com que x seja x ou x, o que estiver entre zero e. A rodada para o modo mais próximo define x para x ou x o que estiver mais próximo de x. Normalmente, o mais próximo é o modo mais utilizado. A proximidade da representação de ponto flutuante com o valor real é chamada de precisão. Padrões de bits especiais: o padrão define poucos padrões especiais de bits de ponto flutuante. Zero não pode ter mais significativo 1 bit, portanto, não pode ser normalizado. A representação de bits ocultos requer uma técnica especial para armazenar zero. Teremos dois padrões de bits diferentes 0 e -0 para o mesmo valor numérico zero. Para a representação de ponto flutuante de precisão simples, estes padrões são indicados a seguir, 0 00000000 00000000000000000000000 0 1 00000000 00000000000000000000000 -0 Da mesma forma, o padrão representa dois padrões de bits diferentes para INF e - INF. Os mesmos são indicados abaixo, 0 11111111 00000000000000000000000 INF 1 11111111 00000000000000000000000 - INF Todos estes números especiais, bem como outros números especiais (abaixo) são números subnormais, representados através da utilização de um padrão de bits especial no campo de expoente. Isso reduz ligeiramente a faixa exponente, mas isso é bastante aceitável, uma vez que o alcance é tão grande. Uma tentativa de calcular expressões como 0 x INF, 0 INF, etc. não faz sentido matemático. O padrão chama o resultado de expressões como Não um Número (NaN). Qualquer expressão subsequente com NaN produz NaN. A representação de NaN tem significand não zero e todos os 1s no campo exponente. Estes são mostrados abaixo para o formato de precisão simples (x não é cuidado bits), x 11111111 1 m 0000000000000000000000 Onde m pode ser 0 ou 1. Isso nos dá duas representações diferentes de NaN. 0 11111111 110000000000000000000000 Sinalização NaN (SNaN) 0 11111111 100000000000000000000000 NaN silencioso (QNaN) Geralmente QNaN e SNaN são usados ​​para tratamento de erros. QNaN não levantam nenhuma exceção à medida que se propagam através da maioria das operações. Considerando SNaN são que, quando consumidos pela maioria das operações irá levantar uma excepção inválida. Overflow e Underflow: Diz-se que o overflow ocorre quando o resultado verdadeiro de uma operação aritmética é finito mas maior em magnitude que o maior número de ponto flutuante que pode ser armazenado usando a precisão dada. Diz-se que o subfluxo ocorre quando o verdadeiro resultado de uma operação aritmética é menor em magnitude (infinitesimal) do que o menor número de ponto flutuante normalizado que pode ser armazenado. Overflow não pode ser ignorado nos cálculos, enquanto underflow pode efetivamente ser substituído por zero. O padrão IEEE 754 define um formato de ponto flutuante binário. Os detalhes da arquitetura são deixados para os fabricantes de hardware. A ordem de armazenamento de bytes individuais no número de ponto flutuante binário varia de arquitetura para arquitetura. Agradecimentos a Venki para escrever o artigo acima. Por favor, escreva comentários se encontrar algo incorreto, ou deseja compartilhar mais informações sobre o tópico discutido acima.

No comments:

Post a Comment