web-dev-qa-db-fra.com

zéro négatif dans python

J'ai rencontré un zéro négatif 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 le -k à 0,0 pour l'égalité, cela donne True. Y a-t-il une différence entre 0.0 et -0.0 (Je me fiche qu'ils aient probablement une représentation interne différente; je me soucie seulement de leur comportement dans un programme.) Y a-t-il des pièges cachés dont je devrais être conscient?

49
max

Découvrez: - 0 (nombre) dans Wikipedia

Fondamentalement, l'IEEE définit réellement un zéro négatif

Et par cette définition à toutes fins:

-0.0 == +0.0 == 0

Je suis d'accord avec aaronasterling que -0.0 et +0.0 sont des objets différents. Les rendre égaux (opérateur d'égalité) garantit que les bogues subtils ne sont pas introduits 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
>>> 

[Modifier: Plus d'informations basées sur les commentaires]

Quand j'ai dit à toutes fins pratiques, j'avais choisi la Parole plutôt hâtivement. Je voulais dire une comparaison d'égalité standard.

J'ajouterais plus d'informations et de références à cet égard:

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

Des opérations comme divmod, atan2 présentent ce comportement. En fait, atan2 est conforme à la définition IEEE tout comme la lib "C" sous-jacente. 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 consiste à savoir dans la documentation si l'implémentation est conforme au comportement IEEE. Il ressort également de la discussion qu'il existe également de subtiles variations de plate-forme.

Cependant, cet aspect (conformité à la définition IEEE) n'a pas été respecté partout. Voir le rejet du PEP 754 (# 3) pour désintérêt! 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/
29
pyfunc

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

>>> 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
15
Craig McQueen

math.copysign() traite -0.0 et +0.0 différemment, sauf si vous exécutez Python sur une plateforme étrange:

math. Copysign ( x, y)
Retour x avec le signe y. Sur une plate-forme qui prend en charge les zéros signés, copysign(1.0, -0.0) renvoie -1.0.

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

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 l'infini négatif.

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

11

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.comparehttp://docs.python.org/2 /library/decimal.html#decimal.Decimal.compare_total

1
user