IEEE754中inf == inf的原理是什么?

分类: bt365彩票官方app 时间: 2025-12-04 18:52:38 作者: admin

你可能需要问IEEE 754-1985的首席架构师William Kahan,但是这个答案解释了一些该主题的问题。更重要的是,当NaN在8087算术中被正式化时,没有isnan()谓词,因此需要为程序员提供一种方便有效的方法来检测NaN值。如果不依赖于编程语言提供类似于isnan()的东西,将需要很多年才能实现。我会引用Kahan本人关于这个主题的文章:

如果没有办法摆脱NaNs,它们就像CRAY上的Indefinites一样无用;只要遇到一个NaN,计算最好停止,而不是无限时间地继续计算到Indefinite结论。这就是为什么一些操作NaNs必须产生非NaN结果的原因。哪些操作呢?…例外情况是C谓词“x == x”和“x != x”,分别为1和0对于每一个无穷或有穷数x [强调添加],但如果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 更加正确。但是在实际应用中,我认为这并不比实际考虑更重要。

自然数和有理数集都是无限的,但它们的基数是不同的。

这与浮点数计算关系不大。

如果你有 X=1e200 和 Y=1e300 (X和Y都是64位双精度浮点数),那么 x==y 是false,但是 x*1e200==y*1e200是true(它们都是+inf),这在数学上是不正确的。

浮点数计算本质上就是不正确的。你可以找到许多“有限”的浮点数X、Y、Z,使得 X Z == Y Z,而 X != Y。

我没有看到任何优势,或者任何需要 +inf == +inf 的应用。你不应该使用 == 来比较任何浮点数。

我也没看到需要 +inf != +inf 的应用程序。

如果 X-Y==0 为true,则 X==Y 为 true,但 inf-inf 是 NaN。

实际上,+inf != +inf 可以解决这个不一致性。但对我来说,这似乎是个小问题。