Довольно давно понадобился логарифм без плавучки, сделал двоичный
логарифм с дробной частью, берущейся из таблицы. Оказывается, есть
ловкий способ получать дробную часть умножениями, одно умножение --
один бит >>> http://www.claysturner.com/dsp/BinaryLogarithm.pdf
Попробовал слепить что-то такое
#define PRECISION 12
static int
binlog64(uint64_t x)
{
int clz = __builtin_clzll(x);
x <<= clz;
uint32_t x32 = x >> (64 - 16);
int ret = (64 - clz) << PRECISION;
for (int fract = 1 << (PRECISION - 1); fract != 0; fract >>= 1)
{
x32 = x32 * x32;
if (x32 >= 1u << 31)
{
x32 >>= 16;
ret |= fract;
}
else
{
x32 >>= 15;
}
}
return ret;
}