NaN 上的宇宙飞船运算符

9 c++ nan language-lawyer spaceship-operator c++20

在进行太空船比较操作时,C++ 如何处理浮点 NaN?我们知道通常的比较总是返回 false,那么 NaN 会如何改变呢?

std::numeric_limits<double>::quiet_NaN() <=> std::numeric_limits<double>::quiet_NaN()
Run Code Online (Sandbox Code Playgroud)

alt*_*gel 9

根据cppreference,对于内置<=>运算符的浮点参数:

[...] 运算符产生类型为 的纯右值std::partial_ordering。表达式a <=> b产生

  • std::partial_ordering::less如果a小于b
  • std::partial_ordering::greater如果 a 大于b
  • std::partial_ordering::equivalentifa等于b-0 <=> +0等于)
  • std::partial_ordering::unordered(NaN<=>任何内容都是无序的)

因此,简而言之,应用<=>到 NaN 浮点值会产生std::partial_ordering::unordered

a <=> b == 0当计算像or 这样的表达式时a <=> b < 0,如果aor之一b是 NaN ,那么整个表达式返回false,这来自 NaN 的内置行为()。当然,std::partial_ordering::unordered == std::partial_ordering::unordered这是正确的,否则这种类型不会很有用。

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