Por que a representação de ponto flutuante usa um bit de sinal em vez do complemento de 2 para indicar números negativos

20

Considere uma representação de ponto fixo que pode ser considerada como um caso degenerado de um número flutuante. É perfeitamente possível usar o complemento de 2 para números negativos. Mas por que um bit de sinal é necessário para números de ponto flutuante, os bits de mantissa não deveriam usar os complementos de 2?

Além disso, por que os bits expoentes usam uma polarização em vez de uma representação de magnitude assinada (semelhante aos bits de mantissa) ou representação de complemento de 2?

Atualização: desculpe se eu não deixei claro. Eu estava procurando o motivo de como a representação de ponto flutuante é modelada. Se não houver uma forte troca de implementação entre as alternativas, alguém poderia explicar os aspectos históricos da representação de ponto flutuante?

koo
fonte

Respostas:

7

O complemento de dois faz sentido quando as duas entidades em questão têm as mesmas "unidades" e a mesma "largura". Por largura, quero dizer que, digamos, se você estiver adicionando um número de bits N e um número M, onde N e M são diferentes, é melhor não usar o complemento de dois. Para números de ponto flutuante, temos o problema de unidades: se os expoentes são diferentes, então estamos deslocando mentalmente uma das mantissas, e agora estamos com o mesmo problema de antes (com a largura).

Quanto aos bits do expoente, usando um viés em vez de sinal + magnitude, obtemos mais um valor (caso contrário, teríamos +0 e -0). Aqui o complemento de dois faz sentido ao multiplicar ou dividir números (desde então, adicionamos ou subtraímos os expoentes), mas não faz muito sentido ao adicionar ou subtrair.

Editar: um comentarista observou que você pode adicionar dois inteiros de complemento de diferentes comprimentos usando a extensão de sinal. Também há algum problema na detecção de estouro, mas isso também pode ser corrigido. Em resumo, você provavelmente poderia usar o complemento de dois, se for cuidadoso o suficiente. (Você também precisa lidar com multiplicação e divisão.)

Yuval Filmus
fonte
4
“Se você estiver adicionando um número N e um número M, onde N e M são diferentes, é melhor não usar o complemento de dois” - Você poderia esclarecer um pouco? Eu acredito que é inteiramente possível assinar estender um número usando uma representação de complemento de 2 usando seu MSB, por exemplo, 4'b1111 se estenderá a 5'b11111 e 4'b0111 -> 5'b00111. Não seria fácil adicionar isso ao deslocador de barril existente dentro de uma lógica aritmética de ponto flutuante?
koo
Obrigado pela sua resposta! Eu editei a pergunta para que ela pergunte com mais clareza o que torna o ponto flutuante atual.
koo
4

Da Wikipedia:

O sistema de complemento de dois tem a vantagem de que as operações aritméticas fundamentais de adição, subtração e multiplicação são idênticas às dos números binários não assinados ...

O complemento de dois é uma representação de números negativos que por acaso é muito conveniente. Essa é toda a razão para usá-lo.

Um par mantissa-expoente é uma representação de um número de ponto flutuante. Na maioria das vezes, ao usar números de ponto flutuante, você não está fazendo aritmética apenas na mantissa ou apenas no expoente.

Kache
fonte
4

Mas por que um bit de sinal é necessário para números de ponto flutuante

Falsa suposição. Não é necessário. Tenho certeza de que encontrei formatos de ponto flutuante que usavam o complemento 2 para a mantissa, mas eu teria que procurar nomes.

Estou longe de ser especialista em análise numérica, mas entendo que assinar zero é importante para eles. Provavelmente é mais fácil de manipular do que o complemento. Esse foi provavelmente um critério na escolha do IEEE-754.

Também por que os bits expoentes usam uma polarização em vez de uma representação de magnitude assinada

Novamente, é algo que não é necessário e alguns fizeram as coisas de maneira diferente.

É a representação para a qual é mais fácil fazer uma implementação de hardware para o conjunto de operações que são feitas nos expoentes (e aqui não é desejável ter uma representação para -0).

Uma das conseqüências dessa escolha é que você pode usar a comparação de números inteiros assinados para comparar o número de FP, se você não se importa com o NaN, o que talvez seja um critério para alguns (o fato de o NaN precisar de tratamento especial me faz duvidar que não era para IEEE-754).

AProgrammer
fonte
As comparações de números inteiros assinados classificarão os números FP negativos para trás. Para que eles tivessem uma classificação adequada, seria necessário algum tipo de formato de complemento, com o complemento provavelmente sendo o melhor (o negativo seria ... 110.1111 ..., com infinitos à esquerda e à direita).
Super8 de
3
O MIL-STD-1750A é provavelmente a arquitetura de processador mais amplamente usada que especifica a representação em ponto flutuante do complemento de dois. Na seção 4.1: "O conjunto de instruções deve suportar dados de precisão simples de ponto fixo de 16 bits, precisão dupla de ponto fixo de 32 bits, ponto flutuante de 32 bits e ponto flutuante de 48 bits na representação de complemento de 2 " . (Ênfase minha) .
Njuffa
2

O IEEE 754 usa sinal / magnitude, não o complemento de dois ou o de um.

O complemento de dois tem a desvantagem de que o intervalo positivo e o negativo não são idênticos. Se todos os padrões de bits forem válidos, você terá números x nos quais não poderá calcular facilmente -x. Isso é ruim. A alternativa é que existem padrões de bits inválidos, o que também é ruim. No IEEE 754, não há padrões de bits inválidos para o ponto flutuante de 64 ou 32 bits; portanto, você não precisa se preocupar com isso.

O complemento de alguém tornaria a multiplicação / divisão mais complexa (com magnitude assinada, você apenas executa os sinais e trata a mantissa como um número não assinado). Para adicionar e subtrair, eu realmente não quero pensar em adicionar e subtrair no complemento, isso faz minha cabeça doer.

gnasher729
fonte
O primeiro parágrafo desta resposta sugere que não há desvantagens para assinar / magnitude. Sinal / magnitude tem +/- 0 e aritmética mais complicada do que o complemento de dois.
Praxeolitic
Ter +/- zero é um problema e um recurso. Por exemplo, dividir um número minúsculo x por 10 ^ 100 dará +0 ou -0, preservando o sinal de x.
gnasher729
1

Ter zeros assinados fornece maior expressividade que pode ser útil em cálculos numéricos. A página da Wikipedia ' Zero assinado ' diz:

Alega-se que a inclusão de zero assinado no IEEE 754 facilita muito a obtenção de precisão numérica em alguns problemas críticos , em particular ao computar com funções elementares complexas .

Um dos principais projetistas do ponto flutuante IEEE 754, WH Kahan é um defensor do zero assinado por esses motivos. Sua opinião provavelmente terá muito peso.

equaeghe
fonte
1

Eu acho que é importante entender que os cálculos de ponto flutuante produzem valores aproximados , não valores exatos . Ou seja, se um cálculo de ponto flutuante gera um valor codificado X, então isso representa um valor teoricamente ideal que quase certamente NÃO é X, mas está no intervalo [X .. X + e) ​​{onde 'e' é o ' epsilon da máquina ', ou seja, não há número de ponto flutuante entre X e X + e}. Mais especificamente, um zero de ponto flutuante representa um número ideal que provavelmente não é exatamente zero, mas que é muito pequeno para representar com um valor codificado de ponto flutuante diferente de zero.

Dado que, usar a representação de sinal e magnitude é uma maneira de permitir que a codificação 'lembre' exatamente de que lado de zero está o valor ideal, o positivo ou o negativo. Isso é crítico em certos cálculos complexos (no sentido 'a + bi') - funções complexas-> complexas geralmente são 'multivaloradas'; portanto, para uma computação adequada, é essencial prestar atenção aos locais dos 'cortes de ramificação'. Os zeros assinados marcam, de certo modo, os locais desses cortes de ramificação - o cálculo feito no lado positivo será diferente daquele no lado negativo.

PMar
fonte
1
Os cálculos de ponto flutuante produzem valores exatos . Eles são apenas ligeiramente diferentes dos valores que os números reais matemáticos produzem. Um número de ponto flutuante representa um número, não um intervalo.
precisa saber é o seguinte
0

A maioria dos formatos de ponto flutuante tira proveito do fato de que, em um sistema binário, qualquer valor diferente de zero com um expoente não mínimo terá um "1" como o bit mais significativo da mantissa. Assim, em um sistema com um campo de 23 bits para a mantissa, as mantissas de números positivos não variam de 0 a 8.388.607, mas de 8.388.608 a 16.777.215. As mantissas de números que podem ou não ser positivos variam de -16.777.215 a -8.388.608 e de +8.388.608 a +16.777.215. Enquanto o complemento de dois é o melhor formato numérico quando é necessário ter cálculos "suavemente" cruzando zero, os intervalos descontínuos de valores de mantissa significam que os cálculos não seriam capazes de operar sem problemas ao longo de zero, usando o complemento de dois ou qualquer outra coisa .

supercat
fonte