Мне нужна очень быстрая реализация функции log2 (float x) на C ++.
Я нашел очень интересную реализацию (и очень быструю!)
#include <intrin.h>
inline unsigned long log2(int x)
{
unsigned long y;
_BitScanReverse(&y, x);
return y;
}
Но эта функция хороша только для целочисленных значений на входе.
Вопрос: Есть ли способ преобразовать эту функцию во входную переменную типа double ?
UPD :
Я нашел эту реализацию:
typedef unsigned long uint32;
typedef long int32;
static inline int32 ilog2(float x)
{
uint32 ix = (uint32&)x;
uint32 exp = (ix >> 23) & 0xFF;
int32 log2 = int32(exp) - 127;
return log2;
}
что много быстрее, чем в предыдущем примере, но вывод имеет беззнаковый тип.
Можно ли заставить эту функцию возвращать тип double ?
Заранее благодарим!