Respuesta

27

Esto realmente depende del dominio de qué valores desea calcular un logaritmo.

Para duplicados IEEE, muchos procesadores pueden tomar logaritmos en una sola instrucción de ensamblaje; x86 tiene las instrucciones FYL2X y FYL2XP1, por ejemplo. Aunque típicamente instrucciones como éstas sólo tomarán el logaritmo de alguna base fija, pueden ser utilizadas para tomar logaritmos en bases arbitrarias mediante el hecho de que

registro un b = log c b/log c a

simplemente tomando dos logaritmos y encontrando su cociente.

Para enteros generales (de precisión arbitraria), puede usar la cuadratura repetida combinada con una búsqueda binaria para tomar logaritmos usando solo operaciones aritméticas O (log log n) (cada vez que cuadra un número duplica el exponente, lo que significa solo puede cuadrar el número log log n veces antes de exceder su valor y hacer una búsqueda binaria). Usando some cute tricks with Fibonacci numbers, puede hacer esto solo en el espacio O (log n). Si está calculando el binary logarithm, existen algunos trucos divertidos que puede usar con los cambios de bits para calcular el valor en menos tiempo (aunque la complejidad asintótica es la misma).

Para números reales arbitrarios, la lógica es más difícil. Puede usar el método de Newton o la serie de Taylor para calcular los logaritmos con una precisión determinada, aunque confieso que no estoy familiarizado con los métodos para hacerlo. Sin embargo, rara vez necesita hacer esto porque la mayoría de los números reales son IEEE dobles y hay mejores algoritmos (o incluso instrucciones de hardware) en ese caso.

Espero que esto ayude!

+0

Para enteros a menudo también hay una instrucción (o una secuencia corta, para hacer 'CTZ (x & (x - 1)) 'o' wordsize - LZC (x) ') - pero AFAIK no ayuda con la complejidad del tiempo (solo la velocidad real) – harold

+0

@ harold- Es cierto, aunque eso solo funciona para logaritmos binarios . – templatetypedef

+1

@templatetypedef Que puedes multiplicar por un factor constante para obtener logaritmos en cualquier otra base, como acabas de demostrar. :) –

Cuestiones relacionadas