Números de ponto flutuante Números reais. Pi 3,14159265. E 2,71828. Notação científica: tem um único dígito à esquerda do ponto decimal. Um número na Notação Científica sem 0s inicial é chamado de Número Normalizado: 1,0 vezes 10 -8 Não em forma normalizada: 0,1 vezes 10 -7 ou 10,0 vezes 10 -9 Pode também representar números binários em notação científica: 1,0 vezes 2 -3 A aritmética computacional que suporta esses números é chamada de Ponto Flutuante. O formulário é 1.xxxx133 vezes 2 yy133 Usando a notação científica normalizada Simplifica a troca de dados que inclui números de ponto flutuanteSimplifica os algoritmos aritméticos para saber que os números serão sempre nesta formaAumenta a precisão dos números que podem ser armazenados em uma palavra , Já que cada 0 desnecessário é substituído por outro dígito significativo à direita do ponto decimal. Representação de números de ponto flutuante -1 S vezes M vezes 2 E 177 10 -308. 10 308 Estes formatos são chamados. IEEE 754 Floating-Point Standard Uma vez que a mantissa é sempre 1.xxxxxxxxx na forma normalizada, não há necessidade de representar o líder 1. Assim, efetivamente: Simples Precisão: mantissa 1 bit 23 bitsDouble Precisão: mantissa 1 bit 52 bitsSince zero (0,0) não tem 1 líder, para distingui-lo de outros, é dado o bitpattern reservados todos os 0s para o expoente para que o hardware não vai anexar Um líder 1 para ele. Assim: Outros números -1 S vezes (1 Mantissa) vezes 2 E Se nós numeramos os bits de mantissa da esquerda para a direita m1, m2, m3. Mantissa m1 vezes 2 -1 m2 vezes 2 -2 m3 vezes 2 -3. Os expoentes negativos podem representar um problema nas comparações. Por exemplo (com dois complementos): Números reais: Números de ponto flutuante Na época medieval pessoas que foram canhotas foram considerados por alguns como sendo um mal, uma visão negativa. Portanto, se você esquecer qual a maneira de mover o ponto decimal, expoentes negativos mover para a esquerda. Enquanto os expoentes positivos se movem para a direita Se você estuda outros assuntos como Física ou Química, você pode encontrar números de Ponto Flutuante como este. O primeiro bit define a parte não-zero do número e é chamado de Mantissa. A segunda parte define quantas posições queremos mover o ponto decimal, isso é conhecido como o Exponente e pode ser positivo ao mover o ponto decimal para a direita e negativo ao mover para a esquerda. 6.63 M antissa 10 34 E xponent underbrace Mantissaend vezes underbrace Exponentend Se você quisesse escrever esse número na íntegra você teria que mover o ponto decimal no expoente 34 lugares à esquerda, resultando em: O que levaria muito tempo para Escrever e é muito difícil para o olho humano para ver quantos zeros existem. Portanto, quando podemos aceitar um certo nível de precisão (6,63 3 números significativos), podemos armazenar um número de muitos dígitos como pranchas constante em um pequeno número de dígitos. Você está sempre ponderando o escopo (ou intervalo) do número em relação à sua precisão (número de bits significativos). O mesmo acontece com os números binários e é ainda mais importante. Quando você está lidando com números e sua representação computacional, você deve estar sempre ciente de quanto espaço os números vão ocupar na memória. Como vimos com o exemplo acima, a representação não flutuante de um número pode ocupar um número inviável de dígitos, imagine quantos dígitos você precisaria armazenar 0,00 000 000 000 000 000 000 000 000 000 663 em binário A binário Número de ponto flutuante pode consistir de 2, 3 ou 4 bytes, no entanto, os únicos que você precisa se preocupar com a variedade de 2 bytes (16 bits). Os primeiros 10 bits são a Mantissa, os últimos 6 bits são o expoente. Assim como a representação de ponto flutuante de denary, um número de ponto flutuante binário terá uma mantissa e um expoente, embora, como você está lidando com binário (base 2), você deve lembrar que em vez de ter 10 x y você terá que usar 2 x y. Por que usar números de ponto flutuante binário Editar Binário de ponto fixo permite que um computador segure frações, mas devido à sua natureza é muito limitado em seu escopo. Mesmo usando 4 bytes para segurar cada número, com 8 bits para a parte fracionária após o ponto, o maior número que pode ser realizada é pouco mais de 8 milhões. Outro formato é necessário para a realização de números muito grandes. Em decimal, números muito grandes podem ser mostrados com uma mantissa e um expoente. 0,1210 Aqui o 0,12 é a mantissa eo 10 é o expoente. A mantissa detém os dígitos principais e os expoentes definem onde o ponto decimal deve ser colocado. A mesma técnica pode ser usada para números binários. Por exemplo, dois bytes podem ser divididos de modo que 10 bits sejam usados para a mantissa e os restantes 6 para o expoente. Isso permite que um escopo muito maior de números seja usado. Convertendo ponto flutuante binário para decimal Edit Há vários estágios a serem tomados quando se trabalha um número de ponto flutuante em binário. Na verdade, é muito parecido com uma rotina de dança disco - conhecida nesta página como a dança Noorgat, variação Kemp (você não será testado em nome, mas deve ajudá-lo a lembrar) Sinal - encontrar o sinal da mantissa (fazer uma nota de Isto) Slide - encontre o valor do expoente e se ele é positivo ou negativo Bounce - mova o decimal a distância que o expoente pede, deixado para um expoente negativo, direito para um positivo Se movendo para a esquerda e for positivo Number, Then pad com zeros Se Movendo Esquerda e É Número Negativo, então almofada com uns Flip - Se a mantissa é negativa executar o complemento de dois nela Nadar - começando no ponto decimal calcular os valores da mantissa, indo para a esquerda, depois para a direita. Agora, certifique-se de voltar ao sinal que você registrou no movimento do sinal. Exemplo: Exemplo de ponto flutuante flutuante trabalhado Vamos tentar. Nós recebemos o seguinte número de ponto flutuante de 16 bits, com 10 bits para a mantissa e 6 bits para o expoente. Lembre-se de que o ponto decimal está entre o primeiro eo segundo bits mais significativos A primeira ação que precisamos executar é o sinal. Descobrir o sinal da mantissa O segundo passo na dança Noorgat é o slide. Precisamos encontrar o valor do expoente, que é os últimos 6 bits do número O terceiro passo na dança Noorgat é o salto que está movendo o ponto decimal da Mantissa o número de posições especificadas pelo slide, que foi um Posição para a direita. Como assim: A quarta etapa é o flip opcional. Volte para o estágio do sinal e veja se a Mantissa é negativa. Não é Oh bem você pode ignorar passado este estágio, em seguida, como só virar o número se a mantissa é negativo. O quinto e último passo é nadar. Tomando a mantissa por conta própria, agora podemos calcular o valor do número de ponto flutuante. Comece no centro e marque cada número para a esquerda 1. 2. 4. 8. 16 e assim por diante. Cada número à direita 1 2. 1 4. 1 8. 1 16,,, e assim por diante. Exercício: Simple floating floating point3.10.1. O Ponto Flutuante Basics contorna as limitações do 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 raiz 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: Deslocamento 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 operações que aumentam e diminuem 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 operações de ponto flutuante e números inteiros podem 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 desenho. 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 intensivos em ponto flutuante pode ser uma pequena fração do que é ao ler e-mails, navegar na web ou editar um documento no OpenOffice.
No comments:
Post a Comment