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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM