Во-первых, предварительно вычислите 1.0/log(a)
и умножьте вместо каждого log(b)
на это выражение.
Редактировать: Первоначально я говорил, что натуральный логарифм (база e) будет самым быстрым, но другие утверждают, что база 2 поддерживается непосредственно процессором и будет самой быстрой. У меня нет оснований сомневаться в этом.
Редактировать 2: Первоначально я предполагал, что a
была константой, но перечитывая вопрос, который никогда не задавался. Если это так, то предварительный расчет не принесет пользы. Однако, если это так, вы можете поддерживать удобочитаемость с помощью соответствующего выбора имен переменных:
const double base_a = 1.0 / log(a);
for (int b = 0; b < bazillions; ++b)
double result = log(b) * base_a;
Как ни странно, Microsoft не предоставляет функцию журнала 2, что объясняет, почему я не был знаком с ней. Кроме того, инструкция x86 для вычисления журналов включает умножение автоматически, и константы, необходимые для различных баз, также доступны через оптимизированную инструкцию , поэтому я ожидаю, что 3 различных функции журнала иметь одинаковое время (даже основание 2 должно было бы умножиться на 1).