在进行宇宙飞船比较操作时,C++如何处理浮点 NaN?我们知道通常的比较总是返回 false,那么这在 NaN 中是如何变化的呢?
std::numeric_limits<double>::quiet_NaN() <=> std::numeric_limits<double>::quiet_NaN()
根据 cpp首选项,在浮点参数的情况下,内置<=>
运算符:
[...]运算符生成类型为
std::partial_ordering
的PR值。表达式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<=>
任何东西都是无序的(
因此,简而言之,将<=>
应用于 NaN 的浮点值会导致std::partial_ordering::unordered
。
当计算像a <=> b == 0
或a <=> b < 0
这样的表达式时,如果a
或b
是NaN,那么整个表达式返回false
,这来自NaN的内置行为(来源(是有意义的。当然,std::partial_ordering::unordered == std::partial_ordering::unordered
成立,否则这种类型不会很有用。
如果您可以保证没有病理浮点值,请查看此 Q/A 以了解其比较产生std::strong_ordering
的浮点包装器。