математика — Как правильно поднять целое число до положительной целой степени в C ++?

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

26

Решение

Стандартное быстрое возведение в степень использует повторное возведение в квадрат:

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;
}
45

Другие решения

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

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

19

Хотя ответ Керрека правильный, в g ++ также есть «секретная» функция, позволяющая сделать это эффективно. Если вы посмотрите на функцию питания SGI, ее можно легко адаптировать к тому, что вы хотите:

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

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

4

В дополнение к другим ответам здесь, есть также хорошая статья в Википедии, объясняющая различные реализации здесь -> ССЫЛКА НА САЙТ

1
По вопросам рекламы [email protected]