You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:55:31