IEEE754中inf == inf的基本原理是什么?
当你有一个兼容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
是generel那么true
,如果XY==0
是true
,但inf-inf
是NaN
。
编辑
正如nwellnhof所写:链接的问题:C IEEE-Floats inf等于inf,是不一样的,有一个问题“为什么这样的语言实现?”,下面是“为什么用这种方式定义标准? ”。 (并且这两个问题都来自同一个用户)
您可能不得不问IEEE 754-1985背后的主要架构师William Kahan,但是这个答案揭示了这个话题:
更重要的是,当NaN在8087算法中形式化时,没有isnan()谓词; 有必要为程序员提供一种方便而有效的方法来检测NaN值,而这些方法不依赖于提供类似isnan()的编程语言,这可能需要很多年。 我会引用卡汉自己关于这个问题的文章:
如果没有办法摆脱NaNs,它们就像CRAYs上的Indefinites一样无用; 只要遇到一次,计算就会最好停止,而不是无限期地持续到无限期的结论。 这就是为什么NaN上的一些操作必须提供非NaN结果。 哪些操作? ...例外是C谓词“x == x”和“x!= x”, 对于每个无限或有限数x [强调增加],它们分别为1和0 ,但如果x不是数字(NaN)则为相反; 这些提供了在NaN和谓词IsNaN(x)中缺少NaN的语言中NaN和数字 [强调添加] 之间唯一简单的普通区别 。
如果+inf
不等于+inf
,则NaN的x != x
测试将无法工作,因为它也会捕获无穷大。 早在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
更为正确。 但海事组织并没有超过实际考虑。
自然数和有理数的[集合]都是无限的,但[基数]并不相同。
这与浮点计算没有多大关系。
如果你有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
我没有看到任何优势,或任何需要事实+ inf == + inf的应用程序。 反正你不应该用==比较任何浮点值。
我也看不到需要+inf != +inf
的应用程序。
如果XY == 0为真,则X == Y为真,但inf-inf为NaN。
这实际上是+inf != +inf
将解决的不一致。 但对我来说这似乎是一个小细节。