Округление до ближайшей целочисленной степени заданной базы - PullRequest
4 голосов
/ 24 апреля 2010

Я пытаюсь округлить число до следующей наименьшей степени другого числа. Я не знаю, в каком направлении он округляется, но я предпочитаю нисходящий, если это возможно.

Число 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))
}

Буду признателен за любую помощь!

1 Ответ

6 голосов
/ 24 апреля 2010

У вас правильная идея; для любой базы х x ^ floor( log_x(n) ) - это то, что вы хотите. (Где log_x представляет собой 'log to base x ')
В C #:

static double roundBaseX(double num, double x)
{
    return Math.Pow(x, Math.Floor(Math.Log(num, x)));
}

Если вы не можете взять логарифмы на произвольную базу, просто используйте формулу: log_x(n) = log(n) / log(x)

...