Я пытаюсь округлить число до следующей наименьшей мощности другого числа. Я не знаю, в каком направлении он крутится, но я предпочитаю, если возможно, вниз.Округление до ближайшей целочисленной мощности заданной базы
Номер x
, который я округляю, удовлетворит: x > 0
и обычно подходит для использования в диапазоне 0 < x <= 1
. Лишь в редких случаях это будет выше 1.
В целом, моя проблема: Учитывая ряд x
, как можно округлить до ближайшего целого власти каких-то баз b
?
Я хотел был бы иметь возможность округлить к произвольным основаниям, но в настоящее время меня больше всего интересует основание 2 и дробные степени 2, такие как 2^(1/2), 2^(1/4) и т. Д. Вот мой текущий алгоритм для базы 2.
double roundBaseTwo(double x)
{
return 1.0/(1 << (int)((log(x) * invlog2))
}
Любая помощь будет оценена!
Спасибо! Это то, что я искал. Не могли бы вы узнать, есть ли какой-нибудь более быстрый способ сделать это, или я придерживаюсь этого? Я думал о потенциальной работе таблицы поиска для общих значений, поскольку это было очень часто вычислялось в моем основном цикле. –
Добро пожаловать. :) О том, как ускорить это, таблица поиска будет делать довольно хорошо, я думаю. Если вы можете сохранить все полномочия вашей базы в массиве (т. Е. Достаточно, чтобы охватить весь диапазон, который вам нужен), простой бинарный поиск будет всем необходимым для округления. Конечно, вам понадобится один такой массив для каждой базы, которую вы используете. – tzaman