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

时间:2015-01-02 14:44:29

标签: python floating-point arithmetic-expressions

在原生Python中,不使用NumPy(numpy.nan != numpy.nan)没有NaN,所以我认为Python的浮点==是反身的吗?然后,因为它是对称的(a == b暗示b == a)和传递(如果a==bb==c然后a==c),我们可以说Python's ==float s的等价关系吗?

编辑:好的,所以我了解到一个NaN:float('nan')(感谢@unutbu),它将通过各种操作传播,但是任何本机Python方法都会返回它(而不是没有我通过这项任务介绍它而不是提出例外?

2 个答案:

答案 0 :(得分:46)

==对于所有数字,零,-zero,ininity和-infinity都是反身的,但不适用于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
>>> 

答案 1 :(得分:34)

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

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