Мы знаем, что для различные причины, в C ++ нет стандартной целочисленной степенной функции. Я выполняю точную арифметику с довольно маленькими целыми числами, как правильно вычислить полномочия?
Стандартное быстрое возведение в степень использует повторное возведение в квадрат:
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;
}
Ты можешь использовать std::pow(double a, double b)
, Там не будет неточностей, если оба a
, b
и результат вписывается в 32-разрядное целое число!
Причина в том, что 64-битная двойная точность полностью охватывает диапазон 32-битных целых чисел.
Хотя ответ Керрека правильный, в g ++ также есть «секретная» функция, позволяющая сделать это эффективно. Если вы посмотрите на функцию питания SGI, ее можно легко адаптировать к тому, что вы хотите:
http://www.sgi.com/tech/stl/power.html
В g ++ это реализовано как __gnu_cxx :: власть. Вы, вероятно, не должны использовать эти вещи в производственном коде, хотя …
В дополнение к другим ответам здесь, есть также хорошая статья в Википедии, объясняющая различные реализации здесь -> ССЫЛКА НА САЙТ