2010-12-16 57 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