C++三路比较运算符(<=>)对浮点类型NaN的处理规则问询
C++三路比较运算符处理浮点NaN的规则
C++20引入的三路比较运算符(operator<=>)对double/float类型的NaN处理是标准明确规定的合理行为,既不是未定义行为(UB),也不是未指定行为,具体规则如下:
- 只要比较的操作数中包含NaN(一个是NaN,或两个都是NaN),
operator<=>就会返回std::partial_ordering::unordered,表示这两个值无法进行全序比较。 - 非NaN的正常浮点数值之间的比较,完全符合IEEE 754标准的预期逻辑:相等的有限值返回
std::partial_ordering::equivalent,正无穷大于所有有限值,负无穷小于所有有限值等。
需要注意的是,浮点类型的三路比较返回的是std::partial_ordering类型(而非整数或布尔值),你需要通过该类型的常量(less、greater、equivalent、unordered)来判断比较结果。
简单代码示例:
#include <compare> #include <iostream> int main() { double nan_val = NAN; double pi = 3.14; double another_nan = NAN; auto res_nan_pi = nan_val <=> pi; if (res_nan_pi == std::partial_ordering::unordered) { std::cout << "NaN与普通浮点数无法比较" << std::endl; } auto res_nan_nan = nan_val <=> another_nan; if (res_nan_nan == std::partial_ordering::unordered) { std::cout << "两个NaN无法比较" << std::endl; } return 0; }
内容的提问来源于stack exchange,提问作者levzettelin
相关产品推荐
相关产品推荐

