为什么 float('inf') == float('inf') return True,但是 float('inf') - float('inf') == float('inf') returns 错误?

Why does float('inf') == float('inf') return True, but float('inf') - float('inf') == float('inf') returns False?

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

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

limx→+∞(f(x) ▢ g(x)) 其中 limx→+∞ f(x ) = +∞ 和 limx→+∞ g(x) = +∞, 其中 returns +∞ 如果 ▢ 为 + 或 *, 但未定义 (它可以 return 每个值)如果 ▢ 是 - 或 /.

不过我很纳闷

对比前

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

可以做出,

的结果
float('inf') - float('inf')

会计算。那result is NaN.

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

From a layman's perspective, imagine that I have an infinite number of hotel rooms, each numbered 1, 2, 3, 4, ...

Then I give you all of them. I would have none left, so ∞−∞=0

On the other hand, if I give you all of the odd-numbered ones, then I still have an infinite number left. So ∞−∞=∞.

Now suppose that I give you all of them except for the first seven. Then ∞−∞=7. While this doesn't explain why this is indeterminate, hopefully you can agree that it is indeterminate!

表示 不确定 的最佳数字是 NaN。将 NaN 与任何事物进行比较总是 False,甚至 comparing NaN against itself.

除了这个非常“合乎逻辑”的解释,我们还发现 Python uses IEEE754 表示浮点计算。

您通常需要 buy the IEEE754 specification, but luckily we see some draft version online。恕我直言,相关章节是 7.2:

For operations producing results in floating-point format, the default result of an operation that signals the invalid operation exception shall be a quiet NaN [...]

[...]

d) addition or subtraction or fusedMultiplyAdd: magnitude subtraction of infinities, such as: addition(+∞, −∞)

我认为 python 没有问题。

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


>>> np.inf - np.inf
nan
>>> np.inf == np.inf
True

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

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

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

根据您发布的示例,python 给您的所有答案都是正确的。

请参阅@thomas-weller 的回答,但此外,问题归结为此。因为有多种大小的无穷大,我们 运行 在减法和除法时遇到了问题。

撇开最近的证据,即一些被认为大小不同的无限集实际上大小相同 (Mathematicians Measure Infinities and Find They’re Equal)。

整数列表是无限的,实数列表也是无限的。但是,任意两个相邻整数之间的实数列表也是无限的。

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

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

那么,我们将何去何从:

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") 中的任何一个有多“大”。