Wednesday 24 May 2017

Opções De Ponto Representação De Ponto Fixo Binário


Ponto flutuanteFixed-Point Numbers Os números fixos do ponto 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 costosos e costosos que processam mídia de transmissão mais rápida do que qualquer unidade de ponto flutuante já construída para microcontroladores de extrema extremidade ). 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 base-ten, mas como isso é binário em vez 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, nós imaginamos, ou assumimos, que o ponto binário reside em uma localização fixa 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 fracionada. 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 e o 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 fracionada do número. Porque 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 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, portanto, 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: 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 manter 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 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 dos produtos, onde N é a soma do número de dígitos localizados no lado direito do ponto decimal no multiplicador e no 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 (ou seja, o ponto decimal está localizado a três dígitos para a esquerda). Funciona o mesmo 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 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, nossa resposta é 00000000.01000000, que é, como seria de esperar, igual a um quarto. Se queremos que o formato da saída seja o mesmo que o formato da entrada, devemos restringir o alcance das entradas para evitar transbordamentos. Para converter de Q7.8 de volta para Q3.4 é uma simples questão de mudar o produto direito 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 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), de modo que ambos 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 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 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 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 abaixo de 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 que dão ângulos fora desse intervalo, Exigindo etapas extras para reduzir o valor no intervalo desejado ou resulta em alguns padrões de bits que não são ângulos válidos (NaN) ou ambos. O uso de um formato de ângulo binário em unidades de voltas nos permite rapidamente (usando shift-and-mask, evitando multiplicar) separar os bits em: bits que representam turnos inteiros (ignorados ao procurar 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 os 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 (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 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 leitura adicional Edit3.7. Ponto Fixo Binário Um sistema de ponto fixo binário é outro exemplo de um sistema numérico arábico. A única distinção de decimal é a raiz. O binário usa uma base de 2 em vez de 10. Especificamos a base (base) usando um subscrito no número. De agora em diante, não assumimos uma base de 10. 1001.101 2 1 2 3 0 2 2 0 2 1 1 2 0 1 2 -1 0 2 -2 1 2 -3 Uma maneira fácil de ler binário é trabalhando na esquerda e A partir do ponto binário, duplicando ou reduzindo para metade o valor dos dígitos em cada etapa: Os dígitos usados ​​em qualquer sistema árabe sempre variam de 0 a radix-1. O uso de dígitos maiores permitiria representar um valor em mais de uma maneira. Por exemplo, se o ponto fixo binário permitiu o uso do dígito 2, então o número dois poderia ser representado como 2 ou 10. 3.7.1.Limitações do Conversor Binário 110 para binário. Não pode ser feito: como tentar representar 13 em decimal. Requer um número infinito de dígitos. Este é um problema para cálculos monetários. No meu post anterior, aprendemos os conceitos fundamentais de como o binário poderia ser usado para representar números reais (ou seja, números com um número fracionário de números de ponto fixo e ponto flutuante) componente). Quando se trata de armazenar estes números, existem duas abordagens principais na computação moderna. Estas são notação de ponto fixo e notação de ponto flutuante. No borne de hoje, nós continuamos a construir nosso conhecimento da informática do fundo e olhar os detalhes destes formatos do armazenamento. Este conhecimento será útil nas próximas mensagens quando mergulharmos em Tipos de Dados, os blocos de construção fundamentais de uma aplicação iOS. Como aprendemos na minha última publicação, os números binários fracionados têm duas partes, os bits que representam o número inteiro (a parte anterior ao ponto de base) e os bits que representam a parte fracionada (a parte após o ponto de base). Pense nisso. E se tivéssemos apenas um número limitado de bits binários para armazenar nosso número binário fracionário Isso é comum em muitos sistemas de computadores modernos, como saberemos quantos bits usar para a parte inteira e quantos bits usar Para a parte fracionária Este é o problema que tanto as representações de ponto fixo quanto as declarações de pontos flutuantes tentam resolver. Para começar então, dê uma olhada na notação de ponto fixo. É a mais simples das duas representações. A notação de Ponto Fixo de Representação de Ponto Fixo é uma representação do nosso número fracionário, pois está armazenado na memória. Na notação de ponto fixo, o número é armazenado como um inteiro assinado em dois complementam formato. Além disso, aplicamos uma divisão nocional, localizando o ponto de radix (o separador entre partes inteiras e fracionadas) um número fixo de bits à esquerda de sua posição de inicialização de classificação à direita do bit menos significativo. Ive ilustrado isso no diagrama abaixo. Quando interpretamos os bits do inteiro assinado armazenados na memória, reposicionamos o ponto de radiação multiplicando o número inteiro armazenado por um fator de escala fixo. O fator de escala em binário é sempre 2 elevado para um expoente fixo. Como o fator de escala é uma potência de 2, ele desloca o ponto de base para alguns lugares à esquerda ou à direita da sua posição inicial. Durante esta conversão há três direções que o ponto de raiz pode ser movido: O ponto de raiz é movido para a direita: Isto é representado por um fator de escala cujo expoente é 1 ou mais. Nesse caso, zeros adicionais são acrescentados à direita do bit menos significativo e significa que o número real que está sendo representado é maior que o inteiro binário que foi armazenado. O ponto radix permanece onde está: Isto é representado por um fator de escala cujo expoente é 0 e significa que o valor inteiro armazenado é exatamente o mesmo que o valor inteiro que está sendo representado. O ponto de raiz é movido para a esquerda: Isto é representado por um fator de escala cujo expoente é negativo. Isso significa que o número representado é menor que o número inteiro que foi armazenado e significa que o número representado possui um componente fracionário. Vamos dar uma olhada em alguns exemplos. Exemplos de números de pontos fixos Vamos supor que temos um número binário assinado de 8 bits 00011011 2 que é armazenado na memória usando 8 bits de armazenamento (daí os zeros à esquerda). Em nosso primeiro cenário, vamos também assumir que este número foi armazenado como uma assinado ponto fixo representação com um fator de escala de 2 2. Como nosso fator de escala é maior que 1, quando traduzimos os bits armazenados na memória para o número que estamos realmente representando, movemos o ponto raiz dois lugares para a direita. Isso nos dá o número: 1101100 2 (Observe os zeros adicionais que são anexados à direita do bit menos significativo). Em nosso segundo cenário, vamos supor que começamos com o mesmo número binário na memória, mas desta vez bem assumir que ele é armazenado como uma assinado ponto fixo representação com um fator de escala de 2 -3. Como o expoente é negativo, movemos o ponto de raiz três lugares para a esquerda. Isso nos dá o número 00011.011 2 Vantagens e desvantagens da representação de ponto fixo A principal vantagem de usar uma representação de ponto fixo é o desempenho. Como o valor armazenado na memória é um número inteiro, a CPU pode tirar proveito de muitas das otimizações que os computadores modernos têm para executar a aritmética de números inteiros sem ter que confiar em lógica de hardware ou software adicional. Isso, por sua vez, pode levar a aumentos no desempenho e ao escrever seus aplicativos, pode, portanto, levar a uma experiência aprimorada para seus usuários. No entanto, há uma desvantagem Fixed Point Representações têm uma gama relativamente limitada de valores que eles podem representar. Então, como podemos resolver os números máximos e mínimos que podem ser armazenados em uma representação de ponto fixo e determinar se é adequado para nossas necessidades Tudo o que fazemos é ter os maiores e menores valores inteiros que podem ser armazenados no número dado de Bits e multiplique isso pelo fator de escala associado à nossa representação de ponto fixo. Para um determinado número binário assinado usando b bits de armazenamento com um fator de escala de f os valores máximo e mínimo que podem ser armazenados são: Se o número que você deseja representar se encaixa neste intervalo, então as coisas são grandes. Notação de Ponto Flutuante A notação de Ponto Flutuante é uma alternativa à notação de Ponto Fixo e é a representação que a maioria dos computadores modernos usa ao armazenar números fracionários na memória . A notação de ponto flutuante é uma maneira de representar números muito grandes ou muito pequenos precisamente usando notação científica em binário. Ao fazer isso, a Representação de Ponto Flutuante fornece vários graus de precisão dependendo da escala dos números que você está usando. Por exemplo, o nível de precisão que precisamos quando falamos sobre a distância entre os átomos (10-10 m) é muito diferente da precisão que precisamos quando falamos sobre a distância entre a Terra e o Sol (10 11 m). Este é um grande benefício e permite que uma gama muito maior de números seja representada do que é possível na Notação de Ponto Fixo. A Representação de Ponto Flutuante é baseada na Notação Científica. Você pode ter usado Notação científica na escola. Quando usamos Notação Científica em decimal (a forma que você provavelmente está mais familiarizado com), escrevemos números da seguinte forma: - mantissa x 10 expoente Nesta forma, há um sinal opcional indicando se o número total é positivo ou negativo, seguido Por uma mantisa (também conhecida como significand), que é um número real (fracionário) que, por sua vez, é multiplicado por uma base numérica (ou raiz) criada por um expoente. Como sabemos, em decimal, esta base numérica é 10. Representação de ponto flutuante é essencialmente Notação científica aplicada a números binários. Em binário, a única diferença real é que a base do número é 2 em vez de 10. Portanto, escreveríamos Números de Ponto Flutuante da seguinte forma: - mantissa x 2 exponente Agora, você pode não ter percebido, mas quando escrevemos números em cientistas Notação (quer sejam binárias ou decimais), podemos escrevê-las de várias maneiras diferentes. Em decimal, podemos escrever 1.5 x 10 2. 15 x 10 1 e 150 x 10 0 e, no entanto, todos esses números têm exatamente o mesmo valor. Isso proporciona flexibilidade, mas com essa flexibilidade também vem a confusão. Para tentar resolver esta confusão, um conjunto comum de regras conhecido como notação científica normalizada é usado para definir como os números em notação científica são normalmente escritos. Notação científica normalizada A notação científica normalizada é uma nomenclatura que padroniza a forma como escrevemos números na notação científica. Na forma normalizada temos uma única regra chave: Escolhemos um expoente para que o valor absoluto da mantissa permaneça maior ou igual a 1 mas menor que a base do número. Vamos ver alguns exemplos Se tivéssemos o número decimal 50010 e quisemos escrevê-lo em notação científica, poderíamos escrevê-lo como 500 x 10 0 ou 50 x 10 1. Na forma normalizada, porém, aplicaríamos a regra acima e moveríamos o ponto de raiz de modo que somente um único dígito, maior ou igual a 1 e menor do que (neste caso) 10 estivesse à esquerda do ponto de raiz. Neste caso, isso significaria mover nosso ponto radix dois lugares para a esquerda, então nós tínhamos 5,0 x 10. Nós, então, precisaria trabalhar o nosso expoente. Para voltar ao nosso número original, precisamos mover nosso ponto de base para dois lugares à direita. Lembre-se do que aprendemos mais cedo Se tivermos que mover nosso ponto radix para o direito de voltar ao nosso número original, o que significa que o expoente é positivo. Isso nos dá: 5.0 x 10 2. Vamos ver um exemplo um pouco mais complicado, desta vez em binário. E se tivéssemos o número binário 10.1 2. O que isso seria em notação científica Novamente, aplicamos as regras: Precisamos ter uma mantisa maior ou igual a 1 e menor do que a nossa base de números (que dessa vez é 2). Isso significaria que nossa mantissa precisaria ser 1.01 x 2. Para voltar ao nosso número original, precisaríamos mover nosso ponto de raiz 1 para a direita. O que significa direito significa que o expoente é positivo. Último exemplo. Desta vez um que é um pouco mais complicado Imagine que eu tinha o número 0.111 2 e queria escrevê-lo na notação científica normalizada Novamente, aplicamos as regras. Precisamos de uma mantissa maior ou igual a 1 e menor que 2. Isso significa que queremos escrever nossa mantissa como 1,11 x 2. Agora, para voltar ao nosso número original, precisaríamos mover nosso ponto de raiz 1 lugar para a esquerda . O que aprendemos sobre mover para a esquerda Isso significa que nosso expoente é negativo. Isso nos dá: 1.11 x 2 -1. Representações IEEE 754 Como você provavelmente já funcionou, os números de Ponto Flutuante são usados ​​em todos os lugares na computação moderna. Se é a porcentagem do mercado que atualizou para a versão mais recente do iOS, a posição atual e orientação do seu iPhone no espaço ou a quantidade de dinheiro fluindo em sua conta bancária após o lançamento de seu aplicativo mais recente blockbuster Por causa de sua O formato usado para armazenar números de ponto flutuante na memória foi padronizado pelo Instituto de Engenheiros Elétricos e Eletrônicos em algo chamado IEEE 754. Este padrão define várias representações binárias diferentes que podem ser usadas ao armazenar números de ponto flutuante na memória: Half Precision 8211 Usa 16 bits de armazenamento no total. Single Precision 8211 Usa 32 bits de armazenamento no total. Double Precision 8211 Usa 64 bits de armazenamento no total. Quadruple Precision 8211 Usa 128 bits de armazenamento no total. Em cada um desses casos, sua estrutura básica é a seguinte: (-1) sign x mantissa x 2 expoente Quando se trata de armazenar Números de Ponto Flutuante na memória, apenas três partes críticas dessa estrutura básica são armazenadas: As peças são armazenadas na memória: Como eu sugeri acima, todas as quatro representações binárias definidas no padrão IEEE 754, têm o bit mais significativo como um bit de sinal e usá-lo para armazenar o sinal do número total. Em semelhante veia ao que vimos em posts anteriores, se o bit de sinal é claro (um valor de 0), o número global é positivo. Se o bit estiver configurado (um valor de 1), o número é negativo. O Exponente representa o poder ao qual a mantisa será levantada. Há sempre um número fixo de bits de expoente ao armazenar uma representação de ponto flutuante na memória eo número exato de bits que são usados ​​é definido pela representação IEEE 754 específica (Single Precision, Double Precision etc). Bem, dê uma olhada nisso em breve. Em todos os casos, os expoentes em cada uma dessas representações precisam ser capazes de representar ambos os expoentes positivos (para representar números muito grandes) e expoentes negativos (para representar números muito pequenos). Para evitar as complicações de ter que armazenar os expoentes em formato de complemento duplo, é usado algo chamado de viés de expoente. Exponent Bias Exponent Bias é onde o valor armazenado para o expoente é deslocado do valor do expoente real por um viés. O viés é simplesmente um número que é adicionado ao expoente para garantir que o valor que está armazenado seja sempre positivo. A tabela abaixo mostra o número de bits usados ​​para o expoente em cada um dos formatos, o intervalo permitido de valores que os diferentes expoentes podem ter antes de aplicar o viés juntamente com os valores permitidos após a aplicação do viés: Além desses formatos, o IEEE O padrão 754 também define uma série de símbolos numéricos que também vale a pena conhecer. Bem, explore estes brevemente na próxima seção. Valores especiais que representam Zero Como vimos, quando representamos números no ponto flutuante e armazenando-os na memória, nós escrevemos nossos números em uma forma normalizada antes de deixar cair o bit set implícito antes do ponto de radix. Quando os números na memória são interpretados, o bit implícito é reinstalado. Esta suposição implícita de que o bit imediatamente à esquerda do ponto de radix está configurado para 1 causa problemas. O que se queremos representar zero Para contornar esse problema, o padrão IEEE 754 define zero como um caso especial e representa-o usando um expoente de 0 e uma mantissa de 0. Devido ao bit de sinal ainda está disponível isso leva a valores De -0 e 0 o padrão define que eles devem comparados como iguais. Forma Denormalized O IEEE 754 também permite a representação de números em uma forma desnormalizada. Se os bits no expoente são todos zeros, mas a mantissa é valor diferente de zero, o número é dito ser armazenado em uma forma desnormalizada. Neste caso, quando o número na memória é interpretado, a suposição de que há um bit definido para a esquerda do ponto raiz é novamente ignorado. Isso leva a números na forma: Onde s é o sinal e f é a parte fracionada da mantisa. O padrão IEEE também define um mecanismo para representar o infinito. O Infinito é representado por um expoente com todos os bits configurados e uma mantisa com todos os bits apagados. Mais uma vez, o bit de sinal permanece em vigor, o que leva ao conceito de infinito e infinito. Não um número (NaN) A última coisa que é de interesse no padrão IEEE é o conceito de não um número (NaN). Isso é usado para representar um número que não é um número real. Isso é representado na memória por um expoente com todos os bits configurados e uma mantisa não-zero. Mais comumente você verá isso relatado pelo seu compilador, geralmente quando você tentou dividir algo por zero. Resumo dos valores especiais Em resumo, a tabela abaixo mostra os diferentes valores do expoente e da mantisa e os valores especiais que estão sendo representados conforme definido pelo padrão IEEE 754: Introdução à representação do número do ponto fixo Na vida real, lidamos com o real Números - números com parte fracionária. O computador mais moderno possui suporte nativo (hardware) para números de ponto flutuante. No entanto, o uso de ponto flutuante não é necessariamente a única maneira de representar números fracionários. Este artigo descreve a representação em ponto fixo de números reais. O uso de tipo de dados de ponto fixo é amplamente utilizado no processamento de sinal digital (DSP) e aplicativos de jogos, onde o desempenho às vezes é mais importante do que a precisão. Como veremos mais adiante, a aritmética do ponto fixo é muito mais rápida do que a aritmética de ponto flutuante. Lembre-se que um número binário: representa o valor: 1 2 5 1 2 4 0 2 3 1 2 2 0 2 1 1 2 0 Agora, se dividir o número 53 por 2, sabemos que o resultado deve ser 26,5. No entanto, como podemos representá-lo se tivéssemos apenas representações inteiras A chave para representar números fracionários, como 26.5 acima, é o conceito de ponto binário. Um ponto binário é como o ponto decimal em um sistema decimal. Ele age como um divisor entre o número inteiro ea parte fracionária de um número. Em um sistema decimal, um ponto decimal denota a posição em um número que o coeficiente deve multiplicar por 10 0 1. Por exemplo, no numeral 26.5, o coeficiente 6 tem um peso de 10 0 1. Mas o que acontece com o 5 para O direito do ponto decimal Sabemos por nossa experiência que ele carrega um peso de 10 -1. Conhecemos o número quot26.5quot representa o valor quottwenty seis e meioquote porque 2 10 1 6 10 0 5 10 -1 26.5 O mesmo conceito de ponto decimal pode ser aplicado à nossa representação binária, fazendo um quotbinary pointquot. Como no sistema decimal, um ponto binário representa o coeficiente do termo 2 0 1. Todos os dígitos (ou bits) à esquerda do ponto binário carregam um peso de 2 0. 2 1. 2 2. e assim por diante. Os dígitos (ou bits) à direita do ponto binário carregam um peso de 2 -1. 2-2. 2 -3. e assim por diante. Por exemplo, o número: representa o valor: Agora, lembre-se na classe, discutimos deslocando um inteiro para a direita por 1 bit posição é equivalente a dividir o número por 2. No caso de inteiro, uma vez que não temos uma parte fracionária , Simplesmente não podemos representar um dígito à direita de um ponto binário, tornando este processo de mudança uma divisão de números inteiros. No entanto, é simplesmente uma limitação de representações inteiras de número binário. Em geral, matematicamente, dada uma posição de ponto binário fixo, mudar o padrão de bits de um número para a direita em 1 bit sempre divide o número em 2. De forma semelhante, mudar um número para a esquerda por 1 bit multiplica o número em 2. O O processo de mudança acima é a chave para entender a representação do número do ponto fixo. Para representar um número real em computadores (ou qualquer hardware em geral), podemos definir um tipo de número de ponto fixo simplesmente fixando implicitamente o ponto binário para estar em alguma posição de um número. Iremos simplesmente aderir a esta convenção implícita quando representamos números. Para definir um tipo de ponto fixo conceitualmente, tudo o que precisamos são dois parâmetros: largura da representação do número e posição do ponto binário dentro do número. Usaremos a notação fixltw, bgt para o resto deste artigo, onde w denota o número de bits Usado como um todo (a Largura de um número), e b denota a posição de contagem de pontos binários a partir do bit menos significativo (contando a partir de 0). Por exemplo, fixedlt8,3gt denota um número de ponto fixo de 8 bits, dos quais 3 bits mais à direita são fracionários. Portanto, o padrão de bits: olhando para esta tabela, podemos facilmente perceber que podemos representar o número -2.5 com o padrão de bits quot1011quot, se assumirmos que o ponto binário está na posição 1. Até agora, você deve achar que os números fixos são De fato, um parente próximo da representação de inteiros. Os dois só diferem na posição de ponto binário. Na verdade, você pode até considerar a representação de números inteiros como uma referência quotíssima de números de pontos fixos, onde o ponto binário está na posição 0. Todas as operações aritméticas que um computador pode operar em inteiro podem, portanto, ser aplicadas também ao número de ponto fixo. Portanto, o benefício da aritmética de ponto fixo é que eles são tão diretos e eficientes quanto a aritmética de inteiros em computadores. Podemos reutilizar todo o hardware construído para a aritmética de números inteiros para realizar aritmética de números reais usando a representação de ponto fixo. Em outras palavras, a aritmética de ponto fixo vem gratuitamente em computadores. A desvantagem do número de ponto fixo é, naturalmente, a perda de alcance e precisão quando comparada com representações de número de ponto flutuante. Por exemplo, em uma representação fixa de 8,1 gt, nossa parte fracionária é apenas precisa para um quantum de 0,5. Não podemos representar números como 0,75. Podemos representar 0,75 com fixlt8,2gt. Mas então nós perdemos a escala na parte inteira. C não tem quottypequot nativo para número de ponto fixo. However, due to the nature of fixed point representation, we simply dont need one. Recall all arithmetics on fixed point numbers are the same as integer, we can simply reuse the integer type int in C to perform fixed point arithmetic. The position of binary point only matters in cases when we print it on screen or perform arithmetic with different quottypequot (such as when adding int to fixedlt32,6gt ). Fixed point is a simple yet very powerful way to represent fractional numbers in computer. By reusing all integer arithmetic circuits of a computer, fixed point arithmetic is orders of magnitude faster than floating point arithmetic. This is the reason why it is being used in many game and DSP applications. On the other hand, it lacks the range and precision that floating point number representation offers. You, as a programmer or circuit designer, must do the tradeoff.

No comments:

Post a Comment