参考
“NaN” 的困扰 - 小飞鱼世界 - CSDN博客
NaN - Wikipedia
NaN in C++ - What is it and how to check for it? - GeeksforGeeks
前言
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
pcl::pointXYZI nan_point;
nan_point.x = NAN;
nan_point.y = NAN;
nan_point.z = NAN;