2010-12-16 56 views
1

誰能詳細給我解釋一下這個功能的log 2是如何工作的:我在需要浮點專家

inline float fast_log2 (float val) 
{ 
    int * const exp_ptr = reinterpret_cast <int *> (&val); 
    int   x = *exp_ptr; 
    const int  log_2 = ((x >> 23) & 255) - 128; 
    x &= ~(255 << 23); 
    x += 127 << 23; 
    *exp_ptr = x; 

    val = ((-1.0f/3) * val + 2) * val - 2.0f/3; // (1) 

    return (val + log_2); 
} 

回答

5

IEEE浮點內部有一個指數E和尾數M,每個表示爲二進制整數。實際值基本

2^E * M 

基本數學對數說:

log2(2^E * M) 
= log2(2^E) + log2(M) 
= E + log2(M) 

你的代碼的第一部分分離E和M.線採用多項式逼近評論(1)計算log2(M)。最後一行加上E和近似值的結果。

+0

-128而不是-127得到E^2而不是E? – Skeen 2010-12-16 14:20:31

+0

@Skeen:呃,當然是2^E,而不是E^2 – 2010-12-16 14:23:54

+0

哦。<,我在閱讀失敗,請不要殺了我! :O,但爲什麼它是-128而不是-127呢? – Skeen 2010-12-16 14:25:41

2

這是一個近似。它首先直接得到指數的log2(不重要),然後使用尾數log2的近似公式。然後添加這兩個log2組件以給出最終結果。

+0

好吧我可以理解它是如何提取指數並將其放置在一個名爲log_2的整數中的,以及它如何提取signbit和尾數並通過指針將其保存到val。我不明白的是爲什麼它將這些加在一起。 – Skeen 2010-12-16 14:09:19

+0

而且我明白,一旦它提取了signbit和尾數,就會設置exp = 127(0),因此val = signbit *分數。但是,如何將它與log_2相加,真的讓我感到困惑。 – Skeen 2010-12-16 14:09:59

+0

說實在不提取的指數,它的作用是提取指數-1,作爲IEEE 754 signbit * 2 ^(EXP-127)*壓裂 – Skeen 2010-12-16 14:11:59

相關問題