Saturday 28 October 2017

Float point number representation binary options no Brasil


Números de ponto fixo de ponto flutuante Os números de ponto fixo são uma maneira simples e fácil de expressar números fracionários, usando um número fixo de bits. Os sistemas sem suporte de hardware de ponto flutuante freqüentemente usam números de ponto fixo para representar números fracionários. (Os sistemas sem suporte de hardware de ponto flutuante incluem uma ampla gama de hardware - de DSPs de ponto fixo high-end, FPGAs e ASICs personalizados caros que processam mídia de streaming mais rápido do que qualquer unidade de ponto flutuante já construída para microcontroladores extremamente baixos ). O termo Fixed-Point refere-se à posição do ponto binário. O ponto binário é análogo ao ponto decimal de um número de base dez, mas como este é binário ao invés de decimal, um termo diferente é usado. Em binário, os bits podem ser 0 ou 1 e não existe um símbolo separado para designar onde o ponto binário está. No entanto, imaginamos ou assumimos que o ponto binário reside em um local fixo entre os bits designados no número. Por exemplo, em um número de 32 bits, podemos supor que o ponto binário existe diretamente entre os bits 15 (15 porque o primeiro bit é numerado 0, não 1) e 16, dando 16 bits para a parte de número inteiro e 16 bits para A parte fracionária. Observe que o bit mais significativo no campo de número inteiro é geralmente designado como o bit de sinal deixando 15 bits para a magnitude dos números inteiros. Largura e precisão Editar A largura de um número de ponto fixo é o número total de bits atribuídos para armazenamento para o número de ponto fixo. Se estivermos armazenando a parte inteira e a parte fracionária em locais de armazenamento diferentes, a largura seria a quantidade total de armazenamento para o número. O intervalo de um número de ponto fixo é a diferença entre o número mínimo possível eo número máximo possível. A precisão de um número de ponto fixo é o número total de bits para a parte fracionária do número. Como podemos definir onde queremos que o ponto binário fixo seja localizado, a precisão pode ser qualquer número até e incluindo a largura do número. Note-se, no entanto, que quanto mais precisão temos, menor a gama total que temos. Há uma série de padrões, mas neste livro vamos usar n para a largura de um número de ponto fixo, p para a precisão e R para o intervalo total. Nem todos os números podem ser representados exatamente por um número de ponto fixo, e assim a aproximação mais próxima é usada. A fórmula para calcular a representação de inteiro (X) em um formato Qm. n de um número de float (x) é: Para convertê-lo de volta a seguinte fórmula é usada: Alguns exemplos no formato Q3.4: Flutuadores escolhidos aleatoriamente: Alguns exemplos em O formato (extremamente comum) 1 Q7.8: Como a posição do ponto binário é inteiramente conceitual, a lógica para adicionar e subtrair números de ponto fixo é idêntica à lógica necessária para adicionar e subtrair números inteiros. Assim, ao adicionar uma metade mais uma metade no formato Q3.4, esperamos ver: Qual é igual a um como seria de esperar. Isso se aplica igualmente à subtração. Em outras palavras, quando adicionamos ou subtraímos números de ponto fixo, o ponto binário na soma (ou diferença) será localizado exatamente no mesmo lugar que nos dois números em que estamos operando. Ao multiplicar dois números de ponto fixo de 8 bits, precisamos de 16 bits para armazenar o produto. Claramente, uma vez que há um número diferente de bits no resultado em comparação com as entradas, o ponto binário deve ser esperado para se mover. No entanto, ele funciona exatamente da mesma maneira em binário como faz em decimal. Quando multiplicamos dois números em decimal, a localização do ponto decimal é N dígitos à esquerda do dígito mais à direita do produto, onde N é a soma do número de dígitos localizados no lado direito do ponto decimal no multiplicador eo multiplicando . Assim, no decimal quando multiplicamos 0,2 vezes 0,02, obtemos: O multiplicador tem um dígito à direita do ponto decimal eo multiplicando tem dois dígitos à direita do ponto decimal. Assim, o produto tem três dígitos à direita do ponto decimal (que é dizer, o ponto decimal está localizado três dígitos para a esquerda). Funciona da mesma forma em binário. Do exemplo de adição acima, sabemos que a metade número no formato Q3.4 é igual a 0x8 em hexadecimal. Uma vez que 0x8 vezes 0x8 em hex é 0x0040 (também em hexadecimal), o resultado de ponto fixo também pode ser esperado para ser 0x0040 - desde que sabemos onde o ponto binário está localizado. Vamos escrever o produto em binário: Uma vez que tanto o multiplicador e multiplicando têm quatro bits à direita do ponto binário, a localização do ponto binário no produto é de oito bits para a esquerda. Assim, a nossa resposta é 00000000.01000000, que é, como seria de esperar, igual a um trimestre. Se quisermos que o formato da saída seja o mesmo que o formato da entrada, devemos restringir o intervalo das entradas para evitar o estouro. Para converter de Q7.8 de volta para Q3.4 é uma simples questão de mudar o direito produto por 4 bits. Os números de ponto fixo são frequentemente utilizados internamente em filtros digitais, incluindo filtros FIR e IIR. Há uma série de considerações práticas para implementar algoritmos FIR e IIR usando números de ponto fixo. 2 3 Muitos sistemas incorporados que produzem ondas senoidais, como geradores DTMF, armazenam uma tabela de seno na memória de programa. (Seu usado para aproximar as funções sine () e cosine () matemáticas). Uma vez que tais sistemas têm frequentemente quantidades muito limitadas de memória de programa, muitas vezes os números de ponto fixo são utilizados de duas maneiras diferentes quando essas tabelas são utilizadas: os valores armazenados nas tabelas e os brads usados ​​para indexar nestas tabelas. Valores armazenados na tabela de seno Editar Normalmente um quadrante das funções de seno e cosseno são armazenados nessa tabela. Normalmente, é um quadrante onde essas funções produzem valores de saída no intervalo de 0 a 1. Os valores nessas tabelas normalmente são armazenados como números de ponto fixo - freqüentemente números de 16 bits no formato não assinado Q0.16 ou números de 8 bits em Valores Q0.8 não assinados. Parece haver duas maneiras populares de lidar com o fato de que Q0.16 não pode exatamente lidar com 1.0, ele só lida com números de 0 a (1,0-2-16): (a) Escala por exatamente um poder de dois (neste caso 216 ), Como a maioria dos outros sistemas de ponto fixo, e substituir (grampo) valores muito grandes para armazenar como o maior valor que pode ser armazenado: por isso 0 é representado como 0, 0,5 representado como 0x8000, (1,0-2-16) representado como 0xFFFF e 1,0 truncado e também representado como 0xFFFF. 4 (b) Escala pelo maior valor possível (neste caso 0xFFFF), assim tanto os valores máximo e mínimo podem ser representados exatamente: então 0 é representado como 0, (1,0-2-16) representado como 0xFFFE e 1,0 é Representado exatamente como 0xFFFF. 5 Algumas pessoas desenham círculos bastante precisos e calculam seno e cosseno bastante precisos com uma spline de Bezier. A tabela torna-se 8 valores representando uma única curva de Bezier aproximando 18 de um círculo a uma precisão de cerca de 4 partes por milhão, ou 14 de um círculo para uma precisão de cerca de 1 parte em mil. Muitas pessoas preferem representar a rotação (como ângulos) em termos de voltas. A parte inteira das voltas diz quantas revoluções inteiras aconteceram. A parte fracionária das voltas, quando multiplicada por 360 (ou 1 2 8) usando aritmética de ponto fixo assinada, dá um ângulo válido na faixa de -180 graus (- radianos) a 180 graus (radianos). Em alguns casos, é conveniente usar multiplicação não assinada (em vez de multiplicação assinada) em um ângulo binário, o que dá o ângulo correto na faixa de 0 a 360 graus (2 radianos). A principal vantagem de armazenar ângulos como uma fração de ponto fixo de uma curva é a velocidade. Combinar algum ângulo de posição atual com algum ângulo incremental positivo ou negativo para obter a nova posição é muito rápido, mesmo em microcontroladores de 8 bits lentos: ele toma uma adição de número inteiro, ignorando o estouro. Outros formatos para armazenar ângulos requerem a mesma adição, além de casos especiais para lidar com os casos de borda de transbordar 360 graus ou underflowing 0 graus. Comparado ao armazenamento de ângulos em um formato de ângulo binário, armazenar ângulos em qualquer outro formato - como 360 graus para dar uma revolução completa, ou 2 radianos para dar uma revolução completa - inevitavelmente resulta em alguns padrões de bits dando ângulos fora desse intervalo, Exigindo etapas extras para reduzir o valor para o intervalo desejado, ou resulta em alguns padrões de bits que não são ângulos válidos em todos (NaN), ou ambos. Usando um formato de ângulo binário em unidades de voltas nos permite rapidamente (usando shift-e-máscara, evitando multiplicação) separar os bits em: bits que representam voltas inteiras (ignorado ao olhar para o seno do ângulo alguns sistemas nunca se preocupam em armazenar estes Bits em primeiro lugar) 2 bits que representam os bits de quadrante que são usados ​​diretamente para indexar na tabela de consulta bits de ordem inferior menos de um passo na tabela de índice (bits de acumulador de fase, ignorados ao procurar o seno do ângulo sem Interpolação) Os bits de fase de baixa ordem proporcionam uma melhor resolução de freqüência, mesmo sem interpolação. Alguns sistemas usam os bits de baixa ordem para interpolar linearmente entre os valores na tabela. 12 Isso permite que você obtenha mais precisão usando uma tabela menor (economizando espaço de programa), sacrificando alguns ciclos neste cálculo de interpolação extra. Alguns sistemas obtêm ainda mais precisão usando uma tabela ainda menor, sacrificando alguns ciclos mais para usar esses bits de baixa ordem para calcular a interpolação cúbica. 4 Talvez o formato de ângulo binário mais comum seja brads. Brads Edit Muitos sistemas embarcados armazenam o ângulo, a parte fracionária das voltas, em um formato de ângulo binário de um único byte. 13 Há várias maneiras de interpretar o valor nesse byte, que significam (mais ou menos) o mesmo ângulo: um ângulo em unidades de brads (radianos binários) armazenado como um inteiro não assinado de 8 bits, de 0 a 255 brads um Ângulo em unidades de brads armazenadas como um inteiro assinado de 8 bits, de -128 a 127 brads um ângulo em unidades de espiras, armazenado como uma virada fraccionada no formato não assinado Q0.8, de 0 a pouco menos de 1 volta completa um ângulo em unidades De voltas, armazenado como uma virada fracionária no formato assinado Q0.7 (), de -12 a pouco menos de 12 turno completo Um turno completo 14 é 256 brads 15 é de 360 ​​graus. Se um único byte não dá precisão suficiente, o sistema brad pode ser facilmente estendido com mais bits fracionários - 65.536 contagens por turno pode ser representado em 16 bits. 16 Para mais leituras EditDecimal para Floating-Point Converter Sobre o Decimal para Floating-Point Converter 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 única e precisão dupla mais próximo, usando o arredondamento redondo-meio-para-igual (o modo de arredondamento padrão IEEE). Ele é implementado com aritmética de precisão arbitrária, de modo que suas conversões são arredondadas corretamente. Converte os números normais e subnormais, e converterá os números que transbordam (para o infinito) ou underflow (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 um decimal normalizado vezes um poder 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ê esperaria. Dentro do computador, a maioria dos números com um ponto decimal só pode ser aproximado outro número, apenas um pouco mais longe do que você quer, deve estar em para ele. Por exemplo, em ponto flutuante de precisão simples, 0.1 torna-se 0.100000001490116119384765625. Se o seu programa está imprimindo 0.1, ele está mentindo para você se ele está imprimindo 0.100000001, it8217s ainda está mentindo, mas pelo menos it8217s dizendo que você realmente don8217t tem 0.1. Como usar este conversor Digite um número positivo ou negativo, seja na forma 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 use 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 você deseja escolher Dupla. Solteiro . ou ambos. (Double é o padrão.) Double significa um significand de 53 bits (menos se subnormal) com um expoente de 11 bits Single significa um significand de 24 bits (menos se subnormal) com um expoente de 8 bits. Marque as caixas para qualquer formato de saída que você deseja escolher um ou todos os dez. (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. Há dez formas de saída para escolher: Decimal. Exibir o número de ponto flutuante em decimal. (Expanda 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. (Expanda a 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 a notação científica normalizada. (Expandir caixa de saída, se necessário, para ver todos os dígitos.) Normalizado binário notação científica. Exibir o número de ponto flutuante em binário, mas de forma compacta, usando a notação científica binária normalizada. Nota . Os números subnormais são mostrados normalizados, com seu expoente real. Números 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 uma potência de dois. Decimal inteiro vezes um poder de dois. Exibir o número de ponto flutuante como um inteiro decimal vezes 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.) Esta forma é muito interessante para expoentes negativos, uma vez que representa o número de ponto flutuante como uma fração diádica. Decimal inteiro vezes um poder de dez. Exibir o número de ponto flutuante como um inteiro decimal vezes uma potência de dez. Esta forma é muito interessante para expoentes negativos, uma vez que 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.) Hexadecimal ponto flutuante constante. Exibir o número de ponto flutuante como uma constante de ponto flutuante hexadecimal. Nota . Há muitas maneiras de formatar constantes de ponto flutuante hexadecimais, como você veria se, por exemplo, você comparasse a saída dos programas Java, Visual C, gcc C e Python. As diferenças em várias línguas são superficiais, embora 8212 zeros à direita podem ou não ser mostrados, expoentes positivos podem ou não ter um sinal de mais, etc. Este conversor formata as constantes sem zeros à direita e sem sinais de adição. Nota . Como muitas linguagens de programação, este conversor mostra números subnormais não normalizados, com seus expoentes definidos para o expoente normal mínimo. Nota . O último dígito hexadecimal em uma constante hexadecimal de ponto flutuante pode ter 0s binários à direita dentro deste doesn8217t necessariamente implica que esses bits existem no formato IEEE selecionado. Binário bruto. Exibir o número de ponto flutuante em seu formato IEEE bruto (bit de sinal seguido pelo campo exponente seguido pelo campo significand). Formato hexadecimal bruto. Exibir 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 mais detalhes sobre estes formulários de saída.) Existem dois sinalizadores de saída: Inexact. Se marcada, isso mostra que a conversão era inexata, ou seja, tinha que ser arredondada 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 dizer.) Observação. Este conversor sinalizadores estouro para infinito e underflow para zero como inexata. Subnormal. Se marcado, isso mostra que o número era muito pequeno e convertido com menos de precisão total (a real precisão é 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 grande algoritmo baseado em números inteiros que descrevo no meu artigo ldquoCorrect Decimal To Floating-Point Using Big Integers rdquo. I8217ve implementado usando BCMath. Por razões práticas, Ive definir um arbitrário (um pouco) limite sobre o comprimento da entrada decimal you8217ll obter uma mensagem de erro se você acertá-lo. Isso filtra os insumos que, de outra forma, iriam transbordar para o infinito ou subfluxo para zero, mas também impedirá que você entre em alguns casos de arredondamento 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 extenso teste).Binary Fractions While they work the same in , As frações binárias são diferentes das frações decimais em que números eles podem representar com precisão com um dado número de dígitos e, portanto, também em que números resultam em erros de arredondamento: Especificamente, binário só pode representar esses números como uma fração finita onde o denominador é Uma potência de 2. Infelizmente, isso não inclui a maioria dos números que podem ser representados como fração finita na base 10, como 0,1. Arredondado para 4 dígitos Valor arredondado como fração E é assim que você já obtém um erro de arredondamento quando você apenas anotar um número como 0,1 e executá-lo através do seu intérprete ou compilador. Não é tão grande quanto 380 e pode ser invisível porque os computadores cortados após 23 ou 52 dígitos binários ao invés de 4. Mas o erro está lá e irá causar problemas, eventualmente, se você simplesmente ignorá-lo. Por que usar Binário No nível mais baixo, os computadores são baseados em bilhões de elementos elétricos que têm apenas dois estados, (geralmente baixa e alta tensão). Ao interpretar estes como 0 e 1, é muito fácil de construir circuitos para armazenar números binários e fazer cálculos com eles. Embora seja possível simular o comportamento de números decimais com circuitos binários, bem, o seu menos eficiente. Se os computadores usassem números decimais internamente, eles teriam menos memória e seriam mais lentos no mesmo nível de tecnologia. Como a diferença de comportamento entre números binários e decimais não é importante para a maioria das aplicações, a escolha lógica é construir computadores com base em números binários e viver com o fato de que alguns cuidados e esforços extras são necessários para aplicativos que exigem comportamento decimal. The Floating-Point Guide Página Inicial Referências Básicas Referências xkcd Formatos Numéricos

No comments:

Post a Comment