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

Pie*_*ono 4 python infinity

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

\n
    \n
  • float('inf') == float('inf')返回True,
  • \n
  • float('inf') + float('inf') == float('inf')返回True,
  • \n
  • float('inf') * float('inf') == float('inf')返回True,
  • \n
  • float('inf') - float('inf') == float('inf')返回False,
  • \n
  • float('inf') / float('inf') == float('inf')返回False
  • \n
\n

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

\n

lim x\xe2\x86\x92+\xe2\x88\x9e (f(x) \xe2\x96\xa2 g(x)) 其中 lim x\xe2\x86\x92+\xe2\x88\x9e f(x) = +\xe2\x88\x9e 和 lim x\xe2\x86\x92+\xe2\x88\x9e g(x) = +\xe2\x88\x9e,如果 \xe2\x96\ 则返回 +\xe2\x88\x9e xa2 是 + 或 *,但如果 \xe2\x96\xa2 是 - 或 /,则未定义(它可以返回每个值)。

\n

不过我很困惑。

\n

Tho*_*ler 8

比较之前

\n
float(\'inf\') - float(\'inf\') == float(\'inf\')\n
Run Code Online (Sandbox Code Playgroud)\n

可以得到,结果

\n
float(\'inf\') - float(\'inf\')\n
Run Code Online (Sandbox Code Playgroud)\n

将被计算。那个结果是NaN

\n

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

\n
\n

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

\n

然后我把它们全部给你。我不会剩下,所以 \xe2\x88\x9e\xe2\x88\x92\xe2\x88\x9e=0

\n

另一方面,如果我把所有奇数都给你,那么我还剩下无穷多个。所以\xe2\x88\x9e\xe2\x88\x92\xe2\x88\x9e=\xe2\x88\x9e。

\n

现在假设我给你除了前七个之外的所有内容。然后 \xe2\x88\x9e\xe2\x88\x92\xe2\x88\x9e=7。\n虽然这不能解释为什么这是不确定的,但希望你能同意它是不确定的!

\n
\n

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

\n

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

\n

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

\n
\n

对于以浮点格式生成结果的操作,发出无效操作异常信号的操作的默认结果应为安静的 NaN [...]

\n

[...]

\n

d) 加法或减法或 fusedMultiplyAdd:无穷大的幅度减法,如:\naddition(+\xe2\x88\x9e, \xe2\x88\x92\xe2\x88\x9e)

\n
\n