浮點數NaN和INF(#IND, #INF)


NaN&INF定義
在一些情況會出現無效的浮點數,例如除0,例如負數求平方根等,像這類情況,獲取到的浮點數的值是無效的。

NaN 即 Not a Number         非數字

INF  即 Infinite            無窮大

 

通常無效浮點數的內存表示方法是:

根據IEEE 754標准:
階碼全1,尾數全0表示無窮大INF。例如1.0/0.0

階碼全1,尾數非全0的表示無效數NaN。例如:求負數的平方根,例如0.0/0.0。

(注意: int型時除0是非法的,產生運行異常。Remember,integer division by 0 causes a runtime exception.)

 

 

INF無窮大:在doulbe/float時的取值
float f = 0; (4字節 1位符號位,8位指數,23位小數,指數偏移127)

*(UINT*)&f = 0x7F800000L;//正無窮(二進制 [0111 1111] [1000 0000] [0000 0000] [0000 0000])

*(UINT*)&f = 0xFF800000L;//負無窮(二進制 [1111 1111] [1000 0000] [0000 0000] [0000 0000])

 

double var = 0; (8字節 1位符號位,11位指數,52位小數,指數偏移1023)

// 因為通常是little endian,所以通常修改其前后4個字節

UINT* pVar = ((UINT*)&var) + 1;

*(pVar) = 0x7FF00000L;//正無窮

*(pVar) = 0xFFF00000L;//負無窮

 

常用的浮點數INF&NaN判斷方法:
1.     Windows中,使用_isnan判斷NaN情況;使用!_isnan && !_finite判斷INF情況;使用!_finite判斷NaN和INF兩種情況

_isnan  //it returns a nonzero value if the argument x is a NaN;

_finite //It returns 0 if the argument is infinite or a NaN.

 

2.Linux中,使用insnan和isinf兩個函數分別判別兩種情況:

isNan

isInf

 

3.也可自己來寫:

int isNaN(double x) {return x != x; }

#define _INF_DEFINE 1.0/0.0

int isInf(double n)

{

    static double pinf = 0.0;

    static double ninf = 0.0;

    if (pinf == 0.0) {

            pinf = _INF_DEFINE;

            ninf = -pinf;

    }

    return memcmp(&n, &pinf, sizeof(n)) == 0

            || memcmp(&n, &ninf, sizeof(n)) == 0;

}

 

依據:

1.   NaN是唯一與自身不等的浮點數類型,所以IsNan可以用 x != x來判斷。Anything compared with NAN is false, so NAN == NAN is false.

2.   INF階碼全1,尾數全0

 

還有一種借用isNan定義INF的方法

int isInf(double x) {return !isNaN(x) && isnan(x-x);}

依據:

1.   Inf – Inf得到的為NaN

 

轉自:https://blog.csdn.net/chunyexiyu/article/details/39179735


免責聲明!

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



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