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" 的适当转换函数
昨天还可以正常运行的程序,怎么今天改了程序的结构就报错了呢?我明明没有改动函数内部啊!!! 内心无数只“草泥马”在奔腾,这可咋办呢?于是乎,小寅开始求助于亲爱的度娘...... 由于小寅知识水平有限, ...
随机推荐
- Codeforces Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)
传送门 A. XORinacci 手玩三四项发现序列就是 $a,b,a\ xor\ b,a,b,...$,直接输出即可 #include<iostream> #include<cst ...
- 【Matlab技巧】工作区变量如何添加到Simulink中?
对新手来说,在进行simulink仿真时想把工作区的变量添加到Simulink中,这样在如transfer模块中使用时可以直接输变量即可. 如这样: 那么如何对Simulink仿真文件自动赋值呢? 1 ...
- C# DataTable与实体的相互转换
using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespac ...
- JavaScript、ES6中类的this指向问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python之路-numpy模块
这里是首先需要安装好Anaconda Anaconda的安装参考Python之路-初识python及环境搭建并测试 配置好环境之后开始使用Jupyter Notebook 1.打开cmd,输入 jup ...
- Codeforces 1215E 状压DP
题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段. 思路:由于题目中的颜色种类很少,考虑状压DP.设dp[mask]为把mask为 ...
- window 批处理脚本获取上级目录
1 SET CurrDir=%CD% CD.. SET InstPath=%CD% CD %CurrDir% 2 pushd.. set parent=%cd% popd 参考: https://ms ...
- CSS3 结构性伪类选择器(1)
1.CSS3 结构性伪类选择器—root :root选择器就是匹配元素E所在文档的根元素.在HTML文档中,根元素始终是<html>. “:root”选择器等同于<html>元 ...
- 【串线篇】spring boot自动配置原理
配置文件到底能写什么?怎么写?自动配置原理: 配置文件能配置的属性参照 一.自动配置原理: 1.1.SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfigur ...
- luogu4061 大吉大利,晚上吃鸡!
链接 最短路径\(dag\),一道好题. 题目大意:求一张图中满足下列要求的点对\((i,j)\)数量: 所有最短路径必定会经过 \(i\) 点和 \(j\) 点中的任意一点. 不存在一条最短路同时经 ...