1.#QNAN、1.#IND和1.#INF等“無效”浮點數說明及其判斷
在GIS檢視上發現部分小區不能正常呈現,通過跟蹤異常小區發現其所屬基站的經緯度座標都是-1.#QNAN00000000000無效值,導致小區繪製失敗,這些小區均屬新入網的3G基站,資源資料還沒有維護起來,資料庫中對應欄位為空,經過TUXEDO介面後資料反映為QNAN無效值。在基礎資料完善之前,可在SQL取資料時將空值轉化為0,或在接收資料時對此類資料作進一步的過濾。
此處的1.#QNAN是一個列印呈現,QNAN是指Quiet Not aNumber,類似的浮點錯誤還有SNaN(Signaling Not aNumber),通常如0.0/0.0、給負數開平方根等溢位或無效運算就會產生一個NAN結果的表示值,NaN及兩種浮點錯誤的說明如下:
The value NaN (Not a Number)is used to represent a value that does not represent a real number.NaN’s are represented by a bit pattern with an exponent of all 1sand a non-zero fraction. There are two categories of NaN: QNaN(Quiet NaN) and SNaN (Signalling NaN).
A QNaN is a NaN withthe most significant fraction bit set. QNaN’s propagate freelythrough most arithmetic operations. These values pop out of anoperation when the result is not mathematically defined.
An SNaN is a NaN withthe most significant fraction bit clear. It is used to signal anexception when used in operations. SNaN’s can be handy to assign touninitialized variables to trap premature usage.
Semantically, QNaN’s denote indeterminate operations, while SNaN’sdenote invalid operations. If a return value is a QNaN, it meansthat it is impossible to determine the result of the operation, aSNaN means that the operation is invalid.
這樣的特殊浮點數還有INF和IND:INF就是Infinity,表示一個無窮大的數,包括正無窮和負無窮;IND則表示無限小,但不確定。如1.0/0.0會產生一個INF無窮大,-1.0/0.0會產生一個負無窮大。
回到最初的錯誤上,這種無效資料之所以通過了經緯度有效值判斷,是因為常規的浮點範圍對這類浮點數無效。我們知道常規的浮點數不能直接判0等於,而如果這個浮點數為NaN,那if(f==f) 會得到false結果。但是利用這個結果來判斷一個浮點數是否為NaN並不總是安全的,例如用這個巨集定義#defineisnan(x) ((x) != (x)),在某些編譯環境下可能就會脫離了你的預期。那如何判斷特殊的浮點數呢?各種語言應該都能找到對應的輔助函式或者類方法,在C語言中,可以用float.h中的int_isnan(double x)、int _finite(double x)、int _fpclass(doublex)函式來判斷,返回結果代表意義分別為:_FPCLASS_SNAN (Signaling NaN)、_FPCLASS_QNAN(Quiet NaN)、_FPCLASS_NINF (Negative Infinity, –INF)、_FPCLASS_PINF(Positive Infinity,+INF);在C++中,可以用STL中的limits類:numeric_limits::quiet_NaN()、numeric_limits::signaling_NaN()、numeric_limits::infinity()等方法。
此處的1.#QNAN是一個列印呈現,QNAN是指Quiet Not aNumber,類似的浮點錯誤還有SNaN(Signaling Not aNumber),通常如0.0/0.0、給負數開平方根等溢位或無效運算就會產生一個NAN結果的表示值,NaN及兩種浮點錯誤的說明如下:
The value NaN (Not a Number)is used to represent a value that does not represent a real number.NaN’s are represented by a bit pattern with an exponent of all 1sand a non-zero fraction. There are two categories of NaN: QNaN(Quiet NaN) and SNaN (Signalling NaN).
A QNaN is a NaN withthe most significant fraction bit set. QNaN’s propagate freelythrough most arithmetic operations. These values pop out of anoperation when the result is not mathematically defined.
An SNaN is a NaN withthe most significant fraction bit clear. It is used to signal anexception when used in operations. SNaN’s can be handy to assign touninitialized variables to trap premature usage.
Semantically, QNaN’s denote indeterminate operations, while SNaN’sdenote invalid operations. If a return value is a QNaN, it meansthat it is impossible to determine the result of the operation, aSNaN means that the operation is invalid.
這樣的特殊浮點數還有INF和IND:INF就是Infinity,表示一個無窮大的數,包括正無窮和負無窮;IND則表示無限小,但不確定。如1.0/0.0會產生一個INF無窮大,-1.0/0.0會產生一個負無窮大。
回到最初的錯誤上,這種無效資料之所以通過了經緯度有效值判斷,是因為常規的浮點範圍對這類浮點數無效。我們知道常規的浮點數不能直接判0等於,而如果這個浮點數為NaN,那if(f==f) 會得到false結果。但是利用這個結果來判斷一個浮點數是否為NaN並不總是安全的,例如用這個巨集定義#defineisnan(x) ((x) != (x)),在某些編譯環境下可能就會脫離了你的預期。那如何判斷特殊的浮點數呢?各種語言應該都能找到對應的輔助函式或者類方法,在C語言中,可以用float.h中的int_isnan(double x)、int _finite(double x)、int _fpclass(doublex)函式來判斷,返回結果代表意義分別為:_FPCLASS_SNAN (Signaling NaN)、_FPCLASS_QNAN(Quiet NaN)、_FPCLASS_NINF (Negative Infinity, –INF)、_FPCLASS_PINF(Positive Infinity,+INF);在C++中,可以用STL中的limits類:numeric_limits::quiet_NaN()、numeric_limits::signaling_NaN()、numeric_limits::infinity()等方法。
相關文章
- 如何判斷字串是否為合法數值、浮點、科學計數等格式字串
- Python判斷字串是否為字母或者數字(浮點數)Python字串
- 浮點數表示及其實現.
- goland dlv 斷點無效GoLand斷點
- 專利說明書及其說明書附圖
- 浮點數
- Python保留字及其說明Python
- php 處理 浮點數 精度運算 數字處理等PHP
- MySQL 有意思的浮點數和定點數MySql
- PbootCMS判斷有無子選單各種條件判斷和標籤boot
- 【7】JVM引數說明和分析JVM
- 【MySQL】SemisynchronousReplication配置和引數說明MySql
- PbootCMS奇偶數判斷(隔行變色)各種條件判斷和標籤boot
- LGWR DBWR SMON 等程式說明
- PbootCMS判斷列表頁有無內容,無內容返回提示各種條件判斷和標籤boot
- css滑鼠懸浮彈出說明層效果CSS
- 【MySQL】Semisynchronous Replication 配置和引數說明MySql
- 浮點數的理解
- 浮點數小知識點
- js函式中的if判斷和a==b判斷JS函式
- 小米 TYPE_TOAST 懸浮窗無效的原因AST
- 一組很難被判無效的等冪和陣列陣列
- mybatis中 if 標籤 test 等於判斷MyBatis
- 過等保流程簡單說明
- 【質數判斷】給定兩個數,判斷這兩個數是否互質?
- 不學無數——Mybatis解析判斷表示式原始碼分析MyBatis原始碼
- 變數,運算子,if判斷變數
- JQuery 判斷 正整數jQuery
- java判斷迴文數Java
- TOP引數說明
- mysqldump引數說明MySql
- mysql 變數說明MySql變數
- mysqldump 引數說明MySql
- MySQL引數說明MySql
- JavaScript判斷整數或者小數JavaScript
- JavaScript判斷數字正負數JavaScript
- js資料型別判斷和陣列判斷JS資料型別陣列
- PbootCMS內容頁判斷有無多圖,無多圖顯示縮圖各種條件判斷和標籤boot