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

124*_*123 4 floating-point ieee-754

当您有符合 IEEE754 标准的浮点实现时,与NaNis false、 Even NaN == NaN、 but +inf == +infis进行任何比较true,为什么?

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

  • 自然数和实数的个数都是无限的,但并不相同。

  • 如果有X=1e200and Y=1e300(X 和 Y 都是 64 位双精度数),那么x==y也是false, butx*1e200==y*1e200是 true true(都是 +inf),这是数学上不正确的。

  • 已经需要进行特殊处理, for NaN, where X==Xis ,因此实现该returnfalse不会有更多的实现复杂性。也许甚至更少,因为和我们同一个“指数”。+inf == +inffalseinfNaN

  • 我没有看到任何优势,也没有看到任何需要这样的应用程序+inf == +inf。无论如何,您不应该比较任何浮点值==

  • X==Y那么一般的话true,如果X-Y==0true,但是inf-infNaN

编辑

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

nwe*_*hof 5

您可能不得不问 IEEE 754-1985 背后的主要架构师 William Kahan,但这个答案对这个主题有所启发:

\n\n
\n

更重要的是,当 NaN 在 8087 算术中形式化时,还没有 isnan( ) 谓词;有必要为程序员提供一种方便而有效的方法来检测 NaN 值,这种方法不依赖于编程语言提供像 isnan( ) 这样的东西,这可能需要很多年。我\xe2\x80\x99ll引用Kahan\xe2\x80\x99自己关于这个主题的写作:

\n\n
\n

如果没有办法摆脱 NaN,它们就会像 CRAY 上的不定式一样毫无用处;一旦遇到一个,最好停止计算,而不是无限期地继续计算以获得不确定的结论。这就是为什么对 NaN 的某些操作必须提供非 NaN 结果的原因。哪些操作?\xe2\x80\xa6 例外的是 C 谓词 \xe2\x80\x9c x == x \xe2\x80\x9d 和 \xe2\x80\x9c x != x \xe2\x80\x9d,它们分别是 1 和对于每个无限或有限数 x [强调] 为0 ,但如果 x 不是数字 ( NaN ),则相反;在缺少 NaN 单词和谓词 IsNaN(x) 的语言中,它们提供了NaN 和数字 [强调] 之间唯一简单的区别。

\n
\n
\n\n

如果+inf不等于+infx != x则对 NaN 的测试将不起作用,因为它也会捕获无穷大。早在 1985 年,C 程序员就可以这样写:

\n\n
#define is_nan(x)     ((x) != (x))\n#define is_pos_inf(x) ((x) ==  1.0/0.0)\n#define is_neg_inf(x) ((x) == -1.0/0.0)\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用inf != inf,您需要类似的东西:

\n\n
#define is_nan(x)     (!((x) >= 0) && !((x) <= 0))\n#define is_pos_inf(x) ((x) != (x) && (x) > 0.0)\n#define is_neg_inf(x) ((x) != (x) && (x) < 0.0)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以理解你的观点,并且我同意+inf != +inf从纯粹数学的角度来看,拥有更正确。但在我看来,这并没有超过实际的考虑。

\n\n
\n

自然数和有理数的[集合]都是无限的,但[具有]不同的[基数]。

\n
\n\n

这与浮点计算没有太大关系。

\n\n
\n

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

\n
\n\n

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

\n\n
\n

我没有看到任何优势,也没有看到任何需要 +inf == +inf 的应用程序。无论如何,您不应该将任何浮点值与 == 进行比较。

\n
\n\n

我也看不到需要+inf != +inf.

\n\n
\n

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

\n
\n\n

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

\n

  • 在一些[早期写作](http://www.dtic.mil/cgi-bin/GetTRDoc?AD=AD0769124)中,Kahan指出,没有一致的方法来处理无穷大:INF的某些实例实际上是无穷大(例如1/0),而其他的是溢出的结果(如提问者的例子)。我想说这与围绕零的问题是相同的:要么是“干净的”零,要么是下溢的结果。10,000ft 的问题是,每个浮点数都可以准确地表示一个数学量,或者表示一个区间,而在执行给定的浮点运算时,通常我们不知道它是什么。 (3认同)
  • 除了询问卡汉教授之外,这是最好的选择。IEEE FP 标准的早期草案规定了关于无穷大的“投影模式”,其中只有 INF 而没有符号。在该模式下,INF 和有限数之间的比较返回“无序”,但 INF 比较仍等于 INF。惠普的 Fraley &amp; Walther 提出了一项与 KCS (Kahan-Coonen-Stone) 提案相竞争的提案,该提案以不同的方式处理溢出,详细信息*可能*位于文档“溢出和下溢情况的安全处理”中,我可以'网上找不到,也没有纸质版。 (2认同)