【发布时间】: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
C++ 在进行飞船比较操作时如何处理浮点 NaN?我们知道通常的比较总是返回 false,那么这与 NaN 有何变化?
std::numeric_limits<double>::quiet_NaN() <=> std::numeric_limits<double>::quiet_NaN()
【问题讨论】:
标签: c++ language-lawyer c++20
根据cppreference,对于内置<=>运算符的浮点参数:
[...] 运算符产生
std::partial_ordering类型的纯右值。表达式a <=> b产生
std::partial_ordering::less如果a小于bstd::partial_ordering::greater如果 a 大于bstd::partial_ordering::equivalent如果a等价于b(-0 <=> +0等价)std::partial_ordering::unordered(NaN<=>任何东西都是无序的)
因此,简而言之,将 <=> 应用于 NaN 的浮点值会得到 std::partial_ordering::unordered。
当评估像a <=> b == 0 或a <=> b < 0 这样的表达式时,如果a 或b 是NaN,那么整个表达式返回false,这从NaN 的内置行为(source )。当然,std::partial_ordering::unordered == std::partial_ordering::unordered 成立,否则这种类型不会很有用。
如果您可以通过其他方式保证不存在病态浮点值,请查看 this Q/A 以获得浮点包装器,其比较结果为 std::strong_ordering。
【讨论】: