如果您有符合IEEE754标准的浮点实现,那么与NaN
的任何比较都是false
,甚至是NaN == NaN
,但+inf == +inf
是true
,为什么呢?
从我的观点来看,说+inf == +inf
是假的更有意义,理由:
自然数和有理数的数字都是无限的,但不一样。
如果你有X=1e200
和Y=1e300
(X和Y都是64位双打),那么x==y
是false
,但是{{1是真x*1e200==y*1e200
(两者都是+ inf),这是数学上不正确的。
对于true
,NaN
为X==X
,已经需要进行特殊处理,因此实施false
的实施复杂度不会太高} return +inf == +inf
。可能更少,因为false
和inf
我们是相同的“指数”。
我认为没有任何优势,或任何需要NaN
这一事实的申请。您不应该将任何浮点值与+inf == +inf
进行比较。
==
为X==Y
,则 true
属于基类X-Y==0
,true
为inf-inf
。
修改
正如nwellnhof所写的那样:链接的问题:C IEEE-Floats inf equal inf,不一样,有一个问题“为什么这种方式的语言实现?”,这里的问题是“为什么标准这样定义? ?”。 (这两个问题都来自同一个用户)
答案 0 :(得分:3)
你可能不得不问一下IEEE 754-1985背后的主要架构师William Kahan,但this answer对这个话题有所了解:
更重要的是,当NaN在8087算术中形式化时,没有isnan()谓词;有必要为程序员提供一种方便有效的方法来检测NaN值,这些值不依赖于编程语言,提供类似isnan()的东西可能需要很多年。我将引用卡汉自己关于这个主题的文章:
如果没有办法摆脱NaNs,它们就像CRAYs上的Indefinites一样无用;一旦遇到一个人,计算将最好停止,而不是无限期地持续到无限期结束。这就是为什么NaN上的某些操作必须提供非NaN结果的原因。哪个操作? ...例外是C谓词“x == x”和“x!= x”,对于每个无限或有限数x [强调添加]分别为1和0 但如果x不是则反向数字(NaN);这些提供了在NaN和谓词IsNaN(x)中缺少单词的语言中NaN和数字 [强调添加]之间唯一简单的区别性区别。
如果+inf
不等于+inf
,则x != x
对NaN的测试不会起作用,因为它也会捕获无穷大。早在1985年,C程序员就可以写下:
#define is_nan(x) ((x) != (x))
#define is_pos_inf(x) ((x) == 1.0/0.0)
#define is_neg_inf(x) ((x) == -1.0/0.0)
使用inf != inf
,您需要以下内容:
#define is_nan(x) (!((x) >= 0) && !((x) <= 0))
#define is_pos_inf(x) ((x) != (x) && (x) > 0.0)
#define is_neg_inf(x) ((x) != (x) && (x) < 0.0)
我可以看到你的观点,我同意从纯粹的数学观点来看+inf != +inf
更正确。但是IMO,它并没有超过实际考虑因素。
自然数和有理数的[集],都是无限的,但[有]不一样[基数]。
这与浮点计算没什么关系。
如果X = 1e200且Y = 1e300(X和Y均为64位双精度),则x == y为假,但x * 1e200 == y * 1e200为真(均为+ inf),这是数学上不正确的。
浮点数学本质上在数学上是不正确的。您可以找到许多有限浮点数,X
,Y
,Z
,X != Y
,其中X <op> Z == Y <op> Z
。< / p>
我没有看到任何优势或任何需要+ inf == + inf这一事实的应用程序。您不应该将任何浮点值与==进行比较。
我也无法看到需要+inf != +inf
的应用程序。
X == Y是真的,如果X-Y == 0为真,但inf-inf是NaN。
这实际上是+inf != +inf
会解决的不一致。但对我来说这似乎是一个小细节。