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 進整数として表されます。実際の値は基本的に

2^E * M

基本的な対数計算は次のように述べています。

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

コードの最初の部分は、および M を分離します。コメント行 (1)は、多項式近似を使用してE計算します。log2(M)最後の行はE、近似の結果を追加します。

于 2010-12-16T14:17:28.590 に答える
2

概算です。最初に指数の log2 を直接取り (実行するのは簡単です)、次に仮数の log2 の近似式を使用します。次に、これら 2 つの log2 コンポーネントを追加して、最終結果を生成します。

于 2010-12-16T14:05:48.960 に答える