为什么 float('inf') == float('inf') 返回 True,但 float('inf') - float('inf') == float('inf') 返回

  • 本文关键字:inf float 返回 True python infinity
  • 更新时间 :
  • 英文 :


为什么在Python中会发生这种情况?

  • float('inf') == float('inf')返回True
  • float('inf') + float('inf') == float('inf')返回True
  • float('inf') * float('inf') == float('inf')返回True
  • float('inf') - float('inf') == float('inf')返回False
  • float('inf') / float('inf') == float('inf')返回False.

如果我考虑限制,我最好的猜测与此操作的结果有关:

LIM x→+∞(f(x) ▢ g(x)) 其中 lim x→+∞ f(x) = +∞ 和 lim x→+∞ g(x) = +∞,如果 ▢ 是 + 或*,则返回+∞,但如果 ▢ 是 - 或/,则未定义(它可以返回每个值)。

不过,我很困惑。

在比较之前

float('inf') - float('inf') == float('inf')

可以做出来,结果

float('inf') - float('inf')

将被计算。这个结果是NaN.

它是NaN,因为无穷大的数量可能不同。在Stack Overflow姊妹网站 Math.SE 上对此进行了解释,称为希尔伯特酒店悖论:

从外行的角度来看,想象一下我有无数个酒店房间,每个房间编号为 1、2、3、4、......

然后我把它们都给你。我什么都没有了,所以 ∞−∞=0

另一方面,如果我把所有的奇数都给你,那么我还有无限的数字。所以 ∞−∞=∞。

现在假设我把除了前七个之外的都给你。然后 ∞−∞=7。 虽然这并不能解释为什么这是不确定的,但希望你能同意它是不确定的!

表示不确定的最佳数字是 NaN。将NaN与任何东西进行比较总是False,甚至将NaN与自身进行比较。

除了这个相当"合乎逻辑"的解释之外,我们发现Python使用IEEE754表示进行浮点计算。

您通常需要购买IEEE754规范,但幸运的是,我们在网上看到了一些草稿版本。恕我直言,相关章节是 7.2:

对于以浮点格式生成结果的操作,表示 无效操作异常应为安静的 NaN [...]

[...]

d) 加减或融合乘加:无穷大的幅度减法,例如: 加法(+∞, −∞)

我不认为这是python的问题。

infinity - infinity是未定义的(数学上),因此它不等于无穷大。

<小时 />
>>> np.inf - np.inf
nan
>>> np.inf == np.inf
True

有道理,我们正在比较相等的对象。

>>> (np.inf - np.inf) == np.inf
False

这也是有道理的,我们正在比较不同的对象。

python给你的所有答案,在你发布的例子中,都是正确的。

请参阅@thomas-weller的回答,但除此之外,问题归结为这一点。因为无限有多种大小,所以我们在减去和除法时遇到了一个问题。

撇开最近的证据,一些被认为大小不同的无限集合实际上是相同的大小(数学家测量无穷大并发现它们是相等的)。

整数列表是无限的,实数的列表也是无限的。然而,任何两个相邻整数之间的实数列表也是无限的。

float("inf")没有机会说"这是无限的"与"这是无限的",所以我们不知道它是哪个。请注意,从这里开始,我将使用两个引用:

  • INF === 无限
  • 无限 === 无限

现在,这会给我们带来什么:

float('inf') == float('inf') ==> True

这似乎是合理的:(INF or INFINF) is equal to (INF or INFINF)

float('inf') + float('inf') == float('inf')

这似乎是合理的:(INF or INFINF) + (INF or INFINF) is equal to (INF or INFINF)

float('inf') * float('inf') == float('inf')

这似乎是合理的:(INF or INFINF) * (INF or INFINF) is equal to (INF or INFINF)

float('inf') - float('inf') == float('inf')

现在我们有点坚持不懈。从概念上讲,我们有很多潜在的答案。给定float('inf') - float('inf')那么0是合理的,就像-INFINFINFINF一样。此结果未定义,因此nan.事实上,正如@thomas-weller指出的那样,几乎任何答案都是合理的。

float('inf') / float('inf') == float('inf')

与上述相同的问题。这个结果是不确定的,因为我们不知道任何float("inf")有多"大"。

最新更新