




используйте функцию pow (хотя она требует floats / doubles).
man pow:
#include <math.h>
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);
РЕДАКТИРОВАТЬ: Для особого случая положительных целочисленных степеней 2 вы можете использовать битовый сдвиг: (1 << x) будет равняться 2 степени x. С этим есть некоторые потенциальные подводные камни, но в целом это было бы правильно.
Я не уверен, так ли это с оптимизацией компилятора, но битовый сдвиг - одна из самых быстрых операций на ЦП. Если возможно, я бы выбрал такой подход.
я не понимаю вашего ответа ... не могли бы вы привести какой-нибудь номер в примере ...
Какую часть вы не понимаете? Была ли это часть, меняющая бит? Вообще говоря, pow(2, x) == (1 << x) Итак, pow(2, 4) == 16 и (1 << 4) == 16)
Чтобы добавить к тому, что сказал Эван: C не имеет встроенного оператора для возведения в степень, потому что это не примитивная операция для большинства процессоров. Таким образом, он реализован как библиотечная функция.
Также для вычисления функции e ^ x можно использовать функции exp(double), expf(float) и expl(long double).
Обратите внимание, что вы делаете нет, хотите использовать оператор ^, который является оператором побитовое исключающее ИЛИ.
Я только изучаю C, и это поначалу бросило меня в большой цикл. Я начинаю «понимать» сейчас, но ваше напоминание очень ценно для меня и (я уверен) сотни таких же, как я. +1!
@AlexejMagura: Поскольку 62 ^ 3 является операцией xor (0x3E ^ 0x03 в шестнадцатеричном формате), результатом будет 0x3D (61), что не то же самое, что куб 62 (он же 238328 или 0x03A2F8).
@AlexejMagura: Хорошо, это любопытно. Следует ли нам убрать эти комментарии?
или вы можете просто написать степенную функцию с рекурсией в качестве дополнительного бонуса
int power(int x, int y){
if (y == 0)
return 1;
return (x * power(x,y-1) );
}
да, да, я знаю, что это менее эффективная пространственно-временная сложность, но рекурсия просто веселее !!
pow работает только с числами с плавающей запятой (на самом деле double). Если вы хотите использовать степени целых чисел, а основание не является показателем 2, вам придется использовать собственный.
Обычно достаточно глупого пути.
int power(int base, unsigned int exp) {
int i, result = 1;
for (i = 0; i < exp; i++)
result *= base;
return result;
}
Вот рекурсивное решение, которое использует пространство и время O(log n) вместо простого пространства O(1) времени O(n):
int power(int base, int exp) {
if (exp == 0)
return 1;
else if (exp % 2)
return base * power(base, exp - 1);
else {
int temp = power(base, exp / 2);
return temp * temp;
}
}
он будет работать нормально, если вы введете int в double / float, а затем вернетесь к int.
Однако неэффективность и ошибка округления воля имеют значение, когда результат приближается к INT_MAX.
Нерекурсивная версия функции не так уж и сложна - вот она для целых чисел:
long powi(long x, unsigned n)
{
long p = x;
long r = 1;
while (n > 0)
{
if (n % 2 == 1)
r *= p;
p *= p;
n /= 2;
}
return(r);
}
(Взломанный код для возведения двойного значения в целую степень - пришлось удалить код, например, для работы с обратными.)
Да, O (1) space O (log n) time делает это лучше, чем рекурсивное решение, но немного менее очевидным.
int power(int x,int y){
int r=1;
do{
r*=r;
if (y%2)
r*=x;
}while(y>>=1);
return r;
};
(итеративно)
int power(int x,int y){
return y?(y%2?x:1)*power(x*x,y>>1):1;
};
(если он должен быть рекурсивным)
imo, алгоритм определенно должен быть O (logn)
Как и в предыдущем ответе, это будет хорошо обрабатывать положительные и отрицательные целые степени двойника.
double intpow(double a, int b)
{
double r = 1.0;
if (b < 0)
{
a = 1.0 / a;
b = -b;
}
while (b)
{
if (b & 1)
r *= a;
a *= a;
b >>= 1;
}
return r;
}
Вы имели в виду
e**y, а неy**e?