Zéro signé
Le zéro signé est un zéro accompagné d'un signe. En arithmétique ordinaire, le nombre 0 n'a pas de signe, de sorte que −0, +0 et 0 sont identiques. Cependant, en informatique, certaines représentations des nombres admettent l'existence de deux zéros, souvent notés −0 (zéro négatif) et +0 (zéro positif), considérés comme égaux par les opérations de comparaison numérique mais avec des comportements différents possibles dans des opérations particulières. Cela se produit dans les représentations de nombres signés de signe et de magnitude et de complément à un pour les nombres entiers, et dans la plupart des représentations de nombres à virgule flottante . Le nombre 0 est généralement codé comme +0, mais peut être représenté par +0 ou -0.
La norme IEEE 754 pour l'arithmétique à virgule flottante (actuellement utilisée par la plupart des ordinateurs et des langages de programmation prenant en charge les nombres à virgule flottante) nécessite à la fois +0 et -0. L'arithmétique réelle avec des zéros signés peut être considérée comme une variante de la droite des nombres réels étendue telle que 1/−0 = − ∞ et 1/+0 = +∞ ; la division n'est indéfinie que pour ± 0/±0 et ±∞/±∞.
Le zéro signé négativement fait écho au concept d' analyse mathématique consistant à approcher 0 par le bas en tant que limite unilatérale, qui peut être notée x → 0 −, x → 0−, ou x → ↑0. La notation "-0" peut être utilisée de manière informelle pour désigner un nombre négatif qui a été arrondi à zéro. Le concept de zéro négatif a également des applications théoriques en mécanique statistique et dans d'autres disciplines.
On prétend que l'inclusion du zéro signé dans l'IEEE 754 facilite beaucoup l'obtention d'une précision numérique dans certains problèmes critiques,[1] en particulier lors du calcul avec des fonctions élémentaires complexes[2]. D'autre part, le concept de zéro signé va à l'encontre de l'hypothèse générale faite dans la plupart des domaines mathématiques selon laquelle zéro négatif est la même chose que zéro. Les représentations qui autorisent le zéro négatif peuvent être une source d'erreurs dans les programmes, si les développeurs de logiciels ne tiennent pas compte du fait que si les deux représentations zéro se comportent comme égales dans les comparaisons numériques, elles donnent des résultats différents dans certaines opérations.
Représentations
Les formats d'entiers binaires peuvent utiliser divers encodages . Dans le codage en complément à deux largement utilisé, zéro n'est pas signé. Dans une représentation de signe et d'amplitude 1+7 bits pour les nombres entiers, le zéro négatif est représenté par la chaîne de bits 10000000 . Dans une représentation en complément à un sur 8 bits, le zéro négatif est représenté par la chaîne de bits 11111111 . Dans ces trois codages, le zéro positif ou non signé est représenté par 00000000 . Cependant, les deux derniers codages (avec un zéro signé) sont rares pour les formats entiers. Les formats les plus courants avec un zéro signé sont les formats à virgule flottante (formats IEEE 754 ou similaires), décrits ci-dessous.
Dans les formats binaires à virgule flottante IEEE 754, les valeurs nulles sont représentées par l'exposant biaisé et le signifiant, tous deux étant nuls. Le zéro négatif a le bit de signe mis à un. On peut obtenir un zéro négatif comme résultat de certains calculs, par exemple comme résultat d'un sous- dépassement arithmétique sur un nombre négatif (d'autres résultats peuvent également être possibles), ou −1.0×0.0
, ou simplement comme −0.0
.
Dans les formats décimaux à virgule flottante IEEE 754, un zéro négatif est représenté par un exposant étant tout exposant valide dans la plage pour le format, le vrai signifiant étant zéro et le bit de signe étant un.
Propriétés et manipulations
La norme à virgule flottante IEEE 754 spécifie le comportement du zéro positif et du zéro négatif sous diverses opérations. Le résultat peut dépendre des paramètres actuels du mode d'arrondi IEEE .
Notation
Dans les systèmes qui incluent à la fois des zéros signés et non signés, la notation et est parfois utilisé pour les zéros signés.
Arithmétique
L'addition et la multiplication sont commutatives, mais certaines règles spéciales doivent être suivies, ce qui signifie que les règles mathématiques habituelles pour la simplification algébrique peuvent ne pas s'appliquer. le Le signe ci-dessous montre les résultats obtenus en virgule flottante (ce n'est pas l'opérateur d'égalité habituel).
La règle habituelle pour les signes est toujours suivie lors de la multiplication ou de la division :
- (pour différent de ±∞)
- (pour différent de 0)
Il existe des règles spéciales pour ajouter ou soustraire des zéros signés :
- (pour différent de 0)
- (pour tout fini , −0 en arrondissant vers le négatif)
En raison du zéro négatif (et aussi lorsque le mode d'arrondi est vers le haut ou vers le bas), les expressions −(x − y) et (−x) − (−y), pour les variables à virgule flottante x et y, ne peuvent pas être remplacées par y − x . Or (−0) + x peut être remplacé par x en arrondissant au plus proche (sauf quand x peut être un NaN de signalisation ).
Quelques autres règles spéciales :
- [3]
- (suit la règle des signes pour la division)
- (pour non nul , suit la règle des signes pour la division)
- ( Pas un nombre ou une interruption pour une forme indéterminée )
La division d'un nombre non nul par zéro définit l' indicateur de division par zéro et une opération produisant un NaN définit l'indicateur d'opération invalide. Un gestionnaire d'exceptions est appelé s'il est activé pour l'indicateur correspondant.
Comparaisons
Selon l'IEEE 754 standard, zéro négatif et zéro positif doivent être comparés comme égaux aux opérateurs de comparaison (numériques) habituels, comme les opérateurs ==
de C et Java . Dans ces langages, des astuces de programmation spéciales peuvent être nécessaires pour distinguer les deux valeurs :
- Tapez le nombre en un type entier, afin de regarder le bit de signe dans le modèle de bits ;
- en utilisant la fonction ISO C
copysign()
(IEEE 754 opération copySign) pour copier le signe du zéro sur un nombre différent de zéro ; - en utilisant la macro ISO C
signbit()
(IEEE 754 opération isSignMinus) qui renvoie si le bit de signe d'un nombre est défini ; - prendre l'inverse du zéro pour obtenir soit 1/(+0) = +∞ ou 1/(−0) = −∞ (si l'exception de division par zéro n'est pas piégée).
Remarque : la conversion en type intégral ne fonctionnera pas toujours, en particulier sur les systèmes en complément à deux.
Cependant, certains langages de programmation peuvent fournir des opérateurs de comparaison alternatifs qui distinguent les deux zéros. C'est le cas, par exemple, de la méthode equals dans la classe Double
wrapper de Java[4].
En valeurs arrondies
De manière informelle, on peut utiliser la notation "-0" pour une valeur négative qui a été arrondie à zéro. Cette notation peut être utile lorsqu'un signe négatif est significatif ; par exemple, lors de la tabulation des températures Celsius, où un signe négatif signifie en dessous de zéro .
En mécanique statistique
En mécanique statistique, on utilise parfois des températures négatives pour décrire des systèmes à inversion de population, qui peuvent être considérés comme ayant une température supérieure à l'infini positif, car le coefficient d'énergie dans la fonction de répartition de la population est − 1/Température. Dans ce contexte, une température de − 0 est une température (théorique) supérieure à toute autre température négative, correspondant à l'étendue maximale (théorique) concevable d'inversion de population, l'extrême opposé à +0[5].
Notes et références
Références
- William Kahan, "Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing's Sign Bit", in The State of the Art in Numerical Analysis (eds. Iserles and Powell), Clarendon Press, Oxford, 1987.
- William Kahan, Derivatives in the Complex z-plane, p. 10.
- Cowlishaw, « Decimal Arithmetic: Arithmetic operations – square-root », speleotrove.com (IBM Corporation), (consulté le )
- http://java.sun.com/javase/6/docs/api/java/lang/Double.html#equals(java.lang.Object)
- Kittel, Charles and Herbert Kroemer, Thermal Physics (2nd ed.), W. H. Freeman and Company, (ISBN 0-7167-1088-9), p. 462