decimals - cero negativo en python
python truncate float (5)
Consulte: -0 (número) en Wikipedia
Básicamente IEEE realmente define un cero negativo
Y según esta definición para todos los propósitos:
-0.0 == +0.0 == 0
Estoy de acuerdo con el hecho de que -0.0 y +0.0 son diferentes objetos. Hacerlos iguales (operador de igualdad) asegura que no se introduzcan errores sutiles en el código. Piensa en 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
>>>
[Editar: Más información basada en comentarios]
Cuando dije para todos los propósitos prácticos, había elegido la palabra bastante precipitadamente. Me refiero a la comparación de igualdad estándar.
Agregaría más información y referencias a este respecto:
(1) Como dice la referencia, el estándar IEEE define la comparación de modo que +0 = -0, en lugar de -0 <+0. Aunque sería posible ignorar siempre el signo de cero, el estándar IEEE no lo hace. Cuando una multiplicación o división implica un cero con signo, las reglas de signo habituales se aplican al calcular el signo de la respuesta.
Operaciones como divmod, atan2 exhibe este comportamiento. De hecho, atan2 cumple con la definición de IEEE como lo hace la lib de "C" subyacente. Ver la referencia # 2 para la definición.
>>> 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
Una forma es averiguar a través de la documentación, si la implementación cumple con el comportamiento IEEE. También parece de la discusión que también hay variaciones sutiles en la plataforma.
Sin embargo, este aspecto (cumplimiento de la definición IEEE) no se ha respetado en todos los aspectos. ¡Vea el rechazo de PEP 754 (# 3) debido al desinterés! No estoy seguro si esto fue recogido más tarde.
referencias:
[Python 3.1]
Encontré cero negativo en el resultado de Python; se crea, por ejemplo, de la siguiente manera:
k = 0.0
print(-k)
La salida será -0.0
.
Sin embargo, cuando comparo -k
con 0.0 para igualdad, arroja True. ¿Hay alguna diferencia entre 0.0
y -0.0
(no me importa que presumiblemente tengan una representación interna diferente, solo me importa su comportamiento en un programa). ¿Hay alguna trampa oculta que deba tener en cuenta?
Hace una diferencia en la función atan2()
(al menos, en algunas implementaciones). En mi Python 3.1 y 3.2 en Windows (que se basa en la implementación C subyacente, de acuerdo con la nota detalle de implementación de CPython cerca de la parte inferior de la documentación del módulo 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
Los mismos valores, pero diferentes números
>>> 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
Referencia:
http://docs.python.org/2/library/decimal.html#decimal.Decimal.compare http://docs.python.org/2/library/decimal.html#decimal.Decimal.compare_total
Sí, hay una diferencia entre 0.0 y -0.0 (aunque Python no me deja reproducirlo :-P). Si divide un número positivo por 0.0, obtiene un infinito positivo; si divides ese mismo número por -0.0 obtendrás un infinito negativo.
Más allá de eso, sin embargo, no hay diferencia práctica entre los dos valores.
math.copysign()
trata a -0.0
y +0.0
diferente, a menos que esté ejecutando Python en una plataforma extraña:
math.
copysign ( x , y )
Devuelve x con el signo de y . En una plataforma que admite ceros concopysign(1.0, -0.0)
,copysign(1.0, -0.0)
devuelve-1.0
.
>>> import math
>>> math.copysign(1, -0.0)
-1.0
>>> math.copysign(1, 0.0)
1.0