NaN 上的飞船运算符

9

C++在执行太空船比较操作时,如何处理浮点NaN?我们知道通常的比较总是返回false,那么NaN会发生什么变化呢?

std::numeric_limits<double>::quiet_NaN() <=> std::numeric_limits<double>::quiet_NaN()

1个回答

9
根据cppreference,对于内置的<=>运算符中的浮点参数,该运算符产生类型为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 == 0a <=> b < 0的表达式时,如果ab中有任何一个是NaN,则整个表达式返回false,这是由于NaN的内置行为所致(source)。当然,std::partial_ordering::unordered == std::partial_ordering::unordered成立,否则这种类型将不是很有用。
如果您可以保证不存在病态浮点值,请查看this Q/A,其中包含浮点数包装器,其比较产生std::strong_ordering

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接