【问题标题】:equal to operator == can be used to do checking bit ?等于运算符 == 可以用来做校验位吗?
【发布时间】:2011-12-09 16:37:11
【问题描述】:

函数的目的是什么?

 bool whatIsIt(double n)
 {
    return n == n;
 }

它可以用来检查 n 中的每一位吗?

我对此表示怀疑。

感谢任何 cmets。

【问题讨论】:

  • 严格来说,标准没有说。这取决于浮点数学在您的平台上的运行方式。
  • 我会说它检查了 n 是一个数字与例如 NaN
  • 这种布尔函数的技术术语是“重言式”;)顺便说一句:“不是数字”是一个合法的 IEEE 浮点值......它不等于任何其他浮点点值 - 包括它自己。
  • @paulsm4 :通常是正确的,但浮点类型是“特殊的”,所以在这种情况下它不是正确的。
  • @Billy :仅这一点就使它们总是很特别,不是吗? ;-]

标签: c++ c operators bit-manipulation equality


【解决方案1】:

它可用于检查 n 是否为 NaN(不是数字),因为 NaN 不与自身比较。

这可能是一种有限且不完全可靠的方法。 (参见 Billy 的各种 cmets)C99 和 C++11 具有 isnan() 函数。

【讨论】:

  • +1 -- 强调“可以” -- 我们不确定。取决于架构/平台/设置/编译器/等。
  • C99 也有 isnan() (大概是 C++11 继承它的地方)。
【解决方案2】:

它可能用于检测 NaN(它们从不等于任何东西,甚至是彼此)——尽管这取决于您的特定编译器/平台/设置/等。严格来说,该标准并没有说明如何处理浮点数学。

【讨论】:

  • 但 C 确实指定了 NaNs 的关系处理方式,假设实现#defines __STDC_IEC_559__
  • @MSN:那只是 C99。问题是 C 和 C++,这通常意味着“C++ 和 C 子集”——它们都没有指定任何类型的 __STDC_IEC_559__。 (如果问题被标记为“C”或“C99”当然会有所不同......)
  • @MSN:不过,公平地说,我还没有拿到 C++11 标准的副本,因为 ANSI 还没有摆脱它,而我没有不想花 300 美元买一个标准的 ANSI 卖 18 美元....(此外,如果没有定义常量,那么任何事情都是公平的)
【解决方案3】:

不,这不是“检查位”。

我猜它正在检查“NaN”。如果输入是 NaN,它将返回 FALSE,如果它是任何其他浮点值,则返回 TRUE。

【讨论】:

    【解决方案4】:

    这在附录 F 的 C 标准中指定:60559 浮点算术,特别是 F.8.3 关系运算符:

    ...如果xNaN,则声明x != x 为真

    ...如果xNaN,则声明x == x 为假

    如果__STDC_IEC_559__#defined,那么如果nNaN,则此函数将返回false。

    【讨论】:

    • +1 -- 无论如何都适用于 C99。至少我能够拿到 TC3 草案
    【解决方案5】:

    该函数检查一个数字是否具有可比性。

    这对于用作排序函数的键或用于搜索的值非常重要。排序中使用的比较期望如果 A

    从技术上讲,排序要求称为strict weak ordering

    无法找到集合中具有不可比较值的元素。包含不可比较值的列表是不可排序的。此外,优化的实现可能会退出正在排序的数组并开始破坏内存,或者可能永远不会终止。

    我知道的唯一不可比较的双精度值是 NaN。正如其他人指出的那样,如果将 NaN 用作whatIsIt() 的参数,它将返回 false。如果 NaN 是您比较的数字的可能值,那么您必须处理它,否则可能会发生坏事。

    this 维基百科文章中提到了 std::map 和 NaN 的问题。

    您可以构造一个比较来将 NaN 排序到列表中的给定位置,但您不能仅使用内置运算符来做到这一点。相反,你会做类似的事情

    if ( A < B ) then return -1;
    else if ( B < A ) then return 1;
    else return whatIsIt(A) - whatIsIt(B);
    

    顺便说一句,在 SQL 中,NULL 也无法在兼容的实现中进行比较。

    其中的奥秘在于为什么不使用 isnan(),除非这是一个面试问题或其他问题。

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多