- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
T toPower(T base, int exponent)
{
//cout << "++++++++Start template+++++++++++++" << endl;
T result = base;
if(exponent == 0) return (T)1;
if(exponent < 0) return (T)0;
while(--exponent)
result *= base;
//cout << "++++++++Finish template++++++++++++" << endl;
return result;
}
Здесь это не реализовано, а через логарифм и экспоненту очень даже неплохо работается с отрицательной степенью.
Фантастикой программа считает отрицательные степени. Кто мешал забабахать ветку: ?
[offpost]
Можно ли считать себя простуженным, если в магазине говоришь: "Дайте мне Ява Скрипт Золотую, крепкую, пожалуйста"... ?
[/offpost]
Или код написан для какого-нибудь микроконтроллера, который возведение в степень не поддерживает? Может это метод повышения точности вычислений?
Про "возведение в степень не поддерживает" - мимо кассы. Никакой из современных мэйнстриморвых процессоров практичное возведение в степень не поддерживает. Есть, разумеется, билиотечная `pow` и аналогичная поддержка в системе процессорных команд - но это обобщенное плавающее экспоненциирование, за которое надо сразу бить по рукам, особенно в целочисленном коде.
Я бы предположил, что приведенная функция написана именно для целочисленного возведения в степень (и именно так это и делается на практике - написанием своей функции), но представленный вариант задуман в качестве работоспособной "заглушки", т.е. Russian Peasant решили реализовать потом, когда/если руки дойдут.
Не нужно постоянно перемножать само число, а можно работать с его уже вычисленными на предыдущих шагах степенями. Как-то так.
В общем, как писал Макконел: "Не оптимизируй". :-)
Впрочем, думается мне, что возвести во вторую степень(это является намного более частым случаем) - будет быстрее через: a*a, чем через этот алгоритм.
Он в Кнуте описан должен быть.
int pow (int a, int k)
{
if (k==0) return 1;
if (k==1) return a;
if (k&1) return a*pow(a,k-1);
int r = pow(a,k>>1);
return r*r;
}
http://lafstern.org/matt/col3.pdf
почитайте классическую статью классического автора том, как Russian Peasant используется для возведения в степень.
В него можно и матрицы подсунуть :-) И вообще какие-нибудь причудливые объекты, которые перегрузили умножение.
http://www.cplusplus.com/reference/clibrary/cmath/pow/
Или у Вас какой-то не стандартный компилятор?
"Там" означает в говнокоде.
В говнокоде шаблон. Он может быть инстанцирован для любой сущности реализующей умножение.
Просто... Направление мысли автора угадывается. Хотелось "оптимально" перемножать всё...
Хотелось как лучше, а получился ...