NaN 上的宇宙飞船操作员



在进行宇宙飞船比较操作时,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::greatera 是否大于b
  • std::partial_ordering::equivalent如果a等效于b(-0 <=> +0等效(
  • std::partial_ordering::unordered(NaN<=>任何东西都是无序的(

因此,简而言之,将<=>应用于 NaN 的浮点值会导致std::partial_ordering::unordered

当计算像a <=> b == 0a <=> b < 0这样的表达式时,如果ab是NaN,那么整个表达式返回false,这来自NaN的内置行为(来源(是有意义的。当然,std::partial_ordering::unordered == std::partial_ordering::unordered成立,否则这种类型不会很有用。

如果您可以保证没有病理浮点值,请查看此 Q/A 以了解其比较产生std::strong_ordering的浮点包装器。

最新更新