關於“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
