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

当你有一个兼容IEEE754的浮点实现,那么与NaN任何比较都是false ,甚至NaN == NaN ,但是+inf == +inftrue ,为什么?

从我的角度来看,说+inf == +inf是错误的原因会更有意义:

  • 自然数和有理数的数量都是无限的,但不一样。

  • 如果你有X=1e200Y=1e300 (都是,X和Y是64位双精度),所以x==yfalse ,但是x*1e200==y*1e200true (都是+ inf),这是数学不正确的。

  • 对于NaN ,已经有了一个特殊的处理,其中X==Xfalse ,所以实现+inf == +inf返回false不会有太多的实现复杂性。 也许更少,因为infNaN我们是相同的“指数”。

  • 我没有看到任何优势,或任何需要事实+inf == +inf应用程序。 反正你不应该用==比较任何浮点值。

  • X==Y是generel那么true ,如果XY==0true ,但inf-infNaN

  • 编辑

    正如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),这是数学不正确的。

    浮点数学在本质上是数学上不正确的。 您可以找到许多有限的浮点数, XYZ ,其中X != Y ,其中X <op> Z == Y <op> Z

    我没有看到任何优势,或任何需要事实+ inf == + inf的应用程序。 反正你不应该用==比较任何浮点值。

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

    如果XY == 0为真,则X == Y为真,但inf-inf为NaN。

    这实际上是+inf != +inf将解决的不一致。 但对我来说这似乎是一个小细节。

    链接地址: http://www.djcxy.com/p/58505.html

    上一篇: What is the rationale for inf==inf in IEEE754

    下一篇: 754 decide NaN != NaN despite being illogical?