Excesso 128 Opções Binárias
Introdução ao ponto flutuante Int e unsigned int são aproximações ao conjunto de números inteiros e ao conjunto de números naturais. Ao contrário de int e unsigned, o conjunto de inteiros e o conjunto de números naturais é infinito. Como o conjunto de int é finito, há um int máximo e um int mínimo. Ints também são contíguos. Ou seja, entre o mínimo e o máximo int, não existem valores em falta. O conjunto de entradas válidas é finito. Portanto, há um mínimo e máximo int. Também são contíguos. Ou seja, não há valores inteiros ausentes entre o mínimo e o máximo int. Há também outra característica chave de ints que não aparece no conjunto de números inteiros. Os ints têm uma representação subjacente. A representação é um número binário. O conjunto de números inteiros é muitas vezes representado como números da base 10, mas muitas vezes é pensado de forma mais abstrata. Ou seja, o conjunto é independente de sua representação (ou seja, podemos representar o conjunto de números inteiros de qualquer maneira que desejamos). Quais são os problemas quando se tenta elaborar uma representação de dados para números de ponto flutuante. Essas questões são mais complicadas do que Representando números inteiros. Enquanto a maioria das pessoas concorda que UB e 2C são as formas de representar inteiros não assinados e assinados. Representar números reais tem sido tradicionalmente mais problemático. Em particular, dependendo de qual empresa fabricou o hardware, havia diferentes maneiras de representar números reais e de manipulá-lo. Não existe uma escolha particularmente óbvia de como representar números reais. Em meados da década de 1980, a necessidade de tratamento uniforme de números reais (chamado de número de ponto flutuante) leva ao padrão IEEE 754. Padrões são geralmente desenvolvidos para dar um comportamento consistente. Por exemplo, quando C foi desenvolvido pela primeira vez, o que foi considerado um programa C válido dependia muito do compilador. Um programa compilado em um compilador C pode não ser compilado em outro. Efetivamente, muitos sabores diferentes de C estavam sendo criados, e a necessidade de ter uma definição padrão de uma linguagem era considerada como importante. Similarmente, para fins de concordância sobre os resultados realizados em números de ponto flutuante, houve um desejo de padronizar a forma como os números de ponto flutuante foram representados. Antes de chegar a esses problemas, vamos pensar sobre quais restrições terão de ser impostas aos números de ponto flutuante. Uma vez que o número de bits utilizados para representar um número de ponto flutuante é finito, deve haver um flutuador máximo e um flutuador mínimo. No entanto, uma vez que os números reais são densos (ou seja, entre dois números reais distintos, há outro número real), não há maneira de fazer qualquer representação de números reais contíguos. Inteiros não possuem essa propriedade de densidade. Isso significa que precisamos decidir quais números reais manter e quais deles se livrar. Claramente, qualquer número que tenha decimais repetidos ou nunca repete não é algo que pode ser representado como um número de ponto flutuante. Notação científica Por que precisamos representar números reais Claro, é importante em matemática. No entanto, números reais são importantes para medições em ciência. Precisão vs. Precisão Define estes dois termos: Definição A precisão refere-se ao número de dígitos significativos necessários para representar um número. Em termos aproximados, determina quão bom você pode distinguir entre duas medidas. Definição A precisão é o quão perto é uma medida para seu valor correto. Um número pode ser preciso, sem ser preciso. Por exemplo, se você diz que a altura de alguém é 2.0002 metros, isso é preciso (porque é preciso a cerca de 1 1000 metros). No entanto, pode ser impreciso, porque a altura de uma pessoa pode ser significativamente diferente. Na ciência, a precisão é geralmente definida pelo número de dígitos significativos. Este é um tipo de precisão diferente do que você provavelmente costumava. Por exemplo, se você tem uma escala, você pode ter sorte de ter precisão para uma libra. Ou seja, o erro é - 1 2 libras. A maioria das pessoas pensa em precisão como a menor medida que você pode fazer. Na ciência, é diferente. É sobre o número de dígitos significativos. Por exemplo, 1.23 10 10 tem a mesma precisão que 1,23 10 -10. Mesmo que a segunda quantidade seja muito, muito menor do que a primeira. Pode ser incomum, mas é assim que define precisão a precisão. Quando escolhemos representar um número, é mais fácil lidar com precisão do que precisão. Eu defino precisão para significar o resultado de um valor medido para seu valor real. Não há muito que um computador possa fazer diretamente para determinar a precisão (suponho, com dados suficientes, use métodos estatísticos para determinar a precisão). Precisão de Cálculos Existem dois conceitos distintos: a precisão de um valor gravado ou medido e a precisão de realizar operações com números. Não podemos fazer muito sobre a precisão do valor gravado (sem informações adicionais). No entanto, o hardware realiza operações matemáticas de forma razoavelmente precisa. A razão pela qual os cálculos são perfeitamente precisos é porque se precisa de matemática infinitamente precixada, e isso requer um número infinito de bits, que não existe em um computador. Como os números de ponto flutuante não podem ser infinitos, há sempre uma possibilidade de erro ao executar cálculos. Os números de pontos flutuantes geralmente se aproximam dos números reais. Isso é precisamente porque os números de ponto flutuante não podem ser infinitamente precisos. No campo da ciência da computação, a análise numérica está preocupada com formas de realizar cálculos científicos com precisão em um computador. Em particular, existem maneiras de minimizar o efeito de erros de arredondamento, erros devidos à natureza aproximada da representação de ponto flutuante. Representação canônica Ao representar números na notação científica, ele tem a seguinte forma: onde S é o significand ou mantisa, e exp é o expoente. 10 é a base. Na notação científica, pode haver mais de uma maneira de escrever o mesmo valor. Por exemplo, 6.02 X 10 23 é o mesmo que 60.2 X 10 22 é o mesmo que 602 X 10 21. Para qualquer número representado dessa maneira, há um número infinito de outras formas de representar isso (movendo o ponto decimal e ajustando o expoente). Pode ser bom ter uma maneira única e consistente de fazer isso, ou seja, uma maneira canônica ou padrão de fazer isso. E, então, existe uma maneira. Você pode escrever o significand como D. FFF. Onde 1 lt d lt 9. E FFF. Representa os dígitos após o ponto decimal. Se você seguir esta restrição em D. Então, há apenas uma maneira de escrever um número na notação científica. A exceção óbvia a esta regra é representar 0, que é um caso especial. Você pode generalizar esta fórmula para outras bases do que a base 10. Para a base K (onde K gt 1), você escreve a forma de notação científica canônica como: onde 1 lt D lt K-1. As Fs que aparecem na fração devem seguir a regra: 0 lt D lt K - 1. O número de dígitos significativos. Que é também a precisão. É o número de dígitos após o ponto de radix. Nós o chamamos de ponto de base, em vez do ponto decimal porque o decimal implica a base 10, e podemos falar sobre qualquer outra base. Notação científica binária Como com qualquer representação em um computador, precisamos representar números em binário. Então, isso significa que nós especializamos a fórmula para se parecer com: Isso cria uma restrição interessante em D. Em particular, 1 lt D lt 1. O que significa que D é forçado a ser 1. Bem, use esse fato mais tarde. IEEE 754 Single Precision IEEE 754 números de ponto flutuante foi um padrão desenvolvido na década de 1980, para lidar com o problema da representação de ponto flutuante não padrão. Existe um padrão para precisão única (32 bits) e dupla precisão (64 bits). Bem, principalmente focar em uma precisão única. XXXX XXXX XXXX XXXX XXXX XXX Um número de precisão único IEEE 754 é dividido em três partes. As três partes combinam as três partes de um número escrito em notação científica canônica binária. Isso é b 31. Se esse valor for 1, o número é negativo. Caso contrário, não é negativo. Expoente O expoente é um excesso de polarização 127. Normalmente, espera-se que o excesso de polarização seja metade do número de representações. Neste caso, o número de representações é 256 e metade disso é 128. No entanto, o excesso é 127. Assim, o intervalo de possíveis expoentes é -127 lt exp lt 128. Normalmente, você representaria o significativo (também chamado de mantisa. Isso significaria representar D. FFFF.) No entanto, lembre-se de que para a base 2, D 1. Como D é sempre 1, não é necessário representar o 1. Você só precisa Para representar os bits após o ponto de radix. Assim, o 1 a esquerda do ponto de base não é explicitamente representado. Chamamos isso de oculto. A precisão única IEEE 754 tem 24 bits de precisão. 23 dos bits são explicitamente representados e o Oculto 1 oculto é o bit 24. Há uma falácia quando dizemos que uma precisão única IEEE tem 24 bits de precisão. Em particular, é muito como dizer que uma calculadora com 15 dígitos possui 15 dígitos de precisão. É verdade Que pode representar todos os números com 15 dígitos, mas a questão é se o valor é realmente tão preciso. Por exemplo, suponha que um número medido tenha apenas 3 dígitos de precisão. Não há como indicar isso em uma calculadora. A calculadora está preparada Para ter 15 dígitos de precisi , Embora seja mais preciso do que o número. O mesmo pode ser dito sobre a representação de números de ponto flutuante. Tem 24 bits de precisão, mas isso pode não representar com precisão o número real de bits significativos. Infelizmente, isso é o melhor que os computadores podem fazer. Pode-se armazenar informações adicionais para determinar exatamente quantos bits são realmente significativos, mas isso normalmente não é feito. Categorias Ao contrário do UB ou 2C, os números de ponto flutuante no IEEE 754 não caem na mesma categoria. O IEEE 754 identifica 5 categorias diferentes de números de ponto flutuante. Você pode se perguntar por que eles fazem isso. Esta é uma das razões. Dada a representação, tal como está, não haveria nenhuma maneira de representar 0. Se todos os bits fossem 0, este seria o número 1.0 X 2 -127. Embora este seja um número pequeno, não é 0. Assim, designamos o bittring contendo todos os 0s para ser zero. O seguinte é uma lista de categorias de números de ponto flutuante no IEEE 754. zero Porque há um bit de sinal, há uma representação positiva e negativa de 0. infinito. Existe também um infinito positivo e negativo. Infinito ocorre quando você divide um número diferente de zero por zero. Por exemplo, 1.0 0.0 produz infinito. NaN Isto significa que não é um número. NaN geralmente ocorre quando você faz uma operação mal definida. O exemplo canônico está dividindo 0,0 0,0, que não possui um valor definido. Números desnormalizados Estes são números que têm menos bits de precisão e são menores (em magnitude) do que números normalizados. Bem, discuta momentaneamente os números desnormalizados em detalhes. Números normalizados Estes são números de ponto flutuante padrão. A maioria dos padrões de bittrade no IEEE 754 são números normalizados. Como saber qual categoria um flutuador é útil Seria útil saber qual categoria a uma dada entrada de bitstring. Heres o gráfico. Mais uma vez, escrevemos 0 8 para significar 0, repetimos 8 vezes, ou seja, 0000 0000. Observe que existe um negativo e negativo. Números desnormalizados. Suponha que permitimos que todos os 0s sejam um número normalizado (não é, é realmente designado como zero). Um bittring com 32 zeros seria 1.0 X 2 -127. Isso é um valor bastante baixo. No entanto, podemos representar números para ficar ainda menores, se fizermos o seguinte quando o expoente for 0 8. Não tenha um oculto 1. b 23-0 seriam os bits que aparecem após um ponto de base. Corrigir o expoente para -126. Lembre-se de que o expoente é escrito com um viés de 127. Então, você esperaria que, se o expoente for 0 8. Este bittring representaria o expoente -127 e não -126. No entanto, há uma boa razão pela qual é -126. Bem, explique por que em um momento. Por enquanto, aceitamos o fato de que o expoente é -126 sempre que o declive exponente é 0 8. O maior número desnormalizado positivo O que é o maior número desnormalizado positivo É quando a fração é de 1 23. Parece: Este bittring mapeia para o número 0. (1 23) x 2 -126. Este número tem 23 bits de precisão, uma vez que existem 23 1s após o ponto de base. Número Denormalizado Positivo Mais Pequeno Qual é o menor número positivo de desnormalização Exponente bitstring 0 8. (Todos os números desnormalizados têm este bittring). Seu valor é -126. A fração é (0 22) 1. Ou seja, 22 zeroes seguidos por um único 1. Isto parece: Este padrão de bitstring mapeia para o número 0.0 22 1 x 2 -126. Que é de 1,0 x 2 -149. Este número tem 1 bit de precisão. Os 22 zeros são meramente titulares e não afetam o número de bits de precisão. Você pode não acreditar que esse número tenha apenas 1 bit de precisão, mas sim. Considere o número decimal 123. Este número possui 3 dígitos de precisão. Considere 00123. Isso também possui 3 dígitos de precisão. Os principais 0s não afetam o número de dígitos de precisão. Similares, se você tiver 0.000123, os zeros são apenas para colocar o 123 corretamente, mas não são dígitos significativos. No entanto, 0,01230 tem 4 dígitos significativos, porque o 0 mais à direita realmente aumenta a precisão. Assim, para o nosso exemplo, temos 22 zerros seguidos por um 1 após o ponto de radiação, e os 22 zeros não têm nada a ver com o número de bits significativos. Ao usar números desnormalizados, conseguimos fazer o menor flutuador positivo para ser 1,0 X 2 -149. Em vez de 1,0 X 2 -127. O que teríamos tido se o número tivesse sido normalizado. Assim, conseguimos passar de 10 ordens de grandeza menores, sacrificando fragmentos de precisão. Por que -126 e não -127 Quando o declive exponente é 0 8. Isso é mapeado para o expoente -126. No entanto, para números de ponto flutuante de precisão simples IEEE 754 normalizados, o viés no expoente é -127. Por que é -126 em vez de -127. Para responder a esta pergunta, precisamos olhar para o menor número positivo normalizado. Isso ocorre com o seguinte padrão bittring Este bittring mapeia para 1.0 x 2 -126. Vamos ver as duas opções para os maiores números desnormalizados positivos. 0. (1 23) x 2 -127 (expoente é 127) 0. (1 23) x 2 -126 (o expoente é 126 --- isso é o que realmente é usado na precisão única IEEE 754) Ambas as escolhas são menores que 1,0 x 2 -126. O mais pequeno normalizado (Em particular, note que o número com o expoente de -126 é menor). Isso é bom porque queremos evitar a sobreposição entre números normalizados e desnormalizados. Observe também que o número com o -126 como expoente é maior do que o número que tem -127 como expoente (ambos têm o mesmo significado de mantisa e -126 é maior que -127). Assim, ao escolher -126 em vez de -127, o espaço entre o maior número desnormalizado eo menor número normalizado é menor. Esta é uma característica necessária É realmente necessário tornar essa lacuna pequena Talvez não, mas pelo menos há algum raciocínio atrás da decisão. Conversão Normalizada da Base 10 para IEEE 754 Permite converter 10,25 da base 10 para a precisão única IEEE 754. Heres as etapas: Converta o número a esquerda do ponto de base para a base 2 Converta o número direito do ponto de base para a base 2. Isso resulta em 1010 0.01, que é 1010.01. Escreva isso em notação científica binária. Este é 1010.01 X 2 0. Que é 1.01001 X 2 3. Escreva isso na precisão única IEEE 754. Este é 1010.01 X 2 0. Que é 1.01001 X 2 3. Converta 3 para o viés correto. Uma vez que o viés é 127, adicione 127 a 3 para obter 130 e converta em binário. Isso resulta em 1000 0010. Escreva o número na representação correta. Observe que o oculto 1 não está representado na fração. Um Algoritmo para Escrever Exponente Positivo no Excesso 127 Converter 130 para binário parece um pouco doloroso. Parece exigir muitas etapas. No entanto, há uma maneira bastante fácil de converter expoentes positivos em binários. Primeiro, aproveitamos o seguinte fato: 1000 0000 mapas para o expoente 1 em excesso 127. Se isso fosse excesso de 128, ele iria mapear para 0. Seria bom, de fato, se fosse excesso de 128, porque então nós gostaríamos Escreva o número positivo em binário não assinado e, em seguida, jogue o bit mais significativo de 0 para 1, e marque-se. (Verifique isso por si mesmo com um exemplo ou dois). No entanto, o excesso de 127 e o excesso de 128 são apenas off-by-one, então não é muito difícil ajustar o algoritmo de forma adequada. É o que você faz para converter expoentes positivos para o excesso de 127. Subtrair 1 do expoente positivo. Converta o número em binário não assinado, usando 8 bits. Virar o MSb para 1 Por exemplo, tivemos um expoente de 3 no exemplo anterior. Subtrair 1 para obter 2, converter para UB para obter 0000 0010. Virar o MSb para obter 1000 0010. Essa é a resposta da seção anterior. Antes de memorizar este algoritmo, você realmente deveria tentar entender de onde ele vem. É daí que ele vem. Considere um expoente positivo, x. Representado na base 10. Para convertê-lo em excesso de 127, adicionamos 127. Assim, temos x 127. Podemos reescrever isso como: (x - 1) 128. Esta é uma álgebra simples. 128 é 1000 0000 em binário. E temos x - 1. Que é onde a subtração de 1 ocorre. Enquanto x-1 for menor que 128 (e será, uma vez que o valor máximo de x é 128), então é fácil adicionar esse número binário a 1000 0000. Lembre-se, a memorização é um segundo fraco para a compreensão. É melhor entender por que algo funciona do que memorizar uma resposta. No entanto, é ainda melhor entender por que algo funciona e lembre-se disso também. Convertendo Denormalized da Base 10 para IEEE 754 Suponha que você seja solicitado a converter 1.1 x 2 -128 para a precisão única IEEE 754. Como você faria isso Se você não for cuidadoso, você pode pensar que o número é normalizado e você pode converter isso em um número normalizado usando o procedimento de antes. Você ficou preso tentando converter o expoente, porque você descobriu que o número é negativo e o número deve ser não negativo quando é convertido da base 10 (depois de adicionar o viés) ao UB. Você pode se salvar esse incômodo se você lembrar que o número mais pequeno e positivo normalizado tem um expoente de -126 e que o expoente que temos é -128, o que é inferior a -126. Se você escreveu o número na notação científica binária (em forma canônica), e o expoente é inferior a -126, então você tem um número desnormalizado. Desde -128 lt -126, o número estava tentando representar é um número desnormalizado. As regras para representar números desnormalizados são diferentes de representar números normalizados. Para representar um número desnormalizado, você precisa mudar o ponto de base para que o expoente seja -126. Neste caso, o expoente deve ser aumentado em 2 de -128 para -126, então o ponto de radix deve mudar para a esquerda em 2. Isso resulta em: 0,011 x 2 -126 Neste ponto, é fácil de converter. O exponente bitstring é 0 8. Você copia os bits após o ponto de radix na fração. O bit de sinal é 0. Nenhum Float Não Assinado Ao contrário dos Ints, não existe um flutuador não assinado. Uma das razões para isso pode ser a natureza complicada de representar números de ponto flutuante. Se estivéssemos livres do bit de sinal, como podemos usá-lo? Nós adicionaríamos um pouco mais ao expoente. Isso faria mais sentido, já que ele fica adjacente ao expoente, mas o viés teria que ser alterado. Poderíamos adicionar um pouco mais à fração. Pelo menos, isso causaria a menor quantidade de interrupção. Será que esse bit additonal nos ajudará de alguma maneira maliciosa. Por um lado, isso nos permite representar o dobro de números de ponto flutuante. Por outro lado, ele faz isso adicionando um único bit de precisão. Talvez por esse tipo de raciocínio, os desenvolvedores do padrão IEEE 754 considerassem que ter um flutuador não assinado não fazia sentido e, portanto, não havia flutuador não assinado no ponto flutuante IEEE 754. Por que Sign Bit, Exponent, then Fraction Se você olhar para a representação para o IEEE 754, você notará que seu bit de sinal, então o expoente e a fração. Por que fazê-lo nessa ordem, Heres uma explicação plausível. Suponha que você queira comparar duas datas. A data inclui mês, dia e ano. Você usa dois dígitos para o mês, dois para o dia e quatro para o ano. Suponha que você deseja armazenar a data como uma string e que deseja usar a comparação de cordas para comparar as datas. Qual ordem você deve escolher Você deve escolher o ano, o mês e o dia. Por que, quando você está fazendo comparação de cordas, você compara da esquerda para a direita e quer a quantidade mais significativa para a esquerda. Esse é o ano. Quando você olha para um número de ponto flutuante, o expoente é o mais importante, então está à esquerda da fração. Você também pode fazer comparações porque o expoente está escrito em notação de polarização (você também poderia usar dois complementos, embora isso tornasse a comparação um pouco mais complicada). Então, por que o bit de sinal para o extremo esquerdo. Talvez a resposta seja porque é aí que aparece na representação int assinada. Pode ser incomum ter o sinal em qualquer outra posição. Depois de ler e praticar, você deve ser capaz de fazer o seguinte: Dê os nomes de cada uma das cinco categorias de números de ponto flutuante na precisão única IEEE 754. Dada uma string de 32 bits, determine a categoria em que a cadeia de bits se encontra. Dado um número normalizado ou desnormalizado, escreva o número na notação científica binária canônica (você pode deixar o expoente escrito na base 10). Dado um número na base 10 ou notação científica binária canônica, converta-a para um número de ponto flutuante de precisão simples IEEE 754. Saiba o que é utilizado o viés para números normalizados. Saiba qual expoente é usado para números desnormalizados. Saiba o que o 1 escondido é. Significado Int: Bias Excess Notation Na notação em excesso, você especifica dois parâmetros: o número de bits, N e o valor de polarização, K. Em SM e 1C, há apenas um parâmetro: o número de bits . Por exemplo, deixe K 5 (em 3 bits), e você tenha uma representação em excesso 5, que atribui 000 a -5 e faz 111 igual a 2. De fato, o representação de K em excesso representa 0 N para - K e 1 N para - K 2 N - 1. Se você escolher K 2 N - 1. então o bit de sinal é virado, onde 1 no MSb significa positivo e 0 significa negativo. Com a representação de excesso (ou parcial), você não pode fazer adição usando hardware de assinatura int não assinado. Você precisa de um circuito especializado para executar a adição. Este gráfico assume o excesso de representação em K. Número de valores Base 10 para excesso Adicione o excesso ao número da base dez. Converta o número de base dez resultante em binário não assinado (UB). Excesso para Base 10 Converta o número binário para base dez, usando representação binária não assinada (UB). Subtrair o excesso. É fácil ver que a conversão para e da representação em excesso são operações inversas. Por que o excesso de polarização é diferente As outras representações assinadas vimos: SM, 1C e 2C dividem o número de valores negativos e não negativos uniformemente. Em princípio, você também pode fazer isso com excesso de representação. No entanto, uma vez que o excesso de representação K usando N bits tem dois parâmetros, K e N, você pode escolher K para ser o que quiser. Você pode ter números mais positivos do que negativos, não incluir zero, e assim por diante. Como a representação K em excesso usa duas variáveis (K e N), qualquer hardware projetado para realizar a adição nesta representação dependerá de K e N. Felizmente, os valores de classificação em representação em excesso dependem apenas de N. Como 2C, a representação em excesso tem, em Mais, um zero. No entanto, é possível escolher K, então não há zero (escolha um tamanho K) adequadamente. Ao contrário das outras representações de ints assinadas, você pode comparar valores em representação de viés excessivo usando uma comparação não assinada. No entanto, a maioria das pessoas prefere fazer adição corretamente à comparação, e é por isso que o 2C é preferido pelo excesso de notação. A notação excedente encontra um uso na representação de ponto flutuante, no entanto, e é por isso que a estudamos.
Comments
Post a Comment