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" 的适当转换函数
昨天还可以正常运行的程序,怎么今天改了程序的结构就报错了呢?我明明没有改动函数内部啊!!! 内心无数只“草泥马”在奔腾,这可咋办呢?于是乎,小寅开始求助于亲爱的度娘...... 由于小寅知识水平有限, ...
随机推荐
- vue css中scoped
1.什么是scoped vue组件中,在style标签中有一个属性,叫做scoped.当此标签拥有scoped属性的时候,该组件下的css样式只适用于本组件,而不会影响全局组件.这其实也相当于样式的模 ...
- struts2 中的 addActionError 、addFieldError、addActionMessage方法的区别添加错误信息
转自:https://www.cnblogs.com/wangyp/archive/2011/07/13/2104828.html 一.addActionError("错误内容") ...
- 用URLGather来管理和保存你的页面
下载链接:http://url-gather.software.informer.com/download/#downloading 安装的过程简单,这里不一一叙述. 安装成功后,找到软件安装的路径, ...
- Java的基本数据类型,以及他们的封装类
基本类型 大小 默认值 封装类 boolean 1 false Boolean byte 1 0 Byte char 2 \u0000(null) Character sh ...
- 触发redo写的几个条件
触发redo写的几个条件 作者:eygle |English [转载时请标明出处和作者信息]|[恩墨学院 OCM培训传DBA成功之道]链接:http://www.eygle.com/archive ...
- Js中window.location.href和window.location.replace的区别
href相当于打开一个新页面,replace相当于替换当前页面:这里打开页面都是针对历史记录来说,在页面上看完全相同,只是浏览器的history表现不同如果在1.html中点击链接到2.html,然后 ...
- wine安装与配置
1. 安装wine32dpkg --add-architecture i386 && apt-get update && apt-get install wine3 ...
- maven推送本地包到私服
前置要求:配置正确的settings.xml maven 推送 本地jar 到私服的命令示例: mvn deploy:deploy-file -DgroupId=com.oracle -Dartifa ...
- Linux系统下安装jenkins使用
jenkins 2.190.1 yum 安装 devops一梦千年 发布时间:10-0916:28 jenkins 2.190.1 yum 安装记录 安装环境: 所需安装包: https://pkg. ...
- 英语单词character
来源——tr帮助说明 TR() User Commands TR() NAME tr - translate or delete characters SYNOPSIS tr [OPTION]... ...