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. std::map中函数用法集合

    1 STL的map表里有一个erase方法用来从一个map中删除掉指令的节点  2 eg:  3 map<string,string> mapTest;  4 typedef map< ...

  2. std::string::insert函数

    string& insert (size_t pos, const string& str); string& insert (size_t pos, const string ...

  3. std::string::append函数

    string& append (const string& str); string& append (const string& str, size_t subpos ...

  4. std::string::assign函数

    string& assign (const string& str); string& assign (const string& str, size_t subpos ...

  5. std::string::substr函数

    string substr (size_t pos = 0, size_t len = npos) const;

  6. std::string::copy函数

    size_t copy (char* s, size_t len, size_t pos = 0) const;

  7. std::string的split函数

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

  8. NaN属性,isNaN函数

    NaN:Not a Number,顾名思义,表示不是一个数字. 可以把 Number 对象设置为该值,来指示其不是数字值. 使用 isNaN() 全局函数来判断一个值是否是 NaN 值 详见 Java ...

  9. C++ socket bind()函数报错 不存在从 "std::_Binder<std::_Unforced, SOCKET &, sockaddr *&, size_t &>" 到 "int" 的适当转换函数

    昨天还可以正常运行的程序,怎么今天改了程序的结构就报错了呢?我明明没有改动函数内部啊!!! 内心无数只“草泥马”在奔腾,这可咋办呢?于是乎,小寅开始求助于亲爱的度娘...... 由于小寅知识水平有限, ...

随机推荐

  1. vue打开新窗口

    1. <router-link tag="a" target="_blank" :to="{name:'detail',query:{goods ...

  2. Node 12 值得关注的新特性

    前言 时隔一年,Node.js 12 如约而至,正式发布第一个 Current 版本. 该版本带来了诸如: V8 更新带来好多不错的特性. HTTP 解析速度提升. 启动速度大幅提升. 更好的诊断报告 ...

  3. 微信小程序倒计时实现功能

    onLoad: function () {    var that=this;    this.data.intervarID= setInterval(function () {      var ...

  4. python数据分析第二版:pandas

    一:pandas 两种数据结构:series和dataframe series:索引(索引自动生成)和标签(人为定义)组成---返回一个对象 obj = pd.Series([1,2,3,4]) ob ...

  5. Python---基础---常用的内置模块(Github、P有charm、math数学模块和random随机数模块,做一些简单的练习)

    2019-05-24 ----------------------------------

  6. ES集群health为yellow解决办法

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11766147.html Logstash导入数据后,Cerebro显示集群health的状态为yell ...

  7. 微信小程序填坑之路其一:wx.request发送与服务端接受

    一.序言 应公司要求要求,要用小程序开发一个信息录入系统.没办法只能听话来填坑. 先介绍一下环境:客户端——小程序:服务端——java:数据库——mysql:服务器——centos7 需求:客户端输入 ...

  8. python3爬虫开发与实战预览版

    https://germey.gitbooks.io/python3webspider/content/1.2.3-ChromeDriver%E7%9A%84%E5%AE%89%E8%A3%85.ht ...

  9. LintCode之两两交换链表中的节点

    题目描述: 我的思路: 由题目描述可知,题目是要求将第一个与第二个节点,第三个与第四节点....进行交换,而进行交换时只用将节点的值进行交换即可.需要注意的是:当链表为null或者当链表只有一个节点时 ...

  10. ANTLR4加载csv数据

    实现功能: 编写一个自定义的监听器,将逗号分隔符文件(csv)中的数据加载到一种数据结构--“由Map组成的List”中. antlr4文件: grammar CSV; file : hdr row+ ...