C ++ 11 Fast Contexpr Integer PowersC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C ++ 11 Fast Contexpr Integer Powers

Сообщение Anonymous »

Избивая мертвую лошадь здесь. Типичный (и быстрый) способ выполнения целочисленных способностей в C - это классика: < /p>

Код: Выделить всё

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 и может использоваться в качестве концентрации 
?

(Отказ от ответственности: мне не нужно более быстро>

Подробнее здесь: https://stackoverflow.com/questions/177 ... ger-powers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»