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==0是true,但是inf-inf是NaN。
编辑
正如 nwellnhof allready 所写:链接的 Question: C IEEE-Floats inf equal inf,是不一样的,有一个问题“为什么语言实现是这样的?”,这是问题“为什么标准是这样定义的?” ”。(这两个问题都来自同一用户)
您可能不得不问 IEEE 754-1985 背后的主要架构师 William Kahan,但这个答案对这个主题有所启发:
\n\n\n\n\n更重要的是,当 NaN 在 8087 算术中形式化时,还没有 isnan( ) 谓词;有必要为程序员提供一种方便而有效的方法来检测 NaN 值,这种方法不依赖于编程语言提供像 isnan( ) 这样的东西,这可能需要很多年。我\xe2\x80\x99ll引用Kahan\xe2\x80\x99自己关于这个主题的写作:
\n\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
如果+inf不等于+inf,x != x则对 NaN 的测试将不起作用,因为它也会捕获无穷大。早在 1985 年,C 程序员就可以这样写:
#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)\nRun Code Online (Sandbox Code Playgroud)\n\n使用inf != inf,您需要类似的东西:
#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)\nRun 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
浮点数学本质上是不正确的。您可以找到许多有限浮点数,X, Y, Z, 和X != Y, 其中X <op> Z == Y <op> Z。
\n\n\n我没有看到任何优势,也没有看到任何需要 +inf == +inf 的应用程序。无论如何,您不应该将任何浮点值与 == 进行比较。
\n
我也看不到需要+inf != +inf.
\n\n\n如果 XY==0 为真,则 X==Y 为 [...] 真,但 inf-inf 为 NaN。
\n
这实际上是一个+inf != +inf可以解决的不一致问题。但这对我来说似乎只是一个小细节。
| 归档时间: |
|
| 查看次数: |
743 次 |
| 最近记录: |