C和C++11标准提供了类似于isnan、isfinite、isinf、isnormal、fpclassify分别用于判断是非数(NaN)值、有限制、无穷值、正常数值等。
今天在使用Modbus读取设备对应寄存器的float状态值时,出现一些问题,导致数据不能正常获取,最后发现原来设备对应的寄存器里面会出现一些无效的值,导致读取显示出错,没做容错判断处理。后面加上条件判断就可以了。

bool D02011C01::getState(){bool rc = false;Modbus::RTU rtu;// 获取工况参数(共12项)Uint8Array req = rtu.req(deviceId(), 4, 1110, 24);if (SendCmd(rtu, req, 3000, 3)){float xishu[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };for (int i = 0; i < 12; i++){float val;// 获取的val值可能不是有效的float类型,比如说:-1.#IND,需要对所获取的结果做有效性判断if (rtu.get_value(val, 2 * i, false, false) && !std::isnan(val)){setStateData(i + 1, val);rc = true;}}}return rc;}

注意
对于float类型的值,C和C++11中都做了相应的处理,用于判断一个float值是否为无穷大、非数( NaN )值;

有多个拥有不同符号位和载荷的不同 NaN 值,参阅 std::nan 及 std::numeric_limits::quiet_NaN 。

NaN 值决不与自身或其他 NaN 值比较相等。 IEEE-754 不要求复制 NaN 保留其位表示(符号与载荷),尽管大多数实现保留。

另一种测试浮点值是否 NaN 的方式是与自身比较: bool is_nan(double x) { return x != x; }
示例如下:

#include <iostream>
#include <cmath>
#include <cfloat>int main()
{std::cout << std::boolalpha<< "isnan(NaN) = " << std::isnan(NAN) << '\n'<< "isnan(Inf) = " << std::isnan(INFINITY) << '\n'<< "isnan(0.0) = " << std::isnan(0.0) << '\n'<< "isnan(DBL_MIN/2.0) = " << std::isnan(DBL_MIN/2.0) << '\n'<< "isnan(0.0 / 0.0)   = " << std::isnan(0.0/0.0) << '\n'<< "isnan(Inf - Inf)   = " << std::isnan(INFINITY - INFINITY) << '\n';
}

输出:

isnan(NaN) = true
isnan(Inf) = false
isnan(0.0) = false
isnan(DBL_MIN/2.0) = false
isnan(0.0 / 0.0)   = true
isnan(Inf - Inf)   = true

有时候发现不少函数以前没怎么用过,遇到问题才发现又学到了一些知识。
C和C++11标准提供了类似于isnan、isfinite、isinf、isnormal、fpclassify分别用于判断是非数(NaN)值、有限制、无穷值、正常数值等。

isnan
NAN
Not-A-Number (constant )
isfinite
Is finite value (macro )
isinf
Is infinity (macro/function )
isnormal
Is normal (macro/function )
fpclassify
Classify floating-point value (macro/function )

参考资料:
1、https://zh.cppreference.com/w/cpp/numeric/math/isnan
2、https://en.cppreference.com/w/cpp/numeric/math/isnan
3、http://www.cplusplus.com/reference/cmath/isnan/

C++ std::isnan等函数的使用相关推荐

  1. isnan函数返回值c语言,C++ std::isnan等函数的使用

    C和C++11标准提供了类似于isnan.isfinite.isinf.isnormal.fpclassify分别用于判断是非数(NaN)值.有限制.无穷值.正常数值等. 今天在使用Modbus读取设 ...

  2. C++string类型与C语言字符数组的转换 std::string.c_str()函数

    语法: const char *c_str();搜索 c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过 ...

  3. C++笔记-使用std::funcional代替函数指针

    目录 基本概念 代码与实例 基本概念 在C++中有个functional的头文件中有一个functional,可以代替函数指针!具体代码如下! 代码与实例 程序运行截图如下: 源码如下: #inclu ...

  4. C++ std::string::find()函数(在字符串中查找内容)

    文章目录 mancpp std::string::find 上面文档中的代码示例 mancpp std::string::find std::string::find(3) C++ Programme ...

  5. std::shared_ptr作为函数形参,通过值传递、引用传递的问题解答

    最近应用开发项目中,使用智能指针比较多,同时也用到了一些开源的第三库,如Fast-DDS,这些软件项目中很多地方用到了智能指针,然而在偶然间看到一个关于智能指针的使用建议,提到"智能指针作为 ...

  6. (转)isnan函数matlab

    转 isnan函数matlab 2018年06月12日 22:00:04 甲虫ss 阅读数 1669 isnan函数:判断数组的元素是否是NaN.(Not a Number) matlab中出现NaN ...

  7. isnan函数 linux,为什么isnan含糊不清以及如何避免它?

    既然isnan可以是宏(在C++ 98中)或在命名空间std中定义的函数(在C++ 11中),这个简单的例子说明了编写在两种情况下都有效的代码的明显(并且可能是天真的)方式. #include int ...

  8. std::string的split函数

    刚刚要找个按空格分离std::string的函数, 结果发现了stackoverflow上的这个问题. 也没仔细看, 直接拿来一试, 靠, 不对啊, 怎么分离后多出个空字符串, 也就是 "a ...

  9. std::bind绑定成员函数,为什么第二个参数必须绑定对象地址

    std::bind 这个函数在绑定成员函数的时候,必须显示指明实例化后的对象的地址. 因为在此处bind的第一个参数是 类 的成员函数的地址,没有经过实例化,所以不是内存中真正的位置,需要配合实例化后 ...

最新文章

  1. 全网唯一秃头数据集:20 万张人像,网罗各类秃头
  2. SQL Server 2012 开发新功能 序列对象(Sequence)
  3. 大家好,换博客了,希望大家多多关注
  4. C#——Lambda表达式与泛型委托DEMO
  5. uniapp 全局样式
  6. vector-空间增长
  7. nginx mysql5.7_Centos7+Php7+Mysql5.7+Nginx源码安装实战部署手册
  8. 论文浅尝 | 面向简单知识库问答的模式修正强化策略
  9. linux交叉编译aix_mips-linux-gcc交叉编译工具链搭建小结【转】
  10. mysql filck_顺序全局id生成方案-flickr(转载)
  11. java实现豆瓣回帖机器人
  12. python数值运算操作符也叫做内置操作符_Python的操作符 - osc_r1gtal48的个人空间 - OSCHINA - 中文开源技术交流社区...
  13. 【李宏毅2020 ML/DL】P53-55 Conditional Generation by RNN Attention Pointer Network Recursive
  14. Anaconda:使用pip安装第三方库:keras、TensorFlow、h5py
  15. labuladong算法小抄pdf下载
  16. c专家编程(C专家编程pdf)
  17. ffmpeg将视频转图片,图片转视频
  18. hdu5773 The All-purpose Zero(LIS变形)
  19. OpenCV + CPP 系列(十九)直方图比较 与 直方图反向投影,投影分割
  20. 软件工程 3:模块化设计

热门文章

  1. html下拉框设置默认值_html下拉列表框默认值
  2. 嵌入式Linux内核和文件系统,在IXP435上移植嵌入式Linux内核和根文件系统
  3. VS中报错C4996 scanf错误错误介绍解决方案
  4. oracle11g忘记sys密码
  5. Java 常用快捷键
  6. 内存管理 内存优化技巧 浅析
  7. 分区 Partitions
  8. CentOS 8 停止支持后阿里云yum源不可用
  9. pycharm配置opencv库
  10. 软件测试-黑盒测试:等价类划分法