【问题标题】:Spaceship Operator on NaNNaN 上的宇宙飞船算子
【发布时间】:2020-06-30 00:07:04
【问题描述】:

C++ 在进行飞船比较操作时如何处理浮点 NaN?我们知道通常的比较总是返回 false,那么这与 NaN 有何变化?

std::numeric_limits<double>::quiet_NaN() <=> std::numeric_limits<double>::quiet_NaN()

【问题讨论】:

标签: c++ language-lawyer c++20


【解决方案1】:

根据cppreference,对于内置&lt;=&gt;运算符的浮点参数:

[...] 运算符产生std::partial_ordering 类型的纯右值。表达式a &lt;=&gt; b 产生

  • std::partial_ordering::less 如果a 小于b
  • std::partial_ordering::greater 如果 a 大于 b
  • std::partial_ordering::equivalent 如果a 等价于b-0 &lt;=&gt; +0 等价)
  • std::partial_ordering::unordered(NaN &lt;=&gt; 任何东西都是无序的)

因此,简而言之,将 &lt;=&gt; 应用于 NaN 的浮点值会得到 std::partial_ordering::unordered

当评估像a &lt;=&gt; b == 0a &lt;=&gt; b &lt; 0 这样的表达式时,如果ab 是NaN,那么整个表达式返回false,这从NaN 的内置行为(source )。当然,std::partial_ordering::unordered == std::partial_ordering::unordered 成立,否则这种类型不会很有用。

如果您可以通过其他方式保证不存在病态浮点值,请查看 this Q/A 以获得浮点包装器,其比较结果为 std::strong_ordering

【讨论】:

    猜你喜欢
    • 2021-07-27
    • 2011-01-30
    • 1970-01-01
    • 2011-03-04
    • 2013-12-07
    • 2012-12-14
    • 2010-10-24
    相关资源
    最近更新 更多