Pergunta

De acordo com a Wikipedia link do IBM Hexadecimal Point flutuante:

.

Considere codificar o valor -118.625 como uma única precisão IBM valor de ponto flutuante.

O valor é negativo, então o bit de sinal é 1.

O valor 118.62510 no binário é 1110110.1012. Este valor é normalizado movendo o ponto de radix deixado quatro bits (um hexadecimal dígito) de cada vez até o dígito mais à esquerda é zero, produzindo 0,011101101012. Os danos mais restantes são preenchidos com zeros, produzindo uma fração de 24 bits de .0111 0110 1010 0000 0000 00002.

O valor normalizado moveu os dois dígitos da Radix para a esquerda, produzindo um multiplicador e expoente de 16 + 2. Um viés de +64 é adicionado a o exponente (+2), produzindo +66, que é 100 00102.

Combinando o sinal, exponente mais viés e fração normalizada Produz essa codificação:

S EX FRAÇÃO
1 100 0010 0111 0110 1010 0000 0000 0000
Em outras palavras, o número representado é -0.76a00016 × 1666 - 64= -0.4633789 ... × 16 + 2= -118.625

Agora, a definição de normalização de acordo com Wikipedia diz que

.

na base $ B $ Um número normalizado terá o formulário $ ± d_0.d_1d_2d_3 ... × B_N $ onde $ D_0 ≠ 0 $ e os dígitos $ D_0, d_1, d_2, d_3, ... $ são inteiros entre $ 0 $ e $ B-1 $

Então, como é $ 0.011101101012 \ vezes 16 ^ 2 $ um número normalizado?
Na verdade, este número não pode ser representado como um normalizado com base $ 16 $ exponente porque o mais próximo podemos obter é $ 1.1101101012 \ vezes 16 ^ 1 \ vezes 2 ^ 2 $ . O que estou perdendo aqui?

Foi útil?

Solução

Eu vou começar com esta famosa citação da conferência de prêmio de Turing de James Wilkinson, alguns comentários de um analista numérico .

.

Nos primeiros dias dos designers de informática de revolução do computador e analistas numéricos trabalharam juntos e de fato eram muitas vezes o mesmas pessoas. Agora há uma tendência lamentável para numérica analistas para optar por qualquer responsabilidade pelo desenho do instalações aritméticas e uma falha em influenciar os mais básicos características de software. Muitas vezes é dito que o uso de computadores para O trabalho científico representa uma parte pequena do mercado e numérica Analistas se resignaram a aceitar instalações "projetadas" para outros fins e fazer o melhor deles. não estou convencido que isso em inevitável, e se houve unidade suficiente em Expressando suas demandas Não há razão para que não pudessem ser atendidas. Afinal, uma das principais virtudes de um computador eletrônico do ponto de vista do analista numérico é a sua capacidade de "fazer Rápido aritmético. "Precisa da aritmética ser tão ruim!

Em 1970, o Fortran só foi plataforma cruzada por quatro anos. Muita análise numérica estava sendo feita no hardware da IBM e no sistema / 360 em particular, mas todo o fornecedor da CPU tinha seu próprio formato de ponto flutuante, e a maioria deles (como Wilkinson indicou) não foram projetados por aqueles que exigiram flutuação de alta qualidade ponto aritmético.

Hoje, a indústria é padronizada no IEEE-754. É imperfeito, porque tudo é, mas é confiável e pode ser invocado.

Definição de "Número Normalizado" da Wikipédia (ou "Número normalizado"; Eu vou digitar-o como meu dialeto significa a definição moderna atual. É aquele que você aprendeu no ensino médio ao discutir a notação científica. É o único usado pelo IEEE-754. É aquele que é em todos os livros didáticos modernos.

Mas não é a única forma normal para o ponto flutuante que existiu, e acho que é a fonte da confusão aqui.

Curiosamente, não é a única forma normal em uso hoje! Há pelo menos um lugar na programação moderna, onde uma forma normal diferente ainda está em uso, porque pré-dates IEEE-754.

A biblioteca padrão C tem uma função para extrair as partes de um formulário normal do número flutuante do ponto, chamado frexp . Mas a forma normal que utiliza é que a mantissa está na gama $ \ \ left [0.5, 1 \ direita) $ , não a moderna $ \ \ left [1, 2 \ direito) $ . Este é um notório "Gotcha" para analistas numéricos trabalhando em C ou C ++ hoje.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a cs.stackexchange
scroll top