int64_t ipow(int64_t base, int exp){
int64_t result = 1;
while(exp){
if(exp & 1)
result *= base;
exp >>= 1;
base *= base;
}
return result;
}
< /code>
Однако мне нужна была целочисленная мощность времени компиляции, поэтому я пошел вперед и сделал рекурсивную реализацию с помощью contexpr: < /p>
constexpr int64_t ipow_(int base, int exp){
return exp > 1 ? ipow_(base, (exp>>1) + (exp&1)) * ipow_(base, exp>>1) : base;
}
constexpr int64_t ipow(int base, int exp){
return exp < 1 ? 1 : ipow_(base, exp);
}
< /code>
Вторая функция состоит в том, чтобы обрабатывать показатели менее 1 в предсказуемом способе. Передача exp является ошибкой в этом случае. < /P>
рекурсивная версия в 4 раза медленнее < /h2>
Я генерирую вектор 10e6 случайных базой и экспоненты в диапазоне [0,15], а время оба альгорита на вектор (после того, как они не выполняют, выполняют все возможное. Без оптимизации метод рецисуки в два раза быстрее, чем петля. Но с -O3 (GCC) петля в 4 раза быстрее, чем метод рекурсиса.
[b] Мой вопрос к вам, ребята, заключается в следующем: [/b] может ли кто -нибудь придумать более быструю функцию iPow (), которая обрабатывает показатель и основания 0 и может использоваться в качестве концентрации
?
(Отказ от ответственности: мне не нужно более быстро>
Вторая функция состоит в том, чтобы обрабатывать показатели менее 1 в предсказуемом способе. Передача exp является ошибкой в этом случае. < /P>
рекурсивная версия в 4 раза медленнее < /h2>
Я генерирую вектор 10e6 случайных базой и экспоненты в диапазоне [0,15], а время оба альгорита на вектор (после того, как они не выполняют, выполняют все возможное. Без оптимизации метод рецисуки в два раза быстрее, чем петля. Но с -O3 (GCC) петля в 4 раза быстрее, чем метод рекурсиса.
[b] Мой вопрос к вам, ребята, заключается в следующем: [/b] может ли кто -нибудь придумать более быструю функцию iPow (), которая обрабатывает показатель и основания 0 и может использоваться в качестве концентрации [/code]?
(Отказ от ответственности: мне не нужно более быстро>