• c++之关于“NAN”


    关于“NAN”

    NaN ("Not a Number") 是一种特殊的浮点类型,IEEE754在1985年的时候引入,用于定义一些未定义的浮点运算产生的结果。NaN 不同与 inf or -inf,它并非是一种具体的浮点数值,它一种未定义的浮点操作所产生的结果,可以理解成是另外一种对象,目前在很多语言里面都引入了该定义,如 python, matlab 等等。当然,在计算的时候,通常很少会碰见 NaN,但一旦出现就会造成计算结果异常,而且是伴随在很多迭代或者计算过程中。由于,很多语言都把NaN当成一种数据类型来处理,出现的时候并不会报错或者异常,这无疑是程序的定时炸弹,尤其是那些会涉及到很多矩阵迭代计算的程序。某人就吃了这个苦头,在调用随机梯度下降的时候,通常需要迭代很多次计算才会使算法收敛。当出现NaN的时候,有一个很明显的特征矩阵计算的速度会比平时慢 10-100 times,如果你的程序突然间遇到这种情况,最后返回去仔细检查一下在那些地方会引入 NaN 的。下面列举几种会产生 NaN 的操作

    会返回 NaN 的运算有如下三种:

    • 操作数中至少有一个是 NaN 的运算
    • 未定义操作
      • 下列除法运算:0/0、∞/∞、∞/−∞、−∞/∞、−∞/−∞
      • 下列乘法运算:0×∞、0×-∞
      • 下列加法运算:∞ + (−∞)、(−∞) + ∞
      • 下列减法运算:∞ - (−∞)、(−∞) - ∞
    • 产生复数结果的实数运算。例如:
      • 对负数进行开方运算
      • 对负数进行对数运算
      • 对比-1小或比+1大的数进行反正弦或反余弦运算

    如何判断是不是nan数据

    方法一:使用"a == a"来判断,如果是实数的话,返回的结果是true, nan数据返回false。

    #include<iostream>
    #include<cmath>
    int main()
    {
    float a = sqrt(2);
    float b = sqrt(-2);
    a == a ? std::cout << "real number" << std::endl;
             std::cout << "nan number" << std::endl;
    b == b ? std::cout << "real number" << std::endl;
             std::cout << "nan number" << std::endl;
    return 0;        
    }
    

    方法二:使用"isnan()"函数

    #include<iostream>
    #include<cmath>
    int main()
    {
    float a = sqrt(2);
    float b = sqrt(-2);
    isnan(a) ? std::cout << "nan number" << std::endl;
             std::cout << "real number" << std::endl;
    isnan(b) ? std::cout << "nan number" << std::endl;
             std::cout << "real number" << std::endl;
    return 0;        
    }
    

    nan point

    #include <cmath>
    
    pcl::pointXYZI nan_point;
    nan_point.x = nan;
    nan_point.y = nan;
    nan_point.z = nan;
    

    参考

    "NaN" 的困扰 - 小飞鱼世界 - CSDN博客
    NaN - Wikipedia
    NaN in C++ - What is it and how to check for it? - GeeksforGeeks

  • 相关阅读:
    C语言——第四次作业(2)
    C语言——第三次作业(2)
    C语言——第二次作业(2)
    C语言——第一次作业(2)
    C语言——第0次作业(二)
    高级软件工程第九次作业:东理三剑客团队作业-随笔7
    高级软件工程第九次作业:东理三剑客团队作业-随笔6
    高级软件工程第九次作业:东理三剑客团队作业-随笔5
    高级软件工程第九次作业:东理三剑客团队作业-随笔4
    高级软件工程第九次作业:东理三剑客团队作业-随笔3
  • 原文地址:https://www.cnblogs.com/ChrisCoder/p/9940657.html
Copyright © 2020-2023  润新知