négatif zéro en python
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 le -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?
- Il ne donne pas de valeur négative avec python 2.5.4
- Le réel caché piège, c'est quand vous commencez les essais de l'égalité avec les valeurs à virgule flottante. Ils sont imprécises et sujettes à bizarre arrondi divergences.
- Mais il n'a imprimer de valeur négatif sur Python 2.7.1.
- Ce problème est venu dans la vie réelle application gps; longitude légèrement à l'ouest du méridien a été rapporté que des zéro degrés et les x minutes, alors qu'il devrait avoir moins de zéro degré et les x minutes. Mais python ne peut pas représenter les entiers négatifs zéro.
Vous devez vous connecter pour publier un commentaire.
Découvrez -0 (nombre) dans Wikipedia
Essentiellement de l'IEEE en fait de définir un négatif zéro.
Et par cette définition pour tous les usages:
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
[Edit: Plus d'infos sur la base des observations]
Quand j'ai dit à toutes fins pratiques, j'avais choisi le mot plutôt à la hâte. Je voulais standard de comparaison d'égalité.
Comme la référence dit, la norme IEEE définit comparaison de telle sorte que
+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.Opérations comme
divmod
etatan2
présentent ce comportement. En fait,atan2
conforme avec la norme IEEE définition que ne le sous-jacent "C" lib.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.
Cependant cet aspect (IEEE définition de la conformité) n'a pas été respectée partout. Voir le rejet de PEP 754 en raison de l'indifférence! Je ne sais pas si cela a été repris plus tard.
Voir aussi Ce Que Tout Informaticien Devez Savoir À Propos De L'Arithmétique À Virgule Flottante.
atan2
dans Craig McQueen réponse? Je suis d'accord qu'il renvoie True lorsque comparés pour l'égalité, mais si les deux numéros de comportement peut varier, je voudrais savoir quand.Cela fait une différence dans la
atan2()
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 de la bas de l'Pythonmath
documentation du module):math.copysign()
traite-0.0
et+0.0
différemment, sauf si vous utilisez Python sur un drôle de plate-forme:Oui, il y a une différence entre 0.0 et -0.0 (bien que Python ne me permet pas de reproduire :-P). Si vous divisez un nombre positif par 0.0, vous obtenez l'infini positif; 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.
1/0.0
,1/-0.0
.**
a une priorité plus élevée que-
.(-0.0) ** 0
donne1.0
.Mêmes valeurs, mais un nombre différent
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