Question

I rencontré négative zéro en sortie du 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é, il est vrai donne. Est-il une différence entre 0.0 et -0.0 (je ne leur ont probablement se soucient pas si différente représentation interne, je me soucie seulement de leur comportement dans un programme.) Y at-il des pièges cachés que je devrais être au courant

?
Était-ce utile?

La solution

Départ: -0 (nombre) dans Wikipedia

Fondamentalement IEEE ne définit en fait un zéro négatif

Et par cette définition à toutes fins utiles:

-0.0 == +0.0 == 0

Je suis d'accord avec aaronasterling que -0,0 et +0,0 sont des objets différents. Ce qui les rend égaux (opérateur d'égalité) fait en sorte que les bugs subtils 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'informations à partir des commentaires]

Quand je l'ai dit à toutes fins pratiques, j'avais choisi le mot un peu vite. Je voulais dire la comparaison d'égalité standard.

Je voudrais ajouter plus d'informations et les références à cet égard:

(1) comme référence dit, la comparaison des standards IEEE définit 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. Quand une multiplication ou une division implique un zéro signé, les règles habituelles de signe appliquer dans le calcul du signe de la réponse.

Les opérations telles que divmod, atan2 présente ce comportement. En fait, ATan2 à la définition IEEE tout comme la lib « C » sous-jacent. Voir la référence n ° 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 découvrir à travers la documentation, si les respecte la mise en œuvre avec le comportement IEEE. Il semble également de la discussion qu'il existe des variations subtiles de la plate-forme aussi.

Comment jamais cet aspect (la conformité de définition IEEE) n'a pas été respecté partout. Voir le rejet de PEP 754 (# 3) en raison de manque d'inté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. http://en.wikipedia.org/wiki/Atan2
  3. http://www.python.org/dev/peps/pep-0754 /

Autres conseils

Cela fait une différence dans la fonction atan2() (at moins, dans certaines mises en œuvre). Dans mon Python 3.1 et 3.2 sous Windows (qui est basée sur la mise en œuvre de C sous-jacente, selon la note CPython détails de mise en œuvre près de la fond de la documentation du module math python ):

>>> 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

math.copysign() traite -0.0 et +0.0 différemment, à moins que vous utilisez Python sur un étrange plate-forme:

  

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

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

Oui, il y a une différence entre 0,0 et -0,0 (bien que Python ne me laisse pas le reproduis :-P). Si vous divisez un nombre positif de 0,0, vous obtenez l'infini; si vous divisez le même nombre par -0,0 vous obtenez l'infini.

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

mêmes valeurs, chiffres encore différentes

>>> 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top