- 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;
}
rat4 22.12.2010 22:26 # +1
1_and_0 22.12.2010 23:46 # 0
Здесь это не реализовано, а через логарифм и экспоненту очень даже неплохо работается с отрицательной степенью.
inkanus-gray 23.12.2010 00:11 # +2
Фантастикой программа считает отрицательные степени. Кто мешал забабахать ветку: ?
1_and_0 23.12.2010 00:35 # 0
inkanus-gray 23.12.2010 01:13 # 0
istem 23.12.2010 04:01 # +7
[offpost]
Можно ли считать себя простуженным, если в магазине говоришь: "Дайте мне Ява Скрипт Золотую, крепкую, пожалуйста"... ?
[/offpost]
absolut 23.12.2010 04:45 # +6
guest 23.12.2010 01:09 # −1
Или код написан для какого-нибудь микроконтроллера, который возведение в степень не поддерживает? Может это метод повышения точности вычислений?
inkanus-gray 23.12.2010 01:12 # 0
TheCalligrapher 23.12.2010 01:19 # +1
Про "возведение в степень не поддерживает" - мимо кассы. Никакой из современных мэйнстриморвых процессоров практичное возведение в степень не поддерживает. Есть, разумеется, билиотечная `pow` и аналогичная поддержка в системе процессорных команд - но это обобщенное плавающее экспоненциирование, за которое надо сразу бить по рукам, особенно в целочисленном коде.
Я бы предположил, что приведенная функция написана именно для целочисленного возведения в степень (и именно так это и делается на практике - написанием своей функции), но представленный вариант задуман в качестве работоспособной "заглушки", т.е. Russian Peasant решили реализовать потом, когда/если руки дойдут.
guest 23.12.2010 08:53 # −1
interested 23.12.2010 09:29 # 0
Не нужно постоянно перемножать само число, а можно работать с его уже вычисленными на предыдущих шагах степенями. Как-то так.
В общем, как писал Макконел: "Не оптимизируй". :-)
guest 23.12.2010 09:44 # −1
Впрочем, думается мне, что возвести во вторую степень(это является намного более частым случаем) - будет быстрее через: a*a, чем через этот алгоритм.
interested 23.12.2010 09:52 # 0
Он в Кнуте описан должен быть.
guest 23.12.2010 09:56 # −2
Irdis 19.01.2011 16:48 # 0
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;
}
interested 23.12.2010 09:58 # 0
TheCalligrapher 23.12.2010 21:18 # 0
http://lafstern.org/matt/col3.pdf
почитайте классическую статью классического автора том, как Russian Peasant используется для возведения в степень.
inkanus-gray 23.12.2010 21:59 # 0
TheCalligrapher 24.12.2010 00:17 # 0
absolut 23.12.2010 02:39 # 0
guest 23.12.2010 03:03 # 0
absolut 23.12.2010 03:19 # +1
guest 23.12.2010 08:51 # 0
interested 23.12.2010 09:32 # 0
В него можно и матрицы подсунуть :-) И вообще какие-нибудь причудливые объекты, которые перегрузили умножение.
guest 23.12.2010 09:39 # −1
http://www.cplusplus.com/reference/clibrary/cmath/pow/
Или у Вас какой-то не стандартный компилятор?
interested 23.12.2010 09:43 # 0
"Там" означает в говнокоде.
В говнокоде шаблон. Он может быть инстанцирован для любой сущности реализующей умножение.
absolut 23.12.2010 16:36 # 0
interested 24.12.2010 09:46 # 0
Просто... Направление мысли автора угадывается. Хотелось "оптимально" перемножать всё...
Хотелось как лучше, а получился ...
guest 02.01.2011 01:38 # −2