Skip to main content

Opções De Ponto Flutuante Em Opções Binárias


Você está interpretando seus dados de forma errada. 0 é o sinal, então o número é positivo 100 é o expoente que é de fato 1 (21). O expoente é assinado e os valores possíveis são: 000 (o número 0 e números desnormalizados) 001 -2 010 -1 011 0 100 1 101 2 110 3 111 (infinidades e NANs) P. S. NAN. Não um número (códigos de erro e coisas) 0101 é a sua mantissa. O que isso significa de fato é que seu número é 1.0101 (há um bit oculto para precisão extra já que cada número deve começar com 1. que 1 não é realmente armazenado). Isto dá-lhe (1516) 2 2.625 O Número de Ponto Flutuante é 45 (Base 16) i. e. 01000101 (Base 2). 0101 é a parte de mantissa e 100 é o expoente um. Ao restaurar o líder a mantissa é renovado para 1.0101. Subtraindo o viés do expoente, que é 3 em caso de representação de 8 bits, o expoente se torna 1. A representação binária é 1.0101 21. De-normalizando obtemos 10.101, que é a representação binária para 2.625. Expandir a resposta de JasonDs Eu acho que é seguro assumir que você entende, ou melhor, dar por certo, que um flutuador pode ter um expoente negativo. Mas se você pensa nisso, como isso realmente acontece? É aí que o viés vem para jogar, e eu acho que é o elo perdido em sua compreensão. No seu link, eles mencionaram a seguinte lei para calcular o viés: Onde k é o número de bits no campo do expoente. No seu exemplo, k era de 3 bits, então o viés é 3. Desta forma, você pode codificar qualquer expoente no intervalo -3,4 (inclusive). Portanto, agora é espero que claro que quando youre decodificação do número, você tem que unbias o expoente primeiro. Então o seu 24 é realmente 21 como JasonD afirmou. Respondeu Mar 10 13 at 12:14 Sua resposta 2017 Stack Exchange, IncFloating Point Thomas Finley, abril 2000 Conteúdo e Introdução Este documento explica o IEEE 754 ponto flutuante padrão. Ele explica a representação binária desses números, como converter decimal de ponto flutuante, como converter de ponto flutuante para decimal, discute casos especiais em ponto flutuante e, finalmente, termina com algum código C para outros entendimento de ponto flutuante. Este documento não abrange operações com números de ponto flutuante. Eu escrevi este documento para que se você sabe como representar, você pode pular a seção de representação, e se você sabe como converter para decimal de precisão única, você pode ignorar essa seção, e se você sabe como converter para precisão única de Decimal, você pode pular essa seção. Representação Primeiro, saiba que os números binários podem ter, se você perdoar meu dizer assim, um ponto decimal. Ele funciona mais ou menos da mesma maneira que o ponto decimal faz com números decimais. Por exemplo, o decimal 22.589 é meramente 22 e 510-1 810 -2 910 -3. Similarmente, o número binário 101.001 é simplesmente 12 2 02 1 12 0 02 -1 02 -2 12 -3. Ou melhor, simplesmente 2 2 2 0 2 -3 (este número específico funciona para ser 9.125, se isso ajuda o seu pensamento). Segundo, saiba que números binários, como números decimais, podem ser representados em notação científica. Por exemplo. O decimal 923.52 pode ser representado como 9.2352 10 2. Da mesma forma, números binários podem ser expressos dessa forma também. Digamos que temos o número binário 101011.101 (que é 43.625). Isso seria representado usando notação científica como 1,01011101 2 5. Agora que estou certo de que a compreensão é perfeita, posso finalmente entrar em representação. A unidade de ponto flutuante de precisão simples é um pacote de 32 bits, dividido em três seções um bit, oito bits e vinte e três bits, nessa ordem. Vou fazer uso do número binário mencionado anteriormente 1.01011101 2 5 para ilustrar como um tomaria um número binário em notação científica e representá-lo em notação de ponto flutuante. Se convertemos simplesmente de hex para binário, 0x64 é 0110 0100, que é o mesmo resultado que o 011001 produzido acima. Este método é muito mais rápido. De qualquer forma Pegamos os números que conseguimos e os representamos como .011001, colocando-os na ordem em que os adquirimos. Coloque em sequência com a nossa representação binária de 329, obtemos 101001001.011001. Em nossa notação científica binária, isto é 1.01001001011001 2 8. Em seguida, usamos o que sabemos sobre como números de precisão simples são representados para concluir este processo. O sinal é positivo, então o campo do sinal é 0. O expoente é 8. 8 127 135, então o campo do expoente é 10000111. A mantissa é meramente 01001001011001 (lembre-se o implícito 1 da mantissa significa que não incluímos o líder 1) mais Entretanto muitos 0s nós temos que adicionar ao lado direito para fazer esse número binário 23 bocados por muito tempo. Uma vez que um dos problemas da lição de casa envolve representar isto como hex, eu terminarei com um número hexadecimal. Em seguida, quebra-lo em pedaços de quatro bits (já que cada dígito hexadecimal é o equivalente a 4 bits) e, em seguida, converter cada quantidade de quatro bits no dígito hexadecimal correspondente. Assim, em hexadecimal, este número é 0x43A4B200. Números especiais Às vezes, o computador sente a necessidade de apresentar um resultado de um cálculo que reflete que algum erro foi feito. Talvez a magnitude do resultado de um cálculo fosse maior ou menor do que esse formato pareceria ser capaz de suportar. Talvez você tenha tentado dividir por zero. A resposta é que existem casos especiais de números de ponto flutuante, especificamente quando o campo de expoente é todo 1 bits (255) ou todos os 0 bits (0). Números desnormalizados Se você tem um campo de expoente que é todos os bits zero, isso é o que é chamado um número desnormalizado. Com o campo do expoente igual a zero, você pensaria que o expoente real seria -127, então este número tomaria a forma de 1.MANTISSA 2 -127 como descrito acima, mas não. Em vez disso, é 0.MANTISSA 2 -126. Observe que o expoente não é mais o valor do campo exponencial menos 127. É simplesmente -126. Observe também que já não incluímos um bit implícito para a mantissa. Como exemplo, pegue o número de ponto flutuante representado como 0x80280000. Primeiro, converta isso para binário. Nosso bit de sinal é 1, então esse número é negativo. Nosso expoente é 0, então sabemos que este é um número desnormalizado. Nossa mantissa é 0101, que reflete uma mantissa real de 0,0101 lembre-se de que não incluímos o que antes era um bit implícito para um expoente de zero. Assim, isto significa que temos um número -0,0101 2 2 -126 -0,3125 10 2 -126 -1,25 10 2 -128. Você pode pensar em zero como simplesmente outro número desnormalizado. Zero é representado por um expoente de zero e uma mantissa de zero. A partir de nossa compreensão dos números desnormalizados, isto se traduz em 02 -126 0. Este bit de sinal pode ser positivo (0) ou negativo (1), levando a um zero positivo ou negativo. Isso não faz muito sentido matematicamente, mas é permitido. Assim como o caso de todos os bits zero no campo do expoente é um caso especial, assim é o caso de todos os bits. Se o campo do expoente é todos os, e a mantissa é todos os zeros, então este número é um infinito. Pode haver infinitos positivos ou negativos dependendo do bit de sinal. Por exemplo, 0x7F800000 é infinito positivo e 0xFF800000 é infinito negativo. NaN (Not a Number) Estas quantidades especiais têm um campo de expoente de 255 (todos os bits) como o infinito, mas diferem da representação do infinito em que a mantissa contém alguns bits. Não importa onde eles estão ou quantos deles há, apenas contanto que existam alguns. O bit de sinal parece não ter nenhuma influência nisso. Exemplos dessa quantidade especial incluem 0x7FFFFFFF, 0xFF81ABD0, 0x7FAA12F9 e soforth. Resumo de Casos Especiais Um resumo de casos especiais é mostrado na tabela abaixo. É mais ou menos uma cópia da tabela encontrada na página 301 da segunda edição da Computer Organization and Design, a Interface de Software de Hardware por Patterson e Hennessy, o manual de Ciência da Computação 104 no semestre da Primavera de 2000. Mesmo que apenas uma única precisão tenha sido abordada no texto acima, eu incluo a dupla precisão por motivos de completude. Quando, Onde e Onde Não Quando você tem operações como 00 ou subtraindo o infinito do infinito (ou alguma outra computação ambígua), você receberá NaN. Quando você divide um número por zero, você terá um infinito. No entanto, a contabilização dessas operações especiais exige algum esforço extra por parte do projetista e pode levar a operações mais lentas, já que mais transistores são utilizados no design de chips. Por esse motivo, por vezes, as CPUs não contabilizam essas operações e, em vez disso, geram uma exceção. Por exemplo, quando eu tento dividir por zero ou fazer operações com infinito, meu computador gera exceções e se recusa a concluir a operação (meu computador tem um processador G3 ou MPC750). Helper Software Se você estiver interessado em investigar mais, eu incluo dois programas para os quais eu fornecer o código C que você pode executar para obter uma maior compreensão de como funciona flutuante e também para verificar o seu trabalho em várias atribuições. Hex 2 Float Este programa aceita como entrada uma quantidade hexadecimal e lê-lo como dados brutos na variável theFloat. Em seguida, o programa emite a representação hexadecimal dos dados no Float (repetindo a entrada) e imprime ao lado dela a quantidade de ponto flutuante que representa. Eu mostro aqui uma amostra do programa. Observe as quantidades de ponto flutuante de casos especiais (0, infinito e não um número). Para os números desnormalizados mas não nulos, este programa exibirá zero mesmo que o número não seja realmente zero. Se você quiser solucionar esse problema, substitua o f na seqüência de formatação da função printf com e, que irá desativar o número com grande precisão com notação científica. Eu não o tive como e porque eu encontro a notação científica extremamente irritante. Float 2 Hex Esta é uma ligeira modificação do programa Hex 2 Float. A exceção é ele lê em um número de ponto flutuante. Assim como e saídas a forma hexadecimal mais o número de ponto flutuante. Novamente, eu incluo um exemplo de execução deste programa, confirmando os resultados dos exemplos de problemas que abordamos anteriormente neste texto, juntamente com alguns outros casos simples. Observe a representação hexadecimal de 0,2. E esse é o fim desse capítulo. Thomas Finley 2000Decimal para conversões de ponto flutuante O procedimento de conversão As regras para converter um número decimal em ponto flutuante são as seguintes: Converta o valor absoluto do número para binário, talvez com uma parte fracionária após o ponto binário. Isso pode ser feito convertendo as partes integrais e fracionárias separadamente. A parte integral é convertida com as técnicas examinadas anteriormente. A parte fracionária pode ser convertida por multiplicação. Este é basicamente o inverso do método de divisão: repetidamente multiplicar por 2, e colher cada um bit como aparece à esquerda do decimal. Acrescente os tempos 2 0 ao final do número binário (que não altera seu valor). Normalize o número. Mova o ponto binário para que fique um bit da esquerda. Ajuste o expoente de dois para que o valor não mude. Coloque a mantissa no campo de mantissa do número. Omitir o líder, e preencher com zeros à direita. Adicione o viés ao expoente de dois, e coloque-o no campo expoente. O viés é 2 k menos 1 menos 1, onde k é o número de bits no campo do expoente. Para o formato de oito bits, k 3, então a polarização é 2 3minus1 menos 1 3. Para o IEEE de 32 bits, k 8, então a polarização é 2 8minus1 menos 1 127. Defina o bit de sinal, 1 para negativo, 0 para Positivo, de acordo com o sinal do número original. Usando o procedimento de conversão Converta 2.625 para nosso formato de ponto flutuante de 8 bits. A parte integral é fácil, 2 10 10 2. Para a parte fracionária: Gerar 1 e nada permanece. Assim 0,40625 10 0,01101 2. Normalizar: 0,01101 2 1,101 2 vezes 2 -2. Mantissa é 1010, o expoente é -2 3 1 001 2. Sinal bit é 0. Assim, 0.40625 é 0 001 1010 1a 16 Converter -12.0 para o nosso formato de ponto flutuante de 8 bits. 12 10 1100 2. Normalize: 1100,0 2 1,1 2 vezes 2 3. Mantissa é 1000, o expoente é 3 3 6 110 2. Sinal bit é 1. Portanto, -12.0 é 1 110 1000 e8 16 Converta decimal 1.7 para o nosso formato de ponto flutuante de 8 bits. A parte integral é fácil, 1 10 1 2. Para a parte fracionária: Gerar 1 e continuar com o resto. A razão pela qual o processo parece continuar indefinidamente é que ele faz. O número 710, que faz uma fração decimal perfeitamente razoável, é uma fração de repetição em binário, assim como a facção 13 é uma fração de repetição em decimal. (Ele repete em binário também.) Não podemos representar exatamente isso como um número de ponto flutuante. O mais próximo que podemos chegar em quatro bits é .1011. Uma vez que já temos um líder 1, o melhor número de oito bits que podemos fazer é 1.1011. Já normalizado: 1.1011 2 1.1011 2 vezes 2 0. Mantissa é 1011, o expoente é 0 3 3 011 2. Sinal é 0. O resultado é 0 011 1011 3b 16. Isso não é exato, é claro. Se você convertê-lo de volta para decimal, você obtém 1.6875. Converta -1313.3125 para o formato de ponto flutuante IEEE de 32 bits. A parte integral é 1313 10 10100100001 2. O fracionário: Gerar 0 e continuar.

Comments