Это действительно зависит от области, из каких значений вы хотите вычислить логарифм.
Для двойников IEEE многие процессоры могут принимать логарифмы в одной инструкции по сборке; Например, x86 имеет инструкции FYL2X и FYL2XP1. Хотя обычно такие инструкции принимают логарифм только в некотором фиксированном основании, их можно использовать для логарифмов в произвольных базах, используя тот факт, что
log a b = log c b / log c a
, просто взяв два логарифма и найдя их частное.
Для общих целых чисел (произвольной точности) вы можете использовать повторное возведение в квадрат в сочетании с двоичным поиском, чтобы брать логарифмы, используя только O (log log n) арифметических операций (каждый раз, когда вы возводите в квадрат число, вы удваиваете показатель степени, что означает может только возвести число в журнал log n раз, прежде чем вы превысите его значение и сможете выполнить бинарный поиск). Используя некоторые милые трюки с числами Фибоначчи , вы можете сделать это только в O (log n) пространстве. Если вы вычисляете двоичный логарифм , есть несколько симпатичных приемов, которые вы можете использовать с битовыми сдвигами, чтобы вычислить значение за меньшее время (хотя асимптотическая сложность та же).
Для произвольных действительных чисел логика сложнее. Вы можете использовать метод Ньютона или ряд Тейлора для вычисления логарифмов с определенной точностью, хотя я признаюсь, что я не знаком с методами для этого. Тем не менее, вам редко нужно это делать, потому что большинство действительных чисел являются двойными IEEE, и в этом случае существуют лучшие алгоритмы (или даже аппаратные инструкции).
Надеюсь, это поможет!