Подтвердить что ты не робот

Каков правильный способ поднять целое число до положительной целочисленной мощности в С++?

Мы знаем, что для различных причин в С++ нет стандартной целочисленной функции мощности. Я выполняю точную арифметику с довольно маленькими целыми числами, каков правильный способ вычислить полномочия?

4b9b3361

Ответ 1

В стандартном быстром экспонировании используется повторное возведение в квадрат:

uint_t power(uint_t base, uint_t exponent)
{
    uint_t result = 1;

    for (uint_t term = base; exponent != 0; term = term * term)
    {
        if (exponent % 2 != 0) { result *= term; }
        exponent /= 2;
    }

    return result;
}

Количество шагов логарифмическое в значении exponent. Этот алгоритм может быть тривиально расширен до модульного возведения в степень.


Обновление:. Это модифицированная версия алгоритма, который выполняет одно меньшее умножение и более эффективно обрабатывает несколько тривиальных случаев. Более того, если вы знаете, что показатель никогда не равен нулю, а база никогда не равна нулю или одна, вы даже можете удалить начальные проверки:

uint_t power_modified(uint_t base, uint_t exponent)
{
    if (exponent == 0) { return 1;    }
    if (base < 2)      { return base; }

    uint_t result = 1;

    for (uint_t term = base; ; term = term * term)
    { 
        if (exponent % 2 != 0) { result *= term; }
        exponent /= 2;
        if (exponent == 0)     { break; }
    }

    return result;
}

Ответ 2

Вы можете использовать std::pow(double a, double b). Не будет никаких неточностей, если оба a, b и результат поместится в 32-битное целое!

Причина в том, что 64-битная двойная точность полностью охватывает диапазон 32-разрядных целых чисел.

Ответ 3

В то время как ответ Kerrek верен, в g++ есть также "секретная" функция, чтобы сделать это эффективно. Если вы посмотрите на функцию мощности SGI, ее можно легко адаптировать для выполнения того, что вы хотите:

http://www.sgi.com/tech/stl/power.html

В g++ это реализовано как __ gnu_cxx:: power. Вы, вероятно, не должны использовать эти вещи в производственном коде, хотя...

Ответ 4

В дополнение к другим ответам здесь есть также хорошая статья о Википедии, объясняющая различные различные реализации здесь → LINK