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

xnx*_*xnx 35 python floating-point arithmetic-expressions

在原生Python中,没有使用NumPy(为此numpy.nan != numpy.nan)没有NaN,所以我认为Python的浮点==是反身的吗?那么既然它是对称的(a == b暗示的b == a)和传递的(if a==bb==cthen a==c),我们可以说Python ==floats 上的等价关系吗?

编辑:好的,让我了解到,有一个楠:float('nan')(感谢@unutbu)将通过各种操作传播,但任何原生的Python方法返回它(而不是抛出一个异常),如果没有我在这项任务中引入了吗?

use*_*016 46

== 对于所有数字,零,零,无穷大和无穷大都是反身的,但不适用于南方.

您可以通过对文字的算术运算来获取inf,-infnan本机Python,如下所示.

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

>>> 1e1000 == 1e1000
True
>>> 1e1000/1e1000 == 1e1000/1e1000
False
Run Code Online (Sandbox Code Playgroud)

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
>>> 
Run Code Online (Sandbox Code Playgroud)

对于零和零的情况:

>>> inf = float("inf")
>>> 1/inf
0.0
>>> -1/inf
-0.0
>>> -1/inf == 1/inf
True
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 为了完整起见,包含构成等价关系的(简短)公理列表可能会有所帮助.而且,你从未真正明确地说它不是等价关系,你只是说它对于"nan"不是反身的. (2认同)

unu*_*tbu 34

float('nan')存在于本机Python和float('nan') != float('nan').所以不,==不是等价关系,因为它缺乏反身性:

In [40]: float('nan') == float('nan')
Out[40]: False
Run Code Online (Sandbox Code Playgroud)