Довольно быстрый мог бы быть чем-то вроде этого:
int IntPow(int x, uint pow)
{
int ret = 1;
while ( pow != 0 )
{
if ( (pow & 1) == 1 )
ret *= x;
x *= x;
pow >>= 1;
}
return ret;
}
Примечание, что это не позволяет отрицательные полномочия. Я оставлю это как осуществление Вам.:)
Добавленный: Ах да, почти забыл - также добавляют проверку переполнения/потери значимости, или Вы могли бы быть в для нескольких противных неожиданностей в будущем.
Используя математику в ссылке блога John Cook,
public static long IntPower(int x, short power)
{
if (power == 0) return 1;
if (power == 1) return x;
// ----------------------
int n = 15;
while ((power <<= 1) >= 0) n--;
long tmp = x;
while (--n > 0)
tmp = tmp * tmp *
(((power <<= 1) < 0)? x : 1);
return tmp;
}
для обращения к возражению, что код не будет работать при изменении типа питания, хорошо... не принимая во внимание точку, что любой, кто изменяет код, они не понимают и затем используют его без тестирования.....
, но решать проблему, эта версия защищает глупое от той ошибки... (Но не от несметного числа других они могли бы сделать), ПРИМЕЧАНИЕ: не протестированный.
public static long IntPower(int x, short power)
{
if (power == 0) return 1;
if (power == 1) return x;
// ----------------------
int n =
power.GetType() == typeof(short)? 15:
power.GetType() == typeof(int)? 31:
power.GetType() == typeof(long)? 63: 0;
long tmp = x;
while (--n > 0)
tmp = tmp * tmp *
(((power <<= 1) < 0)? x : 1);
return tmp;
}
Также попытка этот рекурсивный эквивалент (медленнее, конечно):
public static long IntPower(long x, int power)
{
return (power == 0) ? x :
((power & 0x1) == 0 ? x : 1) *
IntPower(x, power >> 1);
}
Вот сообщение в блоге , который объясняет самый быстрый способ повысить целые числа до целочисленных полномочий. Как один из комментариев указывает, некоторые из этих приемов встроены в микросхемы.
Использование двойная версия, проверьте на переполнение (по макс. интервалу или макс. долго) и бросьте к интервалу или долго?