77 votes

Pourquoi les nombres à virgule flottante ont-ils des zéros signés ?

Pourquoi les doubles ont -0 ainsi que +0 ? Quel est le contexte et la signification ?

89voto

arshajii Points 65653

-0 est (généralement) traité comme 0 *******. Cela peut se produire lorsqu'un négatif nombre à virgule flottante est si proche de zéro qu'il peut être considéré comme 0 (pour être clair, je fais référence à dépassement de capacité arithmétique et les résultats des calculs suivants sont interprétés comme étant exactement ±0 et non pas seulement des nombres très faibles), par exemple

System.out.println(-1 / Float.POSITIVE_INFINITY);

\-0.0

Si nous considérons le même cas avec un positif numéro, nous recevrons notre bon vieux 0 :

System.out.println(1 / Float.POSITIVE_INFINITY);

0.0

******* Voici un cas où l'utilisation de -0.0 donne un résultat différent de celui obtenu en utilisant 0.0 :

System.out.println(1 / 0.0);
System.out.println(1 / -0.0);

Infinity
-Infinity

Ceci est logique si l'on considère la fonction 1 / x . Comme x approches 0 de la + -côté, nous devrions obtenir positif l'infini, mais lorsqu'il s'approche de la - -côté, nous devrions obtenir négatif l'infini. Le graphique de la fonction doit le montrer clairement :

( source )

En termes de mathématiques :

enter image description here

enter image description here

Cela illustre une différence importante entre 0 y -0 au sens computationnel du terme.


Voici quelques ressources pertinentes, dont certaines ont déjà été évoquées. Je les ai incluses par souci d'exhaustivité :

31voto

dreamcrash Points 8227

De Wikipedia

Un zéro signé est un zéro avec un signe associé. En arithmétique ordinaire, −0 = +0 = 0 . En informatique, il existe le concept de l'existence de deux zéros dans certaines représentations numériques, généralement désignées par −0 et "+0", représentant zéro négatif y +0 zéro positif , respectivement ( source ).

Cela se produit dans le signe et la magnitude et le complément à un. signé représentations de nombres pour les nombres entiers, et dans la plupart des systèmes à virgule flottante et dans la plupart des représentations de nombres à virgule flottante. Le nombre 0 est généralement encodé comme +0, mais peut être représenté par +0 ou -0.

Selon le IEEE 754 standard , zéro négatif et zéro positif devraient comparer comme égal avec la comparaison habituelle (numérique) comme les opérateurs == de C et Java. ( source ).

Lorsque vous avez un opération en virgule flottante qui produit un résultat qui est un virgule flottante négative numéro proche de zéro mais cela peut ne pas être représenté (par l'ordinateur), il produit un "-0.0". Par exemple - 5.0 / Float.POSITIVE_INFINITY -> -0.0 .

Cette distinction entre -0.0 y +0.0 donne à l'utilisateur final plus d'informations que le simple affichage du résultat final de l'opération. 0 . Naturellement, un tel concept est vraiment seulement utile dans les systèmes ayant une limite de représentation numérique finie, comme ceux des ordinateurs. En mathématiques, on peut représenter n'importe quel nombre, quelle que soit sa proximité avec le zéro.

−0 y +0 sont le résultat d'opérations mathématiques réalisées par des ordinateurs qui causent débordements similaire à celui de l −00 o +00 qui résultent d'opérations qui causent un débordement . Pour les opérations qui provoquent des indétermination le résultat est NaN ( par exemple, 0/0).

Quelle est la différence entre -0.0 et 0.0 ?

En réalité, les deux représentent 0 . En outre, (-0,0 == 0,0) renvoie vrai . Néanmoins :

  1. 1/-0.0 produit -Infinity tandis que 1/0.0 produit Infinity .

  2. 3 * (+0) = +0 y +0/-3 = -0 . Le site règles de signalisation s'applique, lors de l'exécution de multiplications ou de divisions sur un zéro signé.

Lecture obligatoire " Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante ".

25voto

Patricia Shanahan Points 11270

Voir la section "Zéro signé" dans le document Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante

Les zéros dans les flottants et les doubles de Java ne représentent pas seulement le vrai zéro. Ils sont également utilisés comme résultat pour tout calcul dont le résultat exact a une magnitude trop faible pour être représenté. Il existe une grande différence, dans de nombreux contextes, entre le dépassement inférieur d'un nombre négatif et le dépassement inférieur d'un nombre positif. Par exemple, si x est un nombre positif de très faible amplitude, 1/x devrait être une infinité positive et 1/(-x) devrait être l'infini négatif. Le zéro signé préserve le signe des résultats de l'underflow.

9voto

Stephen Canon Points 58003

La référence canonique pour l'utilité des zéros signés en virgule flottante est l'article de Kahan " Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing's Sign Bit (en anglais) "(et certaines de ses conférences sur le sujet).

La version courte est que dans les applications d'ingénierie raisonnablement courantes, l'information de signe qui est préservée par la signature du zéro est nécessaire pour obtenir des solutions correctes à partir de méthodes numériques. Le signe du zéro n'a que peu de signification pour la plupart des real mais lorsque l'on considère des fonctions à valeurs complexes ou que l'on utilise des mappages conformes, le signe du zéro peut soudainement devenir très critique.

Il est également intéressant de noter que l'original (1985) IEEE-754 Le comité a envisagé, et rejeté, de soutenir un projectif pour les opérations en virgule flottante, dans lequel il n'y aurait qu'un seul infini non signé (+/-0 serait sémantiquement identique dans un tel mode, donc même s'il y avait encore deux codages, il n'y aurait qu'un seul zéro également).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X