【问题标题】:There are 2 kinds of NaN: signaling_NaN, quiet_NaN, and... NAN itself?NaN 有 2 种:signaling_NaN、quiet_NaN 和... NAN 本身?
【发布时间】:2014-05-26 10:54:47
【问题描述】:

我一直认为 NaN 有两种:安静和信号。

但后来我意识到NAN 宏的计算结果都不

在 Visual C++ 中,std::numeric_limits<float>::quiet_NaN() 显示为 1.#QNAN000
在 Visual C++ 中,std::numeric_limits<float>::signaling_NaN() 显示为 1.#QNAN000
然而,在 Visual C++ 中,NAN 显示为 -1.#IND0000... 两者都不是。

  1. 那么,NAN 常量是什么类型的 NaN?是信号还是非信号?

  2. 什么时候应该使用NAN 而不是其他的,什么时候应该避免使用它,为什么?

【问题讨论】:

  • 有两个以上的 NaN 值。特别是,有数百万个信号 NaN 和数百万个安静的 NaN。 They print in different ways.
  • @RaymondChen:我认为您在我重复了 3 次的问题中错过了 "kinds of NaN" 短语。但是谢谢你的链接,我会看看你的博客,看看它是否在谈论 NaN 的“种类”。
  • quiet_NaN() 返回 a 安静的 NaN,但还有其他的。 NAN 宏返回不同的安静 NaN。说 NaN 既不是 quiet_NaN() 也不是 signaling_NaN() 并不意味着它也不是。这只是一个安静的 NaN,与 quiet_NaN 返回的安静 NaN 不同。如果你想知道 NAN 是否在发信号,the documentation says it is quiet

标签: c++ nan


【解决方案1】:

您的机器没有信号NaN。我认为#QNAN 中的Q 代表安静。检查numeric_limits::has_signaling_NaN。至于signaling_NaN,标准是这样说的:

对于 has_signaling_NaN != false 的所有特化都有意义。专业要求 其中 is_iec559 != false。

因此,它可能是必需的,但毫无意义……很自然的做法是提供一个安静的 NaN。

我还没有找到 QNANIND 的权威资源,但它们似乎都是安静的 NaN。可能有数百万个不同的 NaN,每个尾数都有一个。如果我猜的话,IND 可能类似于 ind‍eterminate 值的错误代码,例如0/0。对于通用的 NAN 宏来说,这并不是一个合适的选择,但在以这种方式定义 C 数字绑定之后,他们可能会一直坚持下去。

【讨论】:

  • 所以它们是相同类型的 NAN,只是字符串表示形式不同? +1 谢谢
  • @Mehrdad 由于只有两种“类型”,信令和非信令,并且您的结果似乎表明您的平台上不存在信令,我想您可以说它们是相同的类型。根据Eric Postpischil 的说法,您一针见血:它们仅在字符串表示方面有所不同。
猜你喜欢
  • 2020-07-29
  • 2017-06-22
  • 2016-03-19
  • 2013-07-23
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多