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)
根据cppreference,对于内置<=>运算符的浮点参数:
[...] 运算符产生类型为 的纯右值
std::partial_ordering。表达式a <=> b产生
std::partial_ordering::less如果a小于bstd::partial_ordering::greater如果 a 大于bstd::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。
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |