zoukankan      html  css  js  c++  java
  • 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) << '
    '
                  << "isnan(Inf) = " << std::isnan(INFINITY) << '
    '
                  << "isnan(0.0) = " << std::isnan(0.0) << '
    '
                  << "isnan(DBL_MIN/2.0) = " << std::isnan(DBL_MIN/2.0) << '
    '
                  << "isnan(0.0 / 0.0)   = " << std::isnan(0.0/0.0) << '
    '
                  << "isnan(Inf - Inf)   = " << std::isnan(INFINITY - INFINITY) << '
    ';
    }
    

    输出:

    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/

  • 相关阅读:
    SVN Monitor工具推荐
    Linux Netbeans汉化不全
    PMWiki安装教程
    JIRA重启服务器后需要重启TOMCAT的解决
    SVN分支与合并
    WCF无法捕获FaultException
    非完美C++ Singleton实现[转载]
    C语言结构体的对齐原则
    C++ STL 学习笔记
    字符串笔试题
  • 原文地址:https://www.cnblogs.com/ccf19881030/p/12004812.html
Copyright © 2011-2022 走看看