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

时间:2017-01-31 13:17:00

标签: floating-point ieee-754

如果您有符合IEEE754标准的浮点实现,那么与NaN的任何比较都是false,甚至是NaN == NaN,但+inf == +inftrue,为什么呢?

从我的观点来看,说+inf == +inf是假的更有意义,理由:

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

  • 如果你有X=1e200Y=1e300(X和Y都是64位双打),那么x==yfalse,但是{{1是真x*1e200==y*1e200(两者都是+ inf),这是数学上不正确的。

  • 对于trueNaNX==X,已经需要进行特殊处理,因此实施false的实施复杂度不会太高} return +inf == +inf。可能更少,因为falseinf我们是相同的“指数”。

  • 我认为没有任何优势,或任何需要NaN这一事实的申请。您不应该将任何浮点值与+inf == +inf进行比较。

  • 如果==X==Y,则
  • true属于基类X-Y==0trueinf-inf

修改

正如nwellnhof所写的那样:链接的问题:C IEEE-Floats inf equal inf,不一样,有一个问题“为什么这种方式的语言实现?”,这里的问题是“为什么标准这样定义? ?”。 (这两个问题都来自同一个用户)

1 个答案:

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

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

  

我没有看到任何优势或任何需要+ inf == + inf这一事实的应用程序。您不应该将任何浮点值与==进行比较。

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

  

X == Y是真的,如果X-Y == 0为真,但inf-inf是NaN。

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