Thursday 28 September 2017

Float Point Number Representation Binary Options


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 assumir 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 do número inteiro e 16 bits para A parte fracionária. Observe que o bit mais significativo no campo do 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 estamos armazenando toda a parte e a parte fracionada em diferentes locais de armazenamento, 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, no entanto, que quanto mais precisão tivermos, menor será o alcance total que temos. Há uma série de padrões, mas neste livro usaremos n para a largura de um número de ponto fixo, p para a precisão e R para o alcance 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 inteira (X) em um formato Qm. n de um número flutuante (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: uma vez que a posição do ponto binário é inteiramente conceitual, a lógica para adicionar e subtrair números do ponto fixo é idêntica à lógica necessária para adicionar e subtrair inteiros. Assim, ao adicionar uma metade mais uma metade no formato Q3.4, esperamos ver: o que é igual a um como seria de esperar. Isso se aplica igualmente à subtração. Em outras palavras, quando adicionamos ou subtraimos 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 se mover. No entanto, ele funciona exatamente da mesma maneira em binário como ele 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, em decimal quando multiplicamos 0,2 vezes 0,02, obtemos: o multiplicador tem um dígito à direita do ponto decimal, e o multiplicand 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. A partir do exemplo de adição acima, sabemos que a metade do meio no formato Q3.4 é igual a 0x8 em hexadecimal. Uma vez que 0x8 vezes 0x8 em hexadecimal é 0x0040 (também em hexadecimal), o resultado do ponto fixo também pode ser esperado para ser 0x0040 - enquanto sabemos onde o ponto binário está localizado. Permite escrever o produto em binário: uma vez que tanto o multiplicador quanto o multiplicand 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, nossa resposta é 00000000.01000000, que é, como seria de esperar, igual a um quarto. 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. Existem várias considerações práticas para implementar algoritmos FIR e IIR usando números de ponto fixo. 2 3 Muitos sistemas incorporados que produzem ondas de seno, como geradores de DTMF, armazenam uma tabela de seno na memória do programa. (É usado para aproximar as funções matemáticas seno () e coseno (). Uma vez que esses sistemas geralmente possuem quantidades muito limitadas de memória do programa, muitas vezes os números de pontos fixos são usados ​​de duas maneiras diferentes quando essas tabelas são usadas: os valores armazenados nas tabelas e os brads usados ​​para indexar essas tabelas. Valores armazenados na tabela de seno Editar Normalmente, um quadrante das funções seno e coseno é armazenado nessa tabela. Normalmente, é um quadrante em que essas funções produzem valores de saída no intervalo de 0 a 1. Os valores em tais tabelas geralmente são armazenados como números de ponto fixo - freqüentemente números de 16 bits no formato Q0.16 não assinado 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ó manipula 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 valores (clipe) muito grandes para armazenar como o maior valor que pode ser armazenado: então 0 é representado como 0, 0,5 representado como 0x8000, (1,0-2-16) representado como 0xFFFF e 1.0 truncados e também representados como 0xFFFF. 4 (b) Escala pelo maior valor possível (neste caso 0xFFFF), para que os valores máximo e mínimo possam 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 o seno e o cosseno bastante precisos com uma spline Bezier. A tabela torna-se 8 valores que representam uma única curva de Bezier aproximando 18 de um círculo para 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. 6 7 Muitas pessoas preferem representar rotação (como ângulos) em termos de turnos. A parte inteira das voltas diz quantas revoluções inteiras aconteceram. A parte fracionada das voltas, quando multiplicada por 360 (ou 1 2 8) usando a aritmética de ponto fixo assinada padrão, dá um ângulo válido na faixa de -180 graus (- radianos) para 180 graus (radianos). Em alguns casos, é conveniente usar a multiplicação não assinada (em vez da multiplicação assinada) em um ângulo binário, que dá o ângulo correto na faixa de 0 a 360 graus (2 radianos). A principal vantagem para armazenar ângulos como uma fração de ponto fixo de uma volta é a velocidade. Combinando 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 lentos de 8 bits: ele requer uma única 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 pesquisa bits de baixa ordem 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 resolução de freqüência melhorada, mesmo sem interpolação. Alguns sistemas usam os bits de baixa ordem para interpolar linearmente entre valores na tabela. 12 Isso permite que você obtenha mais precisão usando uma tabela menor (poupando espaço no programa), sacrificando alguns ciclos nesse cálculo de interpolação extra. Alguns sistemas obtêm ainda mais precisão usando uma tabela ainda menor sacrificando mais alguns ciclos 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 incorporados armazenam o ângulo, a parte fracionada das voltas, em um formato de ângulo binário de byte único. 13 Existem várias formas de interpretar o valor nesse byte, o que significa (mais ou menos) o mesmo ângulo: um ângulo em unidades de brads (radios binários) armazenados como um inteiro não assinado de 8 bits, de 0 a 255 brads e Ângulo em unidades de brads armazenadas como um inteiro assinado de 8 bits, de -128 a 127 brads um ângulo em unidades de voltas, armazenadas como uma rotação fracionada no formato Q0.8 não assinado, 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 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 que I8217ve discutimos no meu site.) Para todas as entradas que são aceitas no entanto, a saída está correta (apesar de todos os erros que escapam meus testes extensivos). Semelhante a números binários decimais podem ter representação Também flutua. Agora eu leio que pode ter flutuadores do tipo 0,5. 0,1. 0,25. 0,01. 0,125. 0.001. e assim por diante. Mas, por exemplo, como é o 0.1 (em decimal) representado em binário também, dado um flutuador decimal, como convertê-lo para o equivalente decimal, (dado que não é tão direto). Editar: Então eu entendo que a melhor pergunta seria como converter um flutuador decimal em binário. Agora eu entendo que multiplicamos a parte decimal, até que ele se torne zero. Agora, é muito possível que dois pontos flutuantes possam ter a mesma representação correu, perguntou em 12 de dezembro às 19:41 Sahil: Quando os números são convertidos em ponto flutuante (como analisando uma seqüência contendo um número e convertendo-o em ponto flutuante) Números diferentes podem produzir o mesmo resultado. É impreciso dizer que o resultado de ponto flutuante representa esses números. Por padrão IEEE 754, um valor de ponto flutuante representa exatamente um número, o que você obtém ao interpretar sua codificação conforme especificado no padrão. Você pode dizer que dois números diferentes podem ter a mesma aproximação em ponto flutuante, mas é importante lembrar que é apenas uma aproximação. Ndash Eric Postpischil Dec 1 12 at 23:10 Outra observação que poderia ser útil. A parte inteira de um número de ponto flutuante está presente no binário na sua forma normal, por exemplo, se o valor for 25.7482 você terá os bits 11001 (25) no ponto flutuante, com os bits seguintes representando a fração (na verdade, o primeiro 1 nunca é armazenado, está implícito no formato). Se você subtrair 25.0 desse número e multiplicar por 10, você obtém 7.482 e, ao examinar a parte inteira desse valor, você pode obter o primeiro dígito fracionário, 7. Subtrair 7.0, multiplicar por 10, dá 4.82. Portanto, o próximo dígito 4, e assim por diante. Esse processo, na teoria, acabará eventualmente com um resultado zero, uma vez que todos os valores que podem ser exatamente representados no formato de ponto flutuante têm uma representação decimal exata no entanto, esse resultado exato poderia ter muito mais dígitos do que realmente razoáveis, dada a precisão do original Ponto flutuante (e você pode precisar de uma precisão extra internamente para obter esse resultado totalmente exato, de qualquer forma - você precisa garantir que a multiplicação por 10 não gere um erro de arredondamento). E, para números como 6.432e-200, este método é viável, mas não muito eficiente (você estará gerando 199 zeros antes dos primeiros 6 surgiram). Respondido 22 de dezembro 12 às 19: 44 Fracções binárias Enquanto eles funcionam o mesmo em princípio, as frações binárias são diferentes das frações decimais em que números eles podem representar com precisão com um determinado número de dígitos e, portanto, também em que números resultam em erros de arredondamento: especificamente , O binário só pode representar esses números como uma fração finita onde o denominador é um poder 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ê simplesmente anotou 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 são cortados após 23 ou 52 dígitos binários em vez de 4. Mas o erro está lá e causará problemas, eventualmente, se você simplesmente ignorar. 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. Uma vez que 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 é criar computadores com base em números binários e viver com o fato de que alguns cuidados e esforços adicionais são necessários para aplicativos que requerem comportamento semelhante a decimal. O Guia de Ponto Flutuante Início Respostas Básicas Referências Formatos de número xkcd

No comments:

Post a Comment