Wednesday, 9 August 2017

Opções De Flutuação Notação De Ponto Binário


As frações binárias Enquanto trabalham 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 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. O ponto flutuante obtém em torno das limitações de ponto fixo, usando um formato semelhante à notação científica. Um número de notação científica, como você provavelmente sabe, consiste em uma mantissa (3.52 no exemplo acima) uma raiz (sempre 10), e um expoente (3 no exemplo acima). Portanto, o formato geral de um valor de notação científica é: mantissa x radix expoente A forma normalizada sempre tem uma mantissa maior ou igual a 1,0 e menor que 10,0. Podemos desnormalizar o valor e expressá-lo de muitas outras maneiras, como 35,2 x 10 2 ou 0,00325 x 10 0. Para cada posição, deslocamos os dígitos da mantissa em relação ao ponto decimal, aumentamos ou diminuímos o valor do Mantissa por um fator de 10. Para compensar isso, simplesmente aumentamos ou diminuimos o expoente por 1. A desnormalização é necessária quando se adicionam valores de notação científica: Ajustar a mantissa e o expoente também é algumas vezes necessário para normalizar os resultados. Por exemplo, 9.9 x 10 2 9.9 x 10 2 é 19.8 x 10 2. que deve ser normalizado para 1.98 x 10 3. Um sistema flutuante binário armazena uma mantissa binária assinada e um expoente binário assinado, e geralmente usa uma base de 2. Usando uma raiz de 2 (ou qualquer potência de 2) nos permite normalizar e desnormalizar deslocando os dígitos binários na mantissa e ajustando o expoente inteiro na raiz de 2. (Deslocando dígitos binários nos bits mantissa n para a esquerda ou Direita multiplica ou divide a mantissa por 2 n.) 00010 2 x 2 3 01000 2 x 2 1. Os formatos de ponto flutuante padrão são definidos pela sociedade IEEE. Os formatos IEEE são ligeiramente mais complexos que necessários para compreender o ponto flutuante em geral, por isso vamos começar com um exemplo mais simples aqui. 3.10.2.Um formato de ponto flutuante simples Suponha que um formato de ponto flutuante de 32 bits tenha uma mantissa complementar de dois bits de 24 bits, um expoente complementar de dois bits de 8 bits e uma base de 2. A estrutura geral é: expoente mantissa x 2 Onde Mantissa é um número de complemento de 24 bits, e o expoente é um inteiro de complemento de dois bits de 8 bits. O formato binário é o seguinte: Table3.3.Floating Point Format Qual é o valor do seguinte número A mantissa é 000000000000000000010010, ou (2 16) 18. O expoente é 11111100 - (00000011 1) -00000100 -4. O valor é, portanto, 18 x 2 -4 Qual é o maior valor positivo que podemos representar neste sistema O maior valor positivo será composto pela maior mantissa positiva eo maior expoente positivo. A mantissa maior é 011111111111111111111111, que em dois complemento é 2 23-1 (8388607). O maior expoente é 01111111, que em dois complemento é 2 7 -1 (127). Portanto, o maior valor positivo é 8388607 x 2 127 1,42 x 10 45. Qual é o segundo maior valor positivo Qual é a diferença entre o maior eo segundo maior Qual é o menor valor positivo Para encontrar o menor valor positivo na forma mantissa x Radix. Escolhemos a menor mantissa positiva eo menor expoente negativo (o expoente negativo com a maior magnitude). Uma vez que a mantissa é um número inteiro, o menor valor positivo possível é 1. Uma vez que o expoente é um valor de complemento de dois bits de 8 bits, o menor expoente negativo é 10000000 2. De -2 7 -128. Assim, o menor valor positivo é 1 x 2 -128. Ou 2,93873587706 x 10 -39. Qual é o segundo menor valor positivo Qual é a diferença entre o menor eo segundo menor Representar -2.75 neste sistema de ponto flutuante. Converter o número para o binário de ponto fixo usando os métodos descritos nas seções anteriores: Multiplicar por radix expoente igual a 1: Shift O ponto binário para fazer a mantissa um número inteiro: - (1011 2) Movendo o ponto binário dois lugares para a direita, multiplicamos a mantissa por 2 2. Portanto, devemos dividir (radix expoente) pelo mesmo fator: Mantissa: - (000000000000000000001011) 111111111111111111110101 Exponente: -2 10 11111110 Representação binária 11111111111111111111010111111110 Quantos valores diferentes este sistema pode representar 3.10.3.Overflow e Underflow O estouro ocorre quando o parâmetro Resultado de uma operação de ponto flutuante é maior do que o maior valor positivo ou menor do que o menor valor negativo. Em outras palavras, a magnitude é muito grande para representar. Subfluxo ocorre quando o resultado de uma operação de ponto flutuante é menor que o menor valor positivo ou maior que o maior valor negativo. Em outras palavras, a magnitude é muito pequena para representar. O exemplo de formato de 32 bits acima não pode representar valores maiores que cerca de 10 45 ou menores que cerca de 10 -39. Uma técnica para evitar overflow e underflow é alternar as operações que aumentam e diminuem os resultados intermediários. Ao invés de fazer todas as multiplicações em primeiro lugar, o que poderia causar estouro, ou todas as divisões em primeiro lugar, o que poderia causar underflow, poderíamos alternar multiplicações e divisões para moderar os resultados ao longo do caminho. Técnicas como estas devem ser freqüentemente usadas em cálculos científicos complexos. 3.10.4.Custo de ponto flutuante Tudo tem um custo. O aumento da faixa e capacidade de representar números não-inteiros não é exceção. Existem apenas 2 32 padrões de 32 0s e 1s. Portanto, existem apenas 2 32 números únicos que podemos representar em 32 bits, independentemente do formato. Então, como é que podemos representar números até 10 45. Obviamente, devemos estar sacrificando algo no meio. O que o ponto flutuante faz para nós é espalhar o número limitado de padrões binários que temos disponíveis para cobrir uma maior gama de números. Quanto maior o expoente, maior a diferença entre números consecutivos que podemos representar com precisão. Perto de 0, podemos representar muitos números em um pequeno intervalo. Longe de zero, haverá toda uma gama de números inteiros que não podem ser representados. A precisão de um valor de ponto flutuante de 32 bits é menor que a precisão de um inteiro de 32 bits. Usando 8 bits para o expoente, sacrificamos esses 8 bits de precisão. Assim, nosso formato de exemplo tem a mesma precisão que um sistema de 24 bits assinado inteiro. Desempenho Aritmética em ponto flutuante é várias vezes mais lento do que em inteiros. Esta é uma propriedade inerente do formato. Considere o processo de adicionar dois valores de notação científica. Equalize os expoentes Adicione as mantissas Normalize o resultado Cada uma dessas operações leva aproximadamente a mesma quantidade de tempo em um computador como uma única adição de número inteiro. Uma vez que o ponto flutuante é armazenado como notação científica, podemos esperar que a adição de ponto flutuante leve cerca de três vezes, contanto que a adição de número inteiro. Na realidade, um PC típico leva cerca de 2,5 vezes o tempo para executar uma instrução aritmética de ponto flutuante como faz para fazer a mesma instrução inteira. Observe que isso se aplica somente às operações que podem ser realizadas usando uma instrução de inteiro único ou uma instrução de ponto flutuante. Por exemplo, suponha que um programa está sendo executado em um computador de 32 bits e não há nenhuma maneira de representar os dados dentro do intervalo de um inteiro de 32 bits. Neste caso, serão necessárias várias instruções inteiras para processar valores inteiros de mais de 32 bits, ea vantagem de velocidade de inteiros não se aplica. Também é possível em alguns sistemas que as operações de ponto flutuante e inteiros possam ocorrer ao mesmo tempo e, portanto, a utilização do hardware de ponto flutuante pode resultar em melhor desempenho do que executar operações inteiras adicionais enquanto a unidade de ponto flutuante fica ociosa. Este é o caso com renderização de gráficos que ocorre usando ponto flutuante na unidade de processamento gráfico (GPU) em vez da CPU. Não faria sentido mover os cálculos de renderização para a CPU para usar números inteiros, pois isso só aumentaria a carga de trabalho da CPU e permitiria que o poder da GPU fosse desperdiçado. Se o hardware tiver suporte de ponto flutuante integrado, então operações comuns como adição de ponto flutuante, subtração, etc. podem ser tratadas por uma única instrução. Se o hardware não tiver uma unidade de ponto flutuante (comum em processadores incorporados), as operações de ponto flutuante devem ser tratadas por rotinas de software. Assim, adicionar dois valores de ponto flutuante exigirá dezenas de instruções para concluir em vez de apenas um. Estes serão centenas de vezes mais lento do que inteiros, e vai consumir um grande pedaço de memória de programa disponível. A maioria dos algoritmos pode ser implementada usando inteiros com um pouco de pensamento. Uso de ponto flutuante é muitas vezes o resultado de pura preguiça. Não use ponto flutuante apenas porque seu intuitivo. Mais consumo de energia. Os CPUs alcançam seu consumo máximo de energia ao fazer cálculos intensivos em ponto flutuante. Isso geralmente não é perceptível em um PC de mesa, mas pode se tornar um problema em grandes redes que consistem em centenas de PCs, uma vez que a grade de energia que estão ligados a não pode ser projetado para fornecer o seu máximo de desenhar. Também pode ser um problema ao executar um laptop em bateria enquanto faz cálculos intensivos. A duração da bateria ao fazer cálculos de ponto flutuante intensivo pode ser uma pequena fração do que é ao ler e-mail, navegar na web ou editar um documento no OpenOffice. Decimal para conversões de ponto flutuante O procedimento de conversão As regras para converter um número decimal em flutuante Ponto são os seguintes: Converta o valor absoluto do número para binário, talvez com uma parte fracionária após o ponto binário. Isso pode ser feito convertendo as partes integrais e fracionárias separadamente. A parte integral é convertida com as técnicas examinadas anteriormente. A parte fracionária pode ser convertida por multiplicação. Este é basicamente o inverso do método de divisão: repetidamente multiplicar por 2, e colher cada um bit como aparece à esquerda do decimal. Acrescente os tempos 2 0 ao final do número binário (que não altera seu valor). Normalize o número. Mova o ponto binário para que fique um bit da esquerda. Ajuste o expoente de dois para que o valor não mude. Coloque a mantissa no campo de mantissa do número. Omitir o líder, e preencher com zeros à direita. Adicione o viés ao expoente de dois e coloque-o no campo expoente. O viés é 2 k menos 1 menos 1, onde k é o número de bits no campo do expoente. Para o formato de oito bits, k 3, então a polarização é 2 3minus1 menos 1 3. Para o IEEE de 32 bits, k 8, então a polarização é 2 8minus1 menos 1 127. Defina o bit de sinal, 1 para negativo, 0 para Positivo, de acordo com o sinal do número original. Usando o procedimento de conversão Converta 2.625 para nosso formato de ponto flutuante de 8 bits. A parte integral é fácil, 2 10 10 2. Para a parte fracionária: Gerar 1 e nada permanece. Assim 0,40625 10 0,01101 2. Normalizar: 0,01101 2 1,101 2 vezes 2 -2. Mantissa é 1010, o expoente é -2 3 1 001 2. Sinal bit é 0. Assim, 0.40625 é 0 001 1010 1a 16 Converter -12.0 para o nosso formato de ponto flutuante de 8 bits. 12 10 1100 2. Normalize: 1100,0 2 1,1 2 vezes 2 3. Mantissa é 1000, o expoente é 3 3 6 110 2. Sinal bit é 1. Portanto, -12.0 é 1 110 1000 e8 16 Converta decimal 1.7 para o nosso formato de ponto flutuante de 8 bits. A parte integral é fácil, 1 10 1 2. Para a parte fracionária: Gerar 1 e continuar com o resto. A razão pela qual o processo parece continuar indefinidamente é que ele faz. O número 710, que faz uma fração decimal perfeitamente razoável, é uma fração de repetição em binário, assim como a facção 13 é uma fração de repetição em decimal. (Ele repete em binário também.) Não podemos representar exatamente isso como um número de ponto flutuante. O mais próximo que podemos chegar em quatro bits é .1011. Uma vez que já temos um líder 1, o melhor número de oito bits que podemos fazer é 1.1011. Já normalizado: 1.1011 2 1.1011 2 vezes 2 0. Mantissa é 1011, o expoente é 0 3 3 011 2. Sinal é 0. O resultado é 0 011 1011 3b 16. Isso não é exato, é claro. Se você convertê-lo de volta para decimal, você obtém 1.6875. Converta -1313.3125 para o formato de ponto flutuante IEEE de 32 bits. A parte integral é 1313 10 10100100001 2. O fracionário: Gerar 0 e continuar.

No comments:

Post a Comment