前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ std::isnan等函数的使用

C++ std::isnan等函数的使用

作者头像
ccf19881030
发布2019-10-22 11:12:54
6.7K0
发布2019-10-22 11:12:54
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/ccf19881030/article/details/102596938

C和C++11标准提供了类似于isnan、isfinite、isinf、isnormal、fpclassify分别用于判断是非数(NaN)值、有限制、无穷值、正常数值等。 今天在使用Modbus读取设备对应寄存器的float状态值时,出现一些问题,导致数据不能正常获取,最后发现原来设备对应的寄存器里面会出现一些无效的值,导致读取显示出错,没做容错判断处理。后面加上条件判断就可以了。

代码语言:javascript
复制
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; } 示例如下:

代码语言:javascript
复制
#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';
}

输出:

代码语言:javascript
复制
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/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档