c ++ 11 быстрые целые числа constexpr
Бить мертвую лошадь здесь. Типичный (и быстрый) способ делать целочисленные полномочия в C это классика:
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;
}
Однако мне понадобилась целочисленная мощность времени компиляции, поэтому я решил сделать рекурсивную реализацию с помощью constexpr:
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);
}
Вторая функция предназначена только для обработки показателей меньше 1 предсказуемым образом. Переходяexp<0
ошибка в этом случае
Я генерирую вектор из 10E6 случайных значений базисов и показателей в диапазоне [0,15] и синхронизирую оба алгоритма с вектором (после несвоевременного запуска, чтобы попытаться удалить любые эффекты кэширования). Без оптимизации рекурсивный метод работает в два раза быстрее, чем цикл. Но с -O3 (GCC) цикл в 4 раза быстрее, чем рекурсивный метод.
Мой вопрос к вам, ребята, таков: Может ли кто-нибудь придумать более быструю функцию ipow (), которая обрабатывает экспоненту и базисы 0 и может использоваться какconstexpr
?
(Отказ от ответственности: я ненужно быстрее ipow, мне просто интересно посмотреть, что умные люди здесь могут придумать).