C++在执行太空船比较操作时,如何处理浮点NaN?我们知道通常的比较总是返回false,那么NaN会发生什么变化呢?
std::numeric_limits<double>::quiet_NaN() <=> std::numeric_limits<double>::quiet_NaN()
C++在执行太空船比较操作时,如何处理浮点NaN?我们知道通常的比较总是返回false,那么NaN会发生什么变化呢?
std::numeric_limits<double>::quiet_NaN() <=> std::numeric_limits<double>::quiet_NaN()
<=>
运算符中的浮点参数,该运算符产生类型为std::partial_ordering
的prvalue。 表达式a <=> b
产生:a
小于b
,则产生std::partial_ordering::less
- 如果a
大于b
,则产生std::partial_ordering::greater
- 如果a
等于b
(-0 <=> +0
是等效的),则产生std::partial_ordering::equivalent
- 如果使用NaN作为参数,则产生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
成立,否则这种类型将不是很有用。std::strong_ordering
。