Мне нужен эксперт с плавающей запятой - PullRequest
1 голос
/ 16 декабря 2010

Может кто-нибудь объяснить мне подробно, как работает эта функция 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);
} 

Ответы [ 2 ]

5 голосов
/ 16 декабря 2010

IEEE с плавающей точкой имеет показатель E и мантиссу M, каждый из которых представлен в виде двоичных чисел. Фактическое значение в основном

2^E * M

Базовая логарифмическая математика гласит:

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

Первая часть вашего кода разделяет E и M. Строка с комментариями (1) вычисляет log2(M), используя полиномиальное приближение Последняя строка добавляет E и результат приближения.

2 голосов
/ 16 декабря 2010

Это приближение.Сначала он принимает log2 показателя степени напрямую (тривиально), а затем использует формулу аппроксимации для log2 мантиссы.Затем он добавляет эти два компонента log2 для получения окончательного результата.

...