1

谁能详细解释一下这个 log2 函数是如何工作的:

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);
} 
4

2 回答 2

5

IEEE 浮点数在内部有一个指数E和一个尾数M,每个都表示为二进制整数。实际值基本上是

2^E * M

基本对数数学 说:

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

代码的第一部分将EM 分开。注释 (1) 的行log2(M)使用多项式近似进行计算。最后一行相加E和近似的结果。

于 2010-12-16T14:17:28.590 回答
2

这是一个近似值。它首先直接取指数的 log2(做起来很简单),然后对尾数的 log2 使用近似公式。然后它添加这两个 log2 组件以给出最终结果。

于 2010-12-16T14:05:48.960 回答