Python 的 == 是浮点数的等价关系吗?

Is Python's == an equivalence relation on the floats?

在原生 Python 中,如果不使用 NumPy(numpy.nan != numpy.nan)就没有 NaN,所以我认为 Python 的浮点数 == 是反身的?然后因为它是对称的(a == b 意味着 b == a)和传递的(如果 a==bb==c 那么 a==c),我们可以说 Python的 ==floats?

上的等价关系

编辑:好的,所以我了解到 一个 NaN: float('nan') (感谢@unutbu)它将通过各种操作传播,但是任何原生 Python 方法 return 它(而不是引发异常)而不是我通过这个作业引入它?

float('nan') 存在于本机 Python 和 float('nan') != float('nan') 中。所以不,== 不是 equivalence relation 因为它缺乏自反性:

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

== 对所有数字都是自反的,零、-零、无穷大和-无穷大,但不是 nan。

您可以在原生 Python 中获得 inf-infnan,只需对文字进行算术运算,如下所示。

这些行为正确,如 IEEE 754 且没有数学域异常:

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

1e1000是一个很大的数,所以float和double表示为无穷大。

  • 无穷大等于无穷大
  • 无穷大除以无穷大不是数字
  • 不是数字!=不是数字

Python 中的浮点运算也适用于无穷减无穷等:

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

对于零和负零的情况:

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