Thursday, 26 October 2017

Opções de ponto flutuante em opções binárias no Brasil


Decimal 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 em 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 previamente examinadas. A parte fracionária pode ser convertida por multiplicação. Este é basicamente o inverso do método de divisão: repetidamente multiplicamos por 2, e colhemos cada um como ele aparece à esquerda da decimal. Anexe vezes 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 seja um bit da esquerda. Ajuste o expoente de dois para que o valor não mude. Coloque a mantissa no campo mantisa do número. Omita o líder, e complete com zeros à direita. Adicione o viés ao expoente de dois, e coloque-o no campo do expoente. O viés é 2 k menos 1 menos 1, onde k é o número de bits no campo exponente. Para o formato de oito bits, k 3, então a polarização é 2 3minus1 menos 1 3. Para IEEE 32 bits, k 8, então o viés é de 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. Bit de sinal é 0. Então 0.40625 é 0 001 1010 1a 16 Converte -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. Bit de sinal é 1. Então -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 repetitiva em binário, assim como a facção 13 é uma fração repetida em decimal. (Repete também em binário.) Não podemos representar isso exatamente 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ê o converter 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. Ponto flutuante Thomas Finley, abril de 2000 Conteúdo e Introdução Este documento explica o padrão de ponto flutuante IEEE 754. 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 ignorar 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 é apenas 22 e 510 -1 810 -2 910 -3. Da mesma forma, 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 os números binários, como os 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. Esse método é muito mais rápido. De qualquer forma Pegamos os números que temos e os representamos como .011001, colocando-os na ordem em que os adquirimos. Colocando 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 No entanto, muitos nós temos que adicionar ao lado direito para fazer esse número binário de 23 bits de comprimento. Uma vez que um dos problemas de casa implica representar isso como hexadecimal, 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 este 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 exponente 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, o que reflete uma mantissa real de 0,0101 lembre-se de que não incluímos o que antes era um pouco 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) Essas 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 existem, desde que existam alguns. O bit de sinal parece não ter 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 precisão única tenha sido coberta no texto acima, incluo uma dupla precisão por causa da 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. O programa emite então a representação hexadecimal dos dados no Floco (repetindo a entrada) e imprime ao lado dele a quantidade de ponto flutuante que representa. Mostro aqui um exemplo 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ê deseja resolver esse problema, substitua o f na seqüência de formatação da função printf com e, que irá reproduzir 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 é que ele lê em um número de ponto flutuante. Assim como e saídas a forma hexadecimal mais o número de ponto flutuante. Mais uma vez eu incluo uma execução de amostra deste programa, confirmando os resultados dos exemplos de problemas abordados 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 2000 Conversor decimal para flutuante Sobre o conversor decimal para flutuante Este é um conversor de ponto flutuante decimal para binário. Ele converterá um número decimal para o número de ponto flutuante binário IEEE 754 de precisão simples e de dupla precisão, usando arredondamento redondo-para-igual (o modo de arredondamento IEEE padrão). É implementado com aritmética de precisão arbitrária, então suas conversões estão corretamente arredondadas. Ele irá converter números normais e subnormais, e converterá os números que transbordam (para o infinito) ou sub-fluxo (para zero). O número de ponto flutuante resultante pode ser exibido em dez formas: em decimal, em binário, em notação científica decimal normalizada, em notação científica binária normalizada, como uma decimal normalizada vezes uma potência de dois, como um inteiro decimal vezes um poder de dois , Como um inteiro decimal vezes uma potência de dez, como uma constante de ponto flutuante hexadecimal, em binário bruto e em hexadecimal bruto. Cada formulário representa o valor exato do número de ponto flutuante. Por que usar este conversor Este conversor irá mostrar-lhe por que números em seus programas de computador, como 0.1, não se comportam como você espera. Dentro do computador, a maioria dos números com um ponto decimal só pode ser aproximado de outro número, apenas um pouco longe do que você deseja, deve suportar isso. Por exemplo, em ponto flutuante de precisão única, 0,1 torna-se 0.100000001490116119384765625. Se o seu programa estiver a imprimir 0.1, está mentindo para você se estiver a imprimir 0.100000001, it8217s ainda está mentindo, mas pelo menos você está dizendo que você realmente não tem 0.1. Como usar este conversor Digite um número positivo ou negativo, seja no formulário padrão (por exemplo, 134.45) ou expoente (por exemplo, 1.3445e2). Indique valores fracionários com um ponto decimal (lsquo. rsquo) e não utilize vírgulas. Essencialmente, você pode digitar o que um programa de computador aceita como um literal de ponto flutuante, exceto sem qualquer sufixo (como lsquofrsquo). Verifique as caixas para a precisão IEEE que deseja escolher Duplo. Solteiro . ou ambos. (O duplo é o padrão.) O dobro significa que um significand de 53 bits (menos se subnormal) com um expoente de 11 bits. Único significa um significand de 24 bits (menos se subnormal) com um expoente de 8 bits. Verifique as caixas para qualquer formato de saída que você deseja escolher um ou todos os dez. (O decimal é o padrão.) Clique em lsquoConvertrsquo para converter. Clique em lsquoClearrsquo para redefinir o formulário e começar do zero. Se você quiser converter outro número, basta digitar sobre o número original e clicar em lsquoConvertrsquo 8212 não é necessário clicar em lsquoClearrsquo primeiro. Existem dez formas de saída para escolher: Decimal. Exibir o número de ponto flutuante em decimal. (Expandir caixa de saída, se necessário, para ver todos os dígitos.) Binário. Exibir o número de ponto flutuante em binário. (Expandir caixa de saída, se necessário, para ver todos os dígitos.) Notação científica decimal normalizada. Exibir o número de ponto flutuante em decimal, mas de forma compacta, usando notação científica normalizada. (Expandir caixa de saída, se necessário, para ver todos os dígitos.) Notação científica binária normalizada. Exibe o número de ponto flutuante em binário, mas de forma compacta, usando notação científica binária normalizada. Nota . Os números subnormal são mostrados normalizados, com seu expoente real. Temporais decimais normalizados uma potência de dois. Exibir o número de ponto flutuante em uma notação científica normalizada híbrida, como um número decimal normalizado vezes um poder de dois. Inteiro decimal vezes uma potência de dois. Exibe o número de ponto flutuante como um número inteiro decimal com uma potência de dois. (A representação binária do inteiro decimal é o padrão de bits da representação de ponto flutuante, menos zeros à direita). Essa forma é mais interessante para expoentes negativos, pois representa o número de ponto flutuante como uma fração diádica. Inteiro decimal vezes um poder de dez. Exibir o número de ponto flutuante como um número inteiro decimal com uma potência de dez. Esta forma é mais interessante para os expoentes negativos, pois representa o número de ponto flutuante como uma fração. (Expandir caixa de saída, se necessário, para ver todos os dígitos.) Constante hexagonal de ponto flutuante. Exibir o número de ponto flutuante como uma constante de ponto flutuante hexadecimal. Nota . Há muitas maneiras de formatar constantes hexadecimais de ponto flutuante, como você veria se, por exemplo, você comparou a saída dos programas Java, Visual C, gcc C e Python. As diferenças em várias línguas são superficiais, porém 8212 zeros à esquerda podem ou não ser exibidos, os expoentes positivos podem ou não ter um sinal de mais, etc. Este conversor converte as constantes sem zeros à direita e sem sinais de mais. Nota . Como muitas linguagens de programação, esse conversor mostra números subnormais não normalizados, com seus expoentes definidos para o mínimo exponente normal. Nota . O último dígito hexadecimal em uma constante de ponto flutuante hexadecimal pode ter o binário 0s de trânsito dentro deste doesn8217t implica necessariamente que esses bits existem no formato IEEE selecionado. Raw binário. Exibe o número de ponto flutuante em seu formato IEEE bruto (bit de sinal seguido pelo campo exponente seguido pelo campo significand). Raw hexadecimal. Exibe o número de ponto flutuante em seu formato IEEE bruto, equivalente ao formato binário bruto, mas expresso de forma compacta em hexadecimal. (Veja aqui para obter mais detalhes sobre esses formulários de saída.) Existem duas bandeiras de saída: Inexact. Se for verificado, isso mostra que a conversão foi inexata, é que ele deve ser arredondado para uma aproximação do número de entrada. (A conversão é inexata quando a saída decimal não corresponde à entrada decimal, mas esta é uma maneira mais rápida de contar). Nota. Este conversor sinaliza o transbordamento para o infinito e sub-fluxo para zero como inexato. Subnormal. Se marcado, isso mostra que o número era muito pequeno e convertido com menos de precisão total (a precisão real é mostrada entre parênteses). Implementação Eu escrevi este conversor a partir do zero 8212 ele não confia em funções de conversão nativas como strtod () ou strtof () ou printf (). Baseia-se no algoritmo baseado em inteiro grande que descrevo no meu artigo ldquoCorrect Decimal A Ponto Flutuante Usando Big Integers rdquo. I8217ve implementado usando o BCMath. Por razões práticas, configurei um limite arbitrário (um pouco) no comprimento da entrada decimal. Você obtém uma mensagem de erro se você clicar nela. Isso irá filtrar as entradas que, de outra forma, transbordariam para o infinito ou o subfluível para zero, mas também o impedirá de entrar em alguns casos de arredondamento intermediário de ldquohardrdquo. (Para o registro, porém, este conversor aceita todos os exemplos difíceis discutidos no meu site.) Para todas as entradas que são aceitas no entanto, a saída está correta (não obstante quaisquer bugs escapar meu teste extensivo).Converting IEEE 754 Floating Point em binário Post explica como converter números de ponto flutuante para números binários no formato IEEE 754. Um bom link sobre o tema da conversão IEEE 754 existe no site da Thomas Finley. Para este post vou ficar com o IEEE 754 única precisão binário formato de ponto flutuante: binary32. Veja esta outra postagem para implementações em C, Java e Python para converter entre os formatos binário e decimal. Expressando números em notação científica Você pode estar ciente de que números binários, como números decimais, podem ter pontos decimais. E que os números binários, como números decimais, podem ser expressos usando notação científica: decimal: 923.52 9.2352 x 10 2 binário: 101011.101 1.01011101 x 2 5 O número que o 10 ou 2 é elevado para, o ldquoexponentrdquo, representa o número de lugares deslocados À esquerda ou à direita do ponto decimal de acordo. Na representação de ponto flutuante IEEE 754, o número binário é dividido em três seções: o bit de sinal, o expoente e a mantisa (parte fracionada). Isso ocupa apenas um bit e representa o sinal: 0 para positivo e 1 para negativo. A seção de expoente para um ponto flutuante de 16 bit (meia precisão) ocupa 5 bits e armazena o valor exponente descrito acima. Para 32 bits (de precisão simples) como no exemplo acima binário32, esta seção ocupa 8 bits para formatos de 64 bits (dupla precisão) esta seção ocupará 11 bits. Lidando com expoentes positivos e negativos Uma codificação de exponente de 8 bits pode representar números inteiros de 0 (00000000) a 255 (11111111). Mas o que dizer de expoentes negativos Nós precisamos ser capazes de incluir estes, também. Para cobrir isso, garantimos que o expoente é de valor 127 maior. Se o nosso expoente for (digamos) 3, adicione 127 a ele para dar 3 127 130 (decimal) 10000010 (binário). Esse viés é simplesmente 2 n nash 1 em que n é o número de bits de expoente, de modo que as codificações de expoente de 8 bits teriam um viés de 2 8 ndash 1 128 ndash 1 127. Se o nosso expoente fosse menos 3, então o resultado seria -3 127 124 (decimal) 1111100 (binário). Em outras palavras, (00000000) a (01111111) representa os expoentes de -127 a zero e (10000000) a (11111111) representaria os expoentes de 1 a 128. A terceira seção da nossa representação de 32 bits é de 23 bits de comprimento . A mantisa, às vezes chamada de significand, representa a parte fracionada do número em notação científica binária, ou seja, o número binário à direita do ponto decimal. Exemplo: 12.375 no formato binário IEEE 754 Este exemplo para converter de representação decimal em um formato binário32 é tirado da página Wikipedia. Considere o número 12.375. Tome a parte não fracionária de 12.375 e converta-a em binário da maneira normal: 12 (decimal) é 1100 (binário) Desde 12 (8 1) (4 1) (2 0) (2 0) Convertendo a parte fracionária 0,375) no binário é feito usando o seguinte procedimento: 1. Multiplique a fração por 2 2. Mantenha a parte inteira da multiplicação como o resultado binário 3. Re-multiplique a nova fração por 2 4. Repita 1 Ndash 3 até uma fração de zero É encontrado ou até que o limite de precisão seja atingido que é 23 dígitos de fração para o formato IEEE 754 binário 32 ie: 0,375 x 2 0,750 0 0,750 gt 0 0,750 x 2 1,500 1 0,500 gt 1 0,500 x 2 1.000 1 0,000 gt 1 A parte de fração eventualmente vem Para 0.000, então terminamos. O resultado binário é 011, portanto 0.375 (decimal) é 0.011 (binário) 12.375 (decimal) é agora 1100.011 (binário). Converta o resultado para o formato científico binário requerido O formato IEEE 754 binary32 requer que você represente valores no formato científico descrito anteriormente, de modo que a partir desta notação científica podemos deduzir: Sign 0 (número positivo) bias 2 8 -1 127 (8- Bit exponente codificação para binary32) adicionando isso para o expoente dá: 3 127 130 (decimal) 10000010 (binário) Mantissa 100011 (parte fracionária à direita do ponto decimal) A partir destes formamos o resultante 32 bits IEEE 754 binary32 formato representação de 12.375 como:

No comments:

Post a Comment