浮點數小知識點

渣渣強發表於2018-09-22

浮點數比較

浮點數只有在能夠表達整數和二次冪的情況下才能不損失。否則如何進行對比可以採取

[c++]
fabs(a-b) < EPSION (目標精度)

浮點數的表達方式

符號位 階碼 尾數 0 10000110 01100000001000000..

等價於 1.01100000010000 * 2^(10000110^2 - 127)

  1. 首先將二進位制數進行規格化處理,只取小數點後面的數字存放到尾數區。
  2. 將最高位去掉,並擴充套件為23位尾數
  3. 求階碼,如果指數部分為7,則移碼錶示為127+7=134
  4. 將符號位,階碼與尾數合併起來,最終得到浮點數的表達方式。

概念

浮點數的精度是由尾數決定的 ,浮點數的取值範圍是由階碼的尾數決定的

inline static bool isdefined (double x) { return ((* (uint64 *) & x) & 0x7FF0'0000'0000'0000) != 0x7FF0'0000'0000'0000; }                           

//將浮點數轉為整型64位指標,然後獲取值並與7ff的條件進行與運算,判斷是否觸發下面NaN判斷條件。

inline static bool isundef (double x) { return ((* (uint64 *) & x) & 0x7FF0'0000'0000'0000) == 0x7FF0'0000'0000'0000; } 
複製程式碼

這段程式碼是在檢查浮點數前15位的階碼是否都為1,為什麼這麼檢查取決下面的這個條件。

二進位制的0x7ff0000000000001L ~ 0x7fffffffffffffffL 和 0xfff0000000000001L ~ 0xffffffffffffffffL 之間的數值被定義為NAN型別,類似正無窮大和負無窮小。

相關文章