NaN上的太空飞船运营商

时间:2020-06-30 00:07:04

标签: c++ language-lawyer c++20

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

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

1 个答案:

答案 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 == 0a <=> b < 0之类的表达式时,如果ab为NaN,则整个表达式返回false,这很有意义来自NaN的内置行为(source)。当然,std::partial_ordering::unordered == std::partial_ordering::unordered成立,否则此类型将不是很有用。

如果可以通过其他方式保证没有病理浮点值,请查看this Q/A的比较结果为std::strong_ordering的浮点包装器。