Pourquoi la représentation en virgule flottante utilise un bit de signe au lieu du complément à 2 pour indiquer des nombres négatifs

20

Considérons une représentation en virgule fixe qui peut être considérée comme un cas dégénéré d'un nombre flottant. Il est tout à fait possible d'utiliser le complément à 2 pour les nombres négatifs. Mais pourquoi un bit de signe est-il nécessaire pour les nombres à virgule flottante, les bits de mantisse ne devraient-ils pas utiliser les compléments de 2?

Aussi pourquoi les bits d'exposant utilisent-ils une polarisation au lieu d'une représentation de grandeur signée (similaire aux bits de mantisse) ou une représentation du complément à 2?

Mise à jour: Désolé si je n'ai pas été clair. Je cherchais la raison de la forme de la représentation en virgule flottante. S'il n'y a pas de compromis de mise en œuvre solide entre les alternatives, alors quelqu'un pourrait-il expliquer les aspects historiques de la représentation en virgule flottante?

koo
la source

Réponses:

7

Le complément à deux est logique lorsque les deux entités en question ont les mêmes "unités" et la même "largeur". Par largeur, je veux dire que, par exemple, si vous ajoutez un nombre N bits et un nombre M bits, où N et M sont différents, alors vous feriez mieux de ne pas utiliser le complément à deux. Pour les nombres à virgule flottante, nous avons le problème des unités: si les exposants sont différents, alors nous décalons mentalement l'une des mantisses, et maintenant nous sommes au même problème qu'auparavant (avec la largeur).

Quant aux bits d'exposant, en utilisant un biais au lieu de signe + amplitude, nous gagnons une valeur de plus (sinon nous aurions +0 et -0). Ici, le complément à deux est logique lors de la multiplication ou de la division des nombres (depuis lors, nous ajoutons ou soustrayons les exposants), mais pas autant de sens lors de l'addition ou de la soustraction.

Edit: Un commentateur a fait remarquer que vous pouvez ajouter deux entiers complémentaires de longueurs différentes en utilisant l'extension de signe. Il y a également un problème avec la détection du débordement, mais cela peut également être résolu. En résumé, vous pouvez probablement utiliser le complément à deux, si vous êtes assez prudent. (Vous devez également gérer la multiplication et la division.)

Yuval Filmus
la source
4
"Si vous ajoutez un nombre N bits et un nombre M bits, où N et M sont différents, alors vous feriez mieux de ne pas utiliser le complément à deux" - Pourriez-vous clarifier un peu? Je crois qu'il est tout à fait possible de signer l'extension d'un nombre en utilisant une représentation du complément à 2 en utilisant son MSB, par exemple 4'b1111 s'étendra à 5'b11111, et 4'b0111 -> 5'b00111. Ne devrait-il pas être simple d'ajouter cela au levier de vitesses existant dans une logique arithmétique à virgule flottante?
koo
Merci pour votre réponse! J'ai édité la question afin qu'elle demande plus clairement ce qui fait le point flottant actuel.
koo
4

De Wikipédia:

Le système à deux compléments a l'avantage que les opérations arithmétiques fondamentales d'addition, de soustraction et de multiplication sont identiques à celles des nombres binaires non signés ...

Le complément à deux est une représentation de nombres négatifs qui s'avère très pratique. C'est toute la raison de l'utiliser.

Une paire mantisse-exposant est une représentation d'un nombre à virgule flottante. La plupart du temps, lorsque vous utilisez des nombres à virgule flottante, vous ne faites pas d'arithmétique uniquement sur la mantisse ou uniquement sur l'exposant.

Kache
la source
4

Mais pourquoi un bit de signe est-il nécessaire pour les nombres à virgule flottante

Fausse hypothèse. Ce n'est pas nécessaire. Je suis presque sûr d'avoir rencontré des formats à virgule flottante qui utilisaient le complément à 2 pour la mantisse, mais je devrais trouver des noms.

Je suis loin d'être un spécialiste de l'analyse numérique, mais je comprends qu'avoir signé zéro est important pour eux. Il est probablement plus facile à manipuler que son complément. C'était probablement un critère dans le choix de l'IEEE-754.

Aussi pourquoi les bits d'exposant utilisent-ils une polarisation au lieu d'une représentation en amplitude signée

Encore une fois, ce n'est pas nécessaire et certains ont fait les choses différemment.

C'est la représentation pour laquelle il est plus facile de faire une implémentation matérielle pour l'ensemble des opérations qui se font sur les exposants (et ici on n'a pas besoin d'une représentation pour -0).

