Мне нужна очень быстрая реализация функции log2 (float x) в C++.Быстрая реализация log2 (float x) C++
Я нашел очень интересную реализацию (и очень быстро!)
#include <intrin.h>
inline unsigned long log2(int x)
{
unsigned long y;
_BitScanReverse(&y, x);
return y;
}
Но эта функция хороша только для целочисленных значений на входе.
Вопрос: Есть ли способ, чтобы преобразовать эту функцию в двойной входной переменной типа?
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?
Заранее благодарен!
Это очень странное требование, поскольку Логарифм с основанием 2 редко используется для чего-нибудь, кроме вычисления числа битов для чего-то и вы работаете с целыми числами при подсчете бит. Так зачем вам это нужно? –
@JanHudec: В верхней части моей головы два общих использования логарифма будут вычислять энтропию сигнала и делать арифметику на очень больших числах, которые иначе переполнялись бы. –
@MikeSeymour: для сигнала редко бывает плавающей точкой, а не целой. Для арифметики на больших числах вам не понадобится база 2 и, вероятно, использовать естественный логарифм, поскольку математика обычно выражается этим. –