C++ std::isnan等函数的使用
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等函数的使用的更多相关文章
- std::map中函数用法集合
1 STL的map表里有一个erase方法用来从一个map中删除掉指令的节点 2 eg: 3 map<string,string> mapTest; 4 typedef map< ...
- std::string::insert函数
string& insert (size_t pos, const string& str); string& insert (size_t pos, const string ...
- std::string::append函数
string& append (const string& str); string& append (const string& str, size_t subpos ...
- std::string::assign函数
string& assign (const string& str); string& assign (const string& str, size_t subpos ...
- std::string::substr函数
string substr (size_t pos = 0, size_t len = npos) const;
- std::string::copy函数
size_t copy (char* s, size_t len, size_t pos = 0) const;
- std::string的split函数
刚刚要找个按空格分离std::string的函数, 结果发现了stackoverflow上的这个问题. 也没仔细看, 直接拿来一试, 靠, 不对啊, 怎么分离后多出个空字符串, 也就是 "a ...
- NaN属性,isNaN函数
NaN:Not a Number,顾名思义,表示不是一个数字. 可以把 Number 对象设置为该值,来指示其不是数字值. 使用 isNaN() 全局函数来判断一个值是否是 NaN 值 详见 Java ...
- C++ socket bind()函数报错 不存在从 "std::_Binder<std::_Unforced, SOCKET &, sockaddr *&, size_t &>" 到 "int" 的适当转换函数
昨天还可以正常运行的程序,怎么今天改了程序的结构就报错了呢?我明明没有改动函数内部啊!!! 内心无数只“草泥马”在奔腾,这可咋办呢?于是乎,小寅开始求助于亲爱的度娘...... 由于小寅知识水平有限, ...
随机推荐
- linux相关(find/grep/awk/sed/rpm)
如何查找特定的文件: find :在指定目录下查找文件 find -name "filename" :从当前目录查找文件 find / -name "filename&q ...
- HDU_2007
/** *注意:输入的两个数字的大小并不确定 */ #include <iostream> #include <stdio.h> #include <string.h&g ...
- jQuery学习总结01-选择器
下面简单介绍一个常用的jQuery使用方法,其他详细的猛戳这里 一.选择器 1.parent > child 说明:在给定父类的情况下匹配所有的子类 示例: 描述:匹配表单中所有的的子级inpu ...
- 05.Linux-CentOS系统本地Yum源搭建
CentOS系统 1.挂载镜像光盘[root@localhost ~]# mount /dev/sr0 /media/cdrom/ 2.创建本地yum源仓库[root@localhost ~]# cd ...
- Ansible自动化运维工具(1)
1. Ansible的架构 Ansible的帮助文档: http://www.ansible.com.cn/index.html 2. YAML语言简介 基本规则 列表(list, [, , , .. ...
- Object中有哪些公用方法?
clone()方法 实现对象的浅复制,只有实现了Cloneable接口才能调用该方法. toString()方法 返回该对象的字符串表示. equals()方法: 在Object中与“==”的定义是一 ...
- ps:图像格式的选择
从上面点阵与矢量两者的对比中,似乎矢量格式有优势,那为什么不都使用矢量格式呢? 这是因为矢量图像是基于线段的.因此它不适合记录色彩较为复杂的图像.如下图, 如果使用点阵方式来记录,只要按照顺序扫描并记 ...
- 前端面试题:不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标,,怎么实现好?
昨天,看这道题,脑子锈住了,就是没有思路,没看明白是什么意思?⊙﹏⊙|∣今天早上起床,想到需要思考一下这个问题. 当然,我没想明白为什么要这样做?(创建一个长度为100的数组,并且每个元素的值等于它的 ...
- vue中怎么使用vuex
做一个简单的vuex如何使用的介绍: 先安装: npm i vuex --save-dev 新建一个store文件夹, 在store文件夹中建一个index.js文件,在该文件中: i ...
- Python全栈开发,Day2
一.Pycharm的使用 1.创建项目 2.python调整字体大小随ctrl+鼠标滚轮上下滚动 3.python新建程序自动补全编码和环境 4.设置断点(在代码前面行号后面单击鼠标左键) 5.调试断 ...