Saturday 6 May 2017

Opções Normalizadas Mantissa Binárias


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 Na representação de ponto fixo Como é que todo o trabalhoIm tentando converter um int em um flutuador personalizado, em que o usuário especifica a quantidade de bits reservados para o exp e mantissa, mas eu não entendo como a conversão funciona. Minha função recebe um valor int ee int exp para representar o número (valor 2exp) ou seja, valor 12, exp 4, retorna 192. mas eu não entendo o processo que eu preciso fazer para alterá-los. Eu estive olhando para isso por dias e jogar com IEEE conversor web apps, mas eu só não entendo o que é o processo de normalização. Como eu vejo que seu movimento o ponto binário e ajustar o expoente, mas eu não tenho idéia do que isso significa, alguém pode me dar um exemplo para ir embora também eu não entendo o que é o exponencial viés. A única informação que tenho é que você apenas adiciona um número ao seu expoente, mas não entendo o porquê. Eu tenho procurado o Google por um exemplo que eu posso entender, mas isso não faz qualquer sentido para mim, perguntei em 1 de março 15 às 23:31 U2EF1, então, como eu sei quantas vezes ele precisa ser deslocado. Como se o usuário especificasse 4 bits para A mantisa e o valor é 3, como eu sei deslocar 0011 para 1000. Posso, então, algo como obter maxval pow (2, ltspecified mant. Bitsgt) -1, depois mudar o valor (0011) até o valor gt maxval, e Ter um contador de acompanhamento de quantas vezes eu faço este ndash Tommy K Mar 1 15 às 23:51 Um número de ponto flutuante é normalizado quando forçamos a parte inteira de sua mantisa a ser exatamente 1 e permitir que sua fração seja o que quer que seja gostar. Por exemplo, se tomássemos o número 13.25. Que é 1101.01 em binário, 1101 seria a parte inteira e 01 seria a parte da fração. Eu poderia representar 13,25 como 1101,01 (20). Mas isso não é normalizado porque a parte inteira não é 1. No entanto. Nós somos permitidos deslocar a mantissa para a direita um dígito se nós aumentarmos o expoente por 1: Esta representação 1.10101 (23) é a forma normalizada de 13.25. Dito isto, sabemos que os números de ponto flutuante normalizados sempre aparecerão na forma 1.fffffff (2exp) Para um bem de eficiência, não nos incomodamos armazenar a 1 parte inteira na representação binária em si, apenas fingimos estar lá. Então, se nós estivéssemos a dar o seu personalizado float tipo 5 bits para a mantissa, saberíamos que os bits 10100 seria realmente para 1,10100. Aqui está um exemplo com a mantisa padrão de 23 bits: quanto ao viés do expoente, dê uma olhada no formato de flutuação padrão de 32 bits, que é dividido em 3 partes: 1 bit de sinal, 8 bits de expoente e 23 bits de mantisa : Os expoentes 00000000 e 11111111 têm propósitos especiais (como representando Inf e NaN), então com 8 bits de expoente, poderíamos representar 254 expoentes diferentes, por exemplo 21 a 2254. por exemplo. Mas e se quisermos representar 2-3. Como obtemos expoentes negativos O formato corrige esse problema, subtraindo automaticamente 127 do expoente. Portanto: 0000 0001 seria 1 -127 -126 0010 1101 seria 45 -127 -82 0111 1111 seria 127-127 0 1001 0010 seria 136-127 9 Isso altera o intervalo exponente de 21. 2254 a 2-126. 2127 para que possamos representar expoentes negativos. O processo de normalização converte as entradas em um intervalo selecionado. Binary32 espera que o significand (não mantissa) esteja no intervalo 1.0 lt s lt 2.0 a menos que o número tenha um expoente mínimo. Exemplo: valor 12, exp 4 é o mesmo que o valor 12 (222), exp 4 3 valor 1.5, exp 7 Uma vez que o significand sempre tem um dígito principal de 1 (a menos que o número tenha um expoente mínimo), não há necessidade de Armazená-lo. E em vez de armazenar o expoente como 7. um viés de 127 é adicionado a ele. Valor 1,5 decimal - 1,1000. 000 binário - 0,1000. 000 binário armazenado (23 bits no total) exp 7 - bias exp 7 127 - 134 decimal - 10000110 binário O padrão binário armazenado é a concatenação do sinal, significando um 1 implícito implícito e um expoente de polarização quando o tendencioso O expoente é 0 - o valor mínimo, o bit implícito é 0 e, portanto, números pequenos como 0.0 podem ser armazenados. Quando o expoente enviesado é 255 - o valor máximo, os dados armazenados já não representam números finitos mas infinito e Não-um-números. Verifique o link referenciado para obter mais detalhes. Tommy - chux e eigenchris, juntamente com os outros, forneceram excelentes respostas, mas se eu estiver olhando seus comentários corretamente, você ainda parece estar lutando com as porcas de como eu levaria essas informações e depois usar isso Na criação de uma representação de flutuação personalizada onde o usuário especifica a quantidade de bits para o expoente Não se sinta mal, é uma clara como lama a primeira dúzia de vezes que você passar por ele. Acho que posso dar uma facada para limpá-lo. Você está familiarizado com a representação IEEE754-Single-Precision-Floating-Point de: Esse bit de sinal de 1 bit. Expoente tendencioso de 8 bits (na notação de excesso de 127 bits de 8 bits) e a mantisa restante de 23 bits. Quando você permite que o usuário escolha o número de bits no expoente, você terá que retrabalhar a notação de expoente para trabalhar com o novo limite escolhido pelo usuário. O que isso mudará Mudará a manipulação do bit de sinal? Isso mudará o mantisse - Não (você ainda converterá o formato mantissasignificand para bit escondido). Portanto, a única coisa que você precisa se concentrar é a manipulação de expoentes. Como você abordaria este Recall, o expoente atual de 8 bits é o que é chamado de notação de excesso-127 (onde 127 representa o maior valor para 7 bits, permitindo que qualquer viés seja contido e expresso dentro do limite atual de 8 bits. O usuário escolhe 6 bits como o tamanho do expoente, então o que você terá para fornecer um método semelhante para garantir que você tenha um número fixo para representar o seu novo excesso de notação que funcionará dentro do limite do usuário. Pegue um limite de usuário de 6 bits, então Uma escolha para o valor do expoente imparcial pode ser testada como 31 (os maiores valores que podem ser representados em 5 bits). Para isso, você pode aplicar a mesma lógica (tomando o exemplo 13.25 acima). Sua representação binária para o número é 1101.01 Para o qual você move o decimal 3 posições para a esquerda para obter 1.10101 o que lhe dá um exponencial viés de 3. No seu exemplo de expoente de 6 bits você iria adicionar 3 31 para obter sua notação de excesso-31 para o expoente: 100010. Em seguida, colocar A mantissa em formato de bit oculto (ou seja, soltar o le Ading 1 de 1.10101 resultando em sua nova Tommy Precision Representation: Com bit de sinal de 1 bit. Expoente polarizado de 6 bits (na notação de excesso de 6 bits) e mantissa de 25 bits remanescente. As mesmas regras se aplicariam para reverter o processo para obter seu número de ponto flutuante de volta da notação acima. (Apenas usando 31 em vez de 127 para apoiar o viés fora do expoente) Espero que isso ajude de alguma forma. Eu não vejo muito mais que você pode fazer se você está realmente indo para permitir que um usuário selecionado tamanho expoente. Lembre-se, o padrão IEEE-754 não era algo que foi adivinhado e muitos bons raciocínios e trade-offs chegaram a chegar ao layout 1-8-23 sign-exponent-mantissa. No entanto, acho que seu exercício faz um grande trabalho em exigindo que você compreenda firmemente o padrão. Agora totalmente perdido e não abordado nesta discussão é o que os efeitos que isso teria sobre a gama de números que poderiam ser representados neste Custom Precision Floating Point Representação. Eu não olhei para ele, mas a principal limitação parece ser uma redução no MAXMIN que poderia ser representada. Respondeu Mar 2 15 em 10: 53Summary Todos os programas Java são compilados em arquivos de classe que contêm bytecodes, o idioma da máquina da máquina virtual Java. Este artigo analisa os bytecodes que implementam os recursos de ponto flutuante do Java. W elcome a outra parcela de Under The Hood. Esta coluna pretende dar aos desenvolvedores Java um vislumbre da beleza escondida abaixo de seus programas Java em execução. Esta coluna de meses continua a discussão, iniciada no mês passado. Do conjunto de instruções bytecode da máquina virtual Java (JVM). Este artigo examina a aritmética de ponto flutuante na JVM e cobre os bytecodes que executam operações aritméticas de ponto flutuante. Artigos subseqüentes discutirão outros membros da família bytecode. Os pontos flutuantes principais O suporte de ponto flutuante JVM adere ao padrão de ponto flutuante IEEE-754 1985. Este padrão define o formato de números de ponto flutuante de 32 bits e 64 bits e define as operações sobre esses números. Na JVM, a aritmética de ponto flutuante é executada em flutuadores de 32 bits e em dobra de 64 bits. Para cada bytecode que executa aritmética em flutuadores, existe um bytecode correspondente que executa a mesma operação em duplas. Um número de ponto flutuante tem quatro partes - um sinal, uma mantissa, uma raiz e um expoente. O sinal é um 1 ou -1. A mantissa, sempre um número positivo, contém os dígitos significativos do número de ponto flutuante. O expoente indica o poder positivo ou negativo da raiz que a mantissa eo sinal devem ser multiplicados por. Os quatro componentes são combinados da seguinte maneira para obter o valor de ponto flutuante: sinal mantissa radix exponente Números de ponto flutuante têm múltiplas representações, porque sempre se pode multiplicar a mantissa de qualquer número de ponto flutuante por alguma potência da raiz e alterar o expoente Para obter o número original. Por exemplo, o número -5 pode ser representado igualmente por qualquer uma das seguintes formas na base 10: Para cada número de ponto flutuante existe uma representação que é dita ser normalizada. Um número de ponto flutuante é normalizado se a sua mantissa estiver dentro do intervalo definido pela seguinte relação: 1radix lt mantissa lt 1 Um número de ponto flutuante 10 radix 10 normalizado tem o seu ponto decimal apenas à esquerda do primeiro dígito diferente de zero no Mantissa. A representação de ponto flutuante normalizado de -5 é -1 0,5 10 1. Em outras palavras, uma mantisa de números de ponto flutuante normalizado não possui dígitos não-zero à esquerda do ponto decimal e um dígito não-zero apenas à direita Do ponto decimal. Qualquer número de ponto flutuante que não se enquadra nesta categoria é dito ser desnormalizado. Observe que o número zero não possui uma representação normalizada, porque não possui nenhum dígito que não seja zero para colocar apenas à direita do ponto decimal. Por quê ser normalizado é uma exclamação comum entre zeros. Os números de ponto flutuante na JVM usam uma base de dois. Os números de ponto flutuante na JVM, portanto, têm a seguinte forma: signo mantisse 2 expoente A mantisa de um número de ponto flutuante na JVM é expressa como um número binário. Uma mantissa normalizada tem seu ponto binário (a base-dois equivalente de um ponto decimal) apenas à esquerda do dígito não-zero mais significativo. Como o sistema de números binários tem apenas dois dígitos - zero e um - o dígito mais significativo de uma mantisa normalizada é sempre um. O bit mais significativo de um flutuador ou dobro é o bit de sinal. A mantissa ocupa os 23 bits menos significativos de um flutuador e os 52 bits menos significativos de um duplo. O expoente, 8 bits em um flutuador e 11 bits em um duplo, fica entre o sinal e mantissa. O formato de um flutuador é mostrado abaixo. O bit de sinal é mostrado como um s, os bits de expoente são mostrados como e, e os bits de mantissa são mostrados como m: Layout de bits de Java float s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm Um bit de sinal de zero indica um número positivo e um bit de sinal de um indica Um número negativo. A mantissa é sempre interpretada como uma base positiva - dois números. Não é um número de dois complementos. Se o bit de sinal for um, o valor de ponto flutuante é negativo, mas a mantissa ainda é interpretada como um número positivo que deve ser multiplicado por -1. O campo expoente é interpretado de uma das três maneiras. Um expoente de todos os indica que o número de ponto flutuante tem um dos valores especiais de mais ou menos infinito, ou quotnot um númeroquot (NaN). NaN é o resultado de certas operações, como a divisão de zero por zero. Um expoente de todos os zeros indica um número de ponto flutuante desnormalizado. Qualquer outro expoente indica um número de ponto flutuante normalizado. A mantissa contém um pouco mais de precisão para além daquelas que aparecem nos bits mantissa. A mantissa de um flutuador, que ocupa apenas 23 bits, tem 24 bits de precisão. A mantissa de um duplo, que ocupa 52 bits, tem 53 bits de precisão. O bit de mantissa mais significativo é previsível e, portanto, não está incluído, porque o expoente de números de ponto flutuante na JVM indica se o número está ou não normalizado. Se o expoente é todo zero, o número de ponto flutuante é desmoronado e o bit mais significativo da mantisa é conhecido por ser um zero. Caso contrário, o número de ponto flutuante é normalizado eo bit mais significativo da mantissa é conhecido por ser um. A JVM não oferece exceções como resultado de qualquer operação de ponto flutuante. Valores especiais, como infinito positivo e negativo ou NaN, são retornados como resultado de operações suspeitas, como divisão por zero. Um expoente de todos os indica um valor especial de ponto flutuante. Um expoente de todos aqueles com uma mantissa cujos bits são todos zero indica um infinito. O sinal do infinito é indicado pelo bit de sinal. Um expoente de todos aqueles com qualquer outra mantissa é interpretada para significar quotnot um numberquot (NaN). A JVM produz sempre o mesmo mantissa para NaN, que é todos os zeros excepto para o bit mais significativo mantissa que aparece no número. Estes valores são mostrados para um flutuador abaixo: valores especiais flutuador flutuar bits (sinal expoente mantissa) 0 10000000 10010010000111111011011 Expoente de todos os zeros indica a mantissa é denormalized, o que significa que o bit à esquerda não declarada é um zero em vez de um. O poder de dois neste caso é o mesmo que o menor poder de dois disponíveis para uma mantissa normalizada. Para o float, este é -125. Isto significa que mantissas normalizado multiplicado por dois elevado à potência de -125 têm um campo de expoente de 00000001, enquanto mantissas denormalized multiplicado por dois elevado à potência de -125 têm um campo de expoente de 00000000. A provisão para números denormalized na parte inferior Fim do intervalo de expoentes suporta underflow gradual. Se o expoente mais baixo fosse usado para representar um número normalizado, o subfluxo para zero ocorreria para números maiores. Em outras palavras, deixar o expoente mais baixo para números desnormalizados permite que números menores sejam representados. Os números desnormalizado menores têm menos bits de precisão do que os números normalizados, mas isso é preferível underflowing a zero, logo que o expoente atinge o seu valor mínimo normalizado. Desnormalizado flutuar valores Float pedaços (sinal de expoente mantissa) Menor positivo (diferente de zero) flutuador 0 00000000 00000000000000000000001 menor negativo (diferente de zero) flutuador 1 00000000 00000000000000000000001 maior desnormalizado flutuar 1 00000000 11111111111111111111111 0 00000000 00000000000000000000000 1 00000000 00000000000000000000000 flutuador Exposed: Um flutuador Java Revela sua natureza interna O applet abaixo permite que você brincar com o formato de ponto flutuante. O valor de um flutuador é exibido em vários formatos. O formato de notação científica radix dois mostra a mantissa eo expoente na base dez. Antes de ser exibida, a mantissa real é multiplicada por 24, o que gera um número inteiro, eo expoente não exagerado é diminuído em 24. Tanto a mantissa integral quanto o expoente são então facilmente convertidos para a base dez e exibidos. Clique aqui para obter o código fonte do Float Exposed.

No comments:

Post a Comment