L'une des conséquences de ce choix est que vous pouvez utiliser la comparaison d'entiers signés pour comparer le nombre de FP si vous ne vous souciez pas de NaN, ce qui était peut-être un critère pour certains (le fait que NaN ait besoin d'une gestion spéciale me fait douter qu'il ne l'était pas pour IEEE-754).

AProgrammer
la source
Les comparaisons entières signées classeront les nombres FP négatifs à l'envers. Pour qu'ils se classent correctement, une sorte de format de complément aurait été nécessaire, le complément de ceux-ci étant probablement le meilleur (le négatif serait ... 110.1111 ..., avec des infinis à gauche et à droite).
supercat
3
MIL-STD-1750A est probablement l'architecture de processeur la plus largement utilisée qui spécifie une représentation en virgule flottante complémentaire à deux. Dans la section 4.1: "Le jeu d'instructions doit prendre en charge la précision simple à virgule fixe de 16 bits, la double précision à virgule fixe de 32 bits, les données à précision étendue à virgule flottante 32 bits et à virgule flottante 48 bits dans la représentation du complément à 2 " . .
njuffa
2

IEEE 754 utilise le signe / magnitude, pas le complément à deux ou le complément à un.

Le complément à deux a l'inconvénient que les plages positive et négative ne sont pas identiques. Si tous les modèles de bits sont valides, alors vous avez des nombres x où vous ne pouvez pas facilement calculer -x. C'est mauvais. L'alternative est qu'il existe des modèles de bits non valides, ce qui est également mauvais. Dans IEEE 754, il n'y a pas de modèles de bits non valides pour les virgules flottantes 64 ou 32 bits, vous n'avez donc pas à vous en soucier.

Le complément à un rendrait la multiplication / division plus complexe (avec une amplitude signée, il suffit de xor les signes et de traiter la mantisse comme un nombre non signé). Pour ajouter et soustraire, je ne veux vraiment pas penser à ajouter et soustraire dans son complément, cela me fait mal à la tête.

gnasher729
la source
Le premier paragraphe de cette réponse suggère qu'il n'y a pas d'inconvénients à signer / magnitude. Le signe / la grandeur a +/- 0 et une arithmétique plus compliquée que le complément à deux.
Praxeolitic
Avoir +/- zéro est à la fois un problème et une fonctionnalité. Par exemple, diviser un petit nombre x par 10 ^ 100 donnera +0 ou -0, préservant le signe de x.
gnasher729
1

La signature de zéros donne une expressivité accrue qui peut être utile dans les calculs numériques. La page wikipedia ' Signé zéro ' dit:

On prétend que l'inclusion du zéro signé dans IEEE 754 facilite beaucoup plus la précision numérique dans certains problèmes critiques , en particulier lors du calcul avec des fonctions élémentaires complexes .

L'un des principaux concepteurs de la virgule flottante IEEE 754, WH Kahan est un partisan du zéro signé pour ces raisons. Son opinion aura probablement eu beaucoup de poids.

equaeghe
la source
1

Je pense qu'il est important de comprendre que les calculs en virgule flottante produisent des valeurs approximatives , pas des valeurs exactes . Autrement dit, si un calcul à virgule flottante donne une valeur codée X, cela représente alors une valeur théoriquement idéale qui n'est presque certainement PAS X, mais se situe dans la plage [X .. X + e) ​​{où «e» est le « machine epsilon ', c'est-à-dire qu'il n'y a pas de nombre à virgule flottante entre X et X + e}. Plus précisément, un zéro à virgule flottante représente un nombre idéal qui n'est probablement pas exactement zéro, mais qui est trop petit pour être représenté avec une valeur codée à virgule flottante non nulle.

Étant donné que l'utilisation de la représentation par signe et amplitude est un moyen de permettre au codage de «se souvenir» exactement de quel côté de zéro se trouve la valeur idéale, le positif ou le négatif. Ceci est critique dans certains calculs complexes (au sens `` a + bi '') - les fonctions complexes-> complexes sont souvent `` à valeurs multiples '', donc pour un calcul correct, il est essentiel de prêter attention aux emplacements des `` coupures de branches ''. Les zéros signés marquent alors dans un certain sens les emplacements de ces coupes de branches - le calcul effectué du côté positif sera différent de celui du côté négatif.

PMar
la source
1
Les calculs en virgule flottante produisent des valeurs exactes . Ils sont légèrement différents des valeurs produites par les nombres réels mathématiques. Un nombre à virgule flottante représente un nombre, pas une plage.
gnasher729
0

La plupart des formats à virgule flottante profitent du fait que, dans un système binaire, toute valeur non nulle avec un exposant non minimum aura un "1" comme bit le plus significatif de la mantisse. Ainsi, dans un système avec un champ de 23 bits pour la mantisse, les mantisses de nombres positifs ne vont pas de 0 à 8 388 607 mais plutôt de 8 388 608 à 16 777 215. Les mantisses de nombres positifs ou non varient de -16 777 215 à -8 388 608 et de + 8 388 608 à + 16 777 215. Alors que le complément à deux est le meilleur format numérique lorsqu'il est nécessaire d'avoir des calculs croisés "en douceur", les plages discontinues de valeurs de mantisse signifient que les calculs ne pourraient pas fonctionner sans problème sur zéro s'ils utilisent le complément à deux ou autre chose .

supercat
la source