c++之关于“NAN”

2018/11/10 21:20
阅读数 13

关于“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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部