58 votes

zéro négatif en python

[Python 3.1]

J'ai rencontré négatif zéro en sortie de python; il est créé par exemple comme suit:

k = 0.0
print(-k)

La sortie sera -0.0.

Cependant, quand je compare l' -k 0.0 pour l'égalité, il donne de Vrai. Quelle est la différence entre 0.0 et -0.0 (je n'ai pas de soins sans doute qu'ils ont différents représentation interne; je ne se soucient que de leur comportement dans un programme.) Est-il caché des pièges, je devrais être au courant?

43voto

pyfunc Points 31088

Découvrez : -0 (nombre) dans Wikipedia

Fondamentalement, IEEE en fait de définir un négatif zéro

Et par cette définition pour tous les besoins :

-0.0 == +0.0 == 0

Je suis d'accord avec aaronasterling que -0.0 et +0,0 sont des objets différents. Faisant d'eux les égaux (opérateur d'égalité) permet de s'assurer que les bogues ne sont pas introduites dans le code. Pensez a * b == c * d

>>> a = 3.4
>>> b =4.4
>>> c = -0.0
>>> d = +0.0
>>> a*c
-0.0
>>> b*d
0.0
>>> a*c == b*d
True
>>> 

[Edit: Plus d'infos sur la base des commentaires]

Quand j'ai dit à toutes fins pratiques, j'avais choisi le mot plutôt à la hâte. Je voulais standard de comparaison d'égalité.

Je voudrais ajouter plus d'informations et de références à ce sujet:

(1) la référence dit, la norme IEEE définit comparaison +0 = -0, plutôt que de -0 < +0. Bien qu'il soit toujours possible d'ignorer le signe de zéro, la norme IEEE ne pas le faire. Lorsqu'une multiplication ou la division implique un signé zéro, l'habitude de signer les règles s'appliquent dans le calcul du signe de la réponse.

Des opérations comme divmod, atan2 présente ce comportement. En fait, atan2 est conforme à la norme IEEE définition que ne le sous-jacent "C" lib. Voir la référence #2 pour la définition.

>>> divmod(-0.0,100)
(-0.0, 0.0)
>>> divmod(+0.0,100)
(0.0, 0.0)

>>> math.atan2(0.0, 0.0) == math.atan2(-0.0, 0.0)
True 
>>> math.atan2(0.0, -0.0) == math.atan2(-0.0, -0.0)
False

Une façon est de trouver par le biais de la documentation, si la mise en œuvre est conforme à la norme IEEE comportement . Il semble également de la discussion qu'il y a de subtiles plate-forme de variations trop.

Comment jamais cet aspect(IEEE définition de la conformité) n'a pas été respecté en tous lieux. Voir le rejet de PEP 754 (#3) en raison de l'indifférence! Je ne sais pas si cela a été repris plus tard.

références :

  1. http://docs.sun.com/source/806-3568/ncg_goldberg.html#924
  2. FPTAN dans http://en.wikipedia.org/wiki/Atan2
  3. http://www.python.org/dev/peps/pep-0754/

20voto

Alex Trebek Points 330

math.copysign() friandises -0.0 et +0.0 différemment, sauf si vous utilisez Python sur un drôle de plate-forme:

math.copysign(x, y)
De retour de x avec le signe de y. Sur une plate-forme qui prend en charge signé zéros, copysign(1.0, -0.0) retours -1.0.

>>> import math
>>> math.copysign(1, -0.0)
-1.0
>>> math.copysign(1, 0.0)
1.0

17voto

Craig McQueen Points 13194

Cela fait une différence dans le atan2() de la fonction (au moins, dans certaines implémentations). Dans mon Python 3.1 et 3.2 sur Windows (qui est basé sur le C sous-jacente de la mise en œuvre, en fonction de la note Disponible détail de l'implémentation près du bas de l'Python math documentation du module):

>>> import math
>>> math.atan2(0.0, 0.0)
0.0
>>> math.atan2(-0.0, 0.0)
-0.0
>>> math.atan2(0.0, -0.0)
3.141592653589793
>>> math.atan2(-0.0, -0.0)
-3.141592653589793

14voto

Chris Jester-Young Points 102876

Oui, il y a une différence entre 0.0 et -0.0 (bien que Python ne me permette pas de le reproduire :-P). Si vous divisez un nombre positif par 0,0, vous obtenez une infinité positive; si vous divisez ce même nombre par -0,0, vous obtenez un infini négatif.

Au-delà de cela, cependant, il n'y a pas de différence pratique entre les deux valeurs.

1voto

buffer Points 2261

Mêmes valeurs, mais nombres différents

 >>> Decimal('0').compare(Decimal('-0'))        # Compare value
Decimal('0')                                   # Represents equality

>>> Decimal('0').compare_total(Decimal('-0'))  # Compare using abstract representation
Decimal('1')                                   # Represents a > b
 

Référence :
http://docs.python.org/2/library/decimal.html#decimal.Decimal.compare http://docs.python.org/2/library/decimal.html#decimal.Decimal.compare_total

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