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/

最新文章

  1. 列表组件抽象(2)-listViewBase说明
  2. Web APP 之rem的使用
  3. DI依赖注入/IOC控制反转
  4. 【原】iOS学习39网络之数据请求
  5. jQuery中的事件和动画——《锋利的jQuery》(第2版)读书笔记2
  6. 使用FMDB事务批量更新数据库
  7. 领域驱动设计系列文章——浅析VO、DTO、DO、PO的概念、区别和用处
  8. P1572: [Usaco2009 Open]工作安排Job
  9. Linux常用命令英文全称与中文解释Linux系统
  10. python脚本工具-1 制作爬虫下载网页图片
  11. LED汽车前大灯
  12. hdu 2066 一个人的旅行 最短路径
  13. Dubbo.xml配置源-Dubbo.xsd分析
  14. Ajax 与服务器通信 验证编号重复
  15. Macro For Creating a dwStyle for a window without a menu bar and title bar
  16. 一道简单树形dp
  17. beta阶段测试基本概况报告
  18. c# speech 文本转语言
  19. Centos7.4简单安装使用gitlab+maven+jenkins实现java代码的持续集成部署
  20. Unable to update index for central http://repo1.maven.org/maven2/ 解决方法

热门文章

  1. 省流量 转:http://www.wtoutiao.com/p/T3b8it.html
  2. ES6——面向对象应用
  3. python基础-文件操作的其他方法
  4. Codeforces Round #425 (Div. 2) - A
  5. 14DBCP连接池
  6. more 分页显示文件内容
  7. X-MAS CTF 2018 - Crypto - Hanukkah
  8. Redis分布式锁【实战】
  9. 随笔3 HashMap&lt;K,V&gt;
  10. 理解Promise (4)