进行太空飞船比较操作时,C ++如何处理浮点NaN?我们知道通常的比较总是返回false,那么NaN会如何改变呢?
std::numeric_limits<double>::quiet_NaN() <=> std::numeric_limits<double>::quiet_NaN()
答案 0 :(得分:4)
根据cppreference,对于内置<=>
运算符的浮点参数:
[...]运算符产生
std::partial_ordering
类型的prvalue。表达式a <=> b
产生
std::partial_ordering::less
,如果a
小于b
std::partial_ordering::greater
,如果a大于b
std::partial_ordering::equivalent
,如果a
等于b
(等效于-0 <=> +0
)std::partial_ordering::unordered
(无<=>
个无序的内容)
因此,简而言之,将<=>
应用于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
的浮点包装器。