0

0

C++ 怎么判断NAN C++ isnan函数检测非数字值【数值】

尼克

尼克

发布时间:2026-03-16 21:11:56

|

410人浏览过

|

来源于php中文网

原创

最标准方式是用 std::isnan,需包含 <cmath> 且参数为浮点类型;整型须先转 double,float 推荐用 isnanf;x != x 虽可行但不推荐,因可读性差、受编译器优化影响且无法区分 NaN 类型。

c++ 怎么判断nan c++ isnan函数检测非数字值【数值】

怎么用 std::isnan 判断一个浮点数是不是 NaN

直接调用 std::isnan 是最标准的方式,但它只接受浮点类型(floatdoublelong double),不能传整数或指针。传错类型会编译失败,比如 std::isnan(0)std::isnan(x)(当 xint)都不行。

需要确保变量是浮点类型,且包含 <cmath> 头文件:

#include <cmath>
#include <iostream>

double x = std::nan("");
std::cout << std::isnan(x) << "\n"; // 输出 1
  • 如果变量是 intlong 等整型,先显式转成 double 再判断,比如 std::isnan(static_cast<double>(n))
  • float 值,推荐用 std::isnanf(更精确匹配,避免隐式提升)
  • 注意:C++11 起才保证 std::isnan 是 constexpr,旧标准下不能用于常量表达式

为什么 x != x 也能判断 NaN,但不推荐日常使用

IEEE 754 规定 NaN 不等于任何值,包括它自己,所以 x != x 成立时 x 一定是 NaN。这个表达式无需函数调用、无头文件依赖、编译期可求值。

但它有明显缺陷:

立即学习C++免费学习笔记(深入)”;

会译·对照式翻译
会译·对照式翻译

会译是一款AI智能翻译浏览器插件,支持多语种对照式翻译

下载
  • 可读性差,新成员或审查者可能看不懂这行在干什么
  • 部分编译器在开启 -ffast-math(如 GCC/Clang)时会优化掉该判断,认为 x != x 永远为 false
  • 无法区分 quiet NaN 和 signaling NaN,而 std::isnan 对两者都返回 true

std::isnan 在不同平台和编译器下的行为差异

绝大多数现代平台(x86/x64、ARM64、Linux/macOS/Windows + GCC/Clang/MSVC)行为一致,但仍有几个边界情况要注意:

  • MSVC 在 C++14 及以前默认不启用 __STDC_IEC_559__ 宏,可能导致 std::isnan 被降级为宏实现,建议加 /fp:strict 编译选项
  • 某些嵌入式平台(如 ARM Cortex-M 使用 soft-float)可能没有硬件 NaN 支持,std::isnan 可能返回 false-negative
  • std::isnan(NAN)std::isnan(std::numeric_limits<double>::quiet_NaN()) 都应返回 true,但前者依赖宏定义是否可用;后者更可移植

检测 NaN 时最容易被忽略的陷阱

真正出问题的地方往往不在函数调用本身,而在数据来源和类型流转过程:

  • 从二进制内存块(如网络包、文件读取)直接 reinterpret_cast 成 double,若原始字节恰好是 NaN 的 bit pattern,但平台字节序或 padding 不匹配,可能导致 std::isnan 返回 false
  • 使用 auto x = some_calc(); 后直接传给 std::isnan,如果 some_calc() 返回 intfloat,模板推导可能意外导致重载解析失败
  • std::optional<double>std::variant 类型,必须先确认有值再解包,否则访问未初始化的浮点成员会导致未定义行为,std::isnan 的结果不可靠

NaN 不是异常,它是个合法的浮点值;检测只是起点,后续是否跳过计算、记录日志、还是报错,得看业务逻辑怎么处理——这点比“怎么判断”本身更关键。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

597

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

617

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

335

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

335

2025.08.29

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号