【发布时间】:2017-06-16 22:48:34
【问题描述】:
如果您有一个符合 IEEE754 的浮点实现,那么与 NaN 的任何比较都是 false,甚至是 NaN == NaN,但 +inf == +inf 是 true,为什么?
在我看来,说+inf == +inf 是假的会更有意义,原因:
自然数和有理数的个数,都是无限的,但又不相同。
如果你有
X=1e200和Y=1e300(X 和 Y 都是 64 位双精度),那么x==y是false,但x*1e200==y*1e200是真的true(两者都是+inf),这在数学上是不正确的。对于
NaN,已经需要特殊处理,其中X==X是false,因此实现+inf == +inf返回false不会有更多的实现复杂性。甚至可能更少,因为inf和NaN我们是同一个“指数”。我没有看到任何优势,或者任何需要
+inf == +inf的应用程序。无论如何,您都不应该将任何浮点值与==进行比较。X==Y是通用的然后true,如果X-Y==0是true,但inf-inf是NaN。
编辑
正如 nwellnhof 已经写的:链接的问题:C IEEE-Floats inf equal inf,不一样,有一个问题“为什么语言实现是这样的?”,这里是问题“为什么标准是这样定义的?” . (而且这两个问题都来自同一个用户)
【问题讨论】:
-
@LưuVĩnhPhúc 正如我在对链接问题的回答中指出的那样,我认为这不是重复的。 (为什么我的代码没有达到我的预期 vs. 为什么标准没有按照我的预期定义。)
-
在您的第一个原因中,您似乎将无限集的基数与扩展实线上的点混淆了。两者都恰巧被称为“无穷大”,但实际上彼此毫无关系。 (顺便说一句,自然数集的基数与有理数集的基数相同。)