Почему бы не использовать следующие два бита, кроме начального бита.Вы можете сначала разделить число на 8 бинов, а следующие два бита разделить каждый бин на четыре.В этом случае вы можете использовать простую операцию сдвига, которая очень быстрая.
Редактировать : Если вы считаете, что использование логарифма является жизнеспособным решением.Вот общий алгоритм:
Пусть a
будет основанием логарифма, а диапазон будет (b_min, b_max) = (32,8191)
.Вы можете найти базу по формуле:
log(b_max/b_min) / log(a) = 32 bin
, что даст вам a~1.1892026
.Если вы используете это a как основу логарифма, вы можете отобразить диапазон (b_min, b_max)
в (log_a(b_min), log_a(b_max)) = (20.0004,52.0004)
.
Теперь вам нужно только вычесть все элементы на 20.0004
, чтобы получить диапазон (0,32)
.Это гарантирует, что все элементы логарифмически однородны.Готово
Примечание : любой элемент может выйти за пределы диапазона из-за числовой ошибки.Вы должны рассчитать его для точного значения.
Примечание2 : log_a (b) = log (b) / log (a)