float decimals decimales and python floating-point arithmetic-expressions

decimals - ¿Es Python== una relación de equivalencia en las carrozas?



python truncate float (2)

== es reflexivo para todos los números, cero, -cero, infinito e -infinito, pero no para nan.

Puede obtener inf , -inf y nan en Python nativo simplemente mediante operaciones aritméticas en literales, como a continuación.

Estos se comportan correctamente, como en IEEE 754 y sin excepción de dominio matemático:

>>> 1e1000 == 1e1000 True >>> 1e1000/1e1000 == 1e1000/1e1000 False

1e1000 es un número muy grande, por lo que el flotante y el doble lo representan como infinito.

  • infinito es igual a infinito
  • infinito dividido por infinito no es un número
  • ¡no es un número! = no es un número

La aritmética de punto flotante en Python también funciona bien para infinito menos infinito, etc.

>>> x = 1e1000 >>> x inf >>> x+x inf >>> x-x nan >>> x*2 inf >>> x == x True >>> x-x == x-x False >>>

Y para el caso cero y menos cero:

>>> inf = float("inf") >>> 1/inf 0.0 >>> -1/inf -0.0 >>> -1/inf == 1/inf True >>>

En Python nativo, sin usar NumPy (para lo cual numpy.nan != numpy.nan ) no hay NaN, entonces ¿estoy en lo cierto al pensar que el punto flotante de Python == es reflexivo? Entonces, dado que es simétrica ( a == b implica b == a ) y transitiva (si a==b y b==c luego a==c ), podemos decir que Python == es una relación de equivalencia en el float s?

EDITAR: OK, entonces aprendí que hay un NaN: float(''nan'') (gracias @unutbu) que se propagará a través de varias operaciones, pero cualquier método nativo de Python lo devuelve (en lugar de generar una excepción) sin que yo lo presente. por esta asignación?


float(''nan'') existe en Python nativo y float(''nan'') != float(''nan'') . Entonces, no, == no es una relación de equivalencia ya que carece de reflexividad:

In [40]: float(''nan'') == float(''nan'') Out[40]: False