¿Qué algoritmos se usan para calcular logaritmos?

Esto es lo que hace una biblioteca C ampliamente utilizada para la función log ():

* desecha los poderes de 2 para acercar el argumento a 1; ahora necesitamos log (1 + f)

* sea ​​s = f / (2 + f) , observe log (1 + f) = log (1 + s) – log (1-s), y calcule eso con un polinomio de grado 15 . Los coeficientes de este polinomio se pueden codificar.

Con cierto cuidado en cómo se realiza el cálculo, esto es rápido y proporciona el resultado exacto correctamente redondeado.

La biblioteca que miré es uClibc; el registro de Git dice que esta función se basa en la que se encuentra en OS X (circa 2001), que a su vez se basa en la de FreeBSD, por lo que pueden ser similares.

Más detalles, del comentario en libm / e_log.c en el árbol fuente de uClibc:

  * 1. Reducción de argumentos: encuentre k y f de manera que
  * x = 2 ^ k * (1 + f),
  * donde sqrt (2) / 2 <1 + f <sqrt (2).
  * *
  * 2. Aproximación de log (1 + f).
  * Sea s = f / (2 + f);  basado en log (1 + f) = log (1 + s) - log (1-s)
  * = 2s + 2/3 s ** 3 + 2/5 s ** 5 + .....,
  * = 2s + s * R
  * Utilizamos un algoritmo Reme especial en [0,0.1716] para generar
  * un polinomio de grado 14 para aproximar R El error máximo
  * de esta aproximación polinómica está limitada por 2 ** - 58.45.  En
  * otras palabras,
  * 2 4 6 8 10 12 14
  * R (z) ~ Lg1 * s + Lg2 * s + Lg3 * s + Lg4 * s + Lg5 * s + Lg6 * s + Lg7 * s
  * (los valores de Lg1 a Lg7 se enumeran en el programa)
  * y
  * |  2 14 |  -58,45
  * |  Lg1 * s + ... + Lg7 * s - R (z) |  <= 2
  * |  El |
  * Tenga en cuenta que 2s = f - s * f = f - hfsq + s * hfsq, donde hfsq = f * f / 2.
  * Para garantizar un error en el registro por debajo de 1ulp, calculamos el registro
  * por
  * log (1 + f) = f - s * (f - R) (si f no es demasiado grande)
  * log (1 + f) = f - (hfsq - s * (hfsq + R)).  (mejor precisión)
  * *
  * 3. Finalmente, log (x) = k * ln2 + log (1 + f).
  * = k * ln2_hi + (f- (hfsq- (s * (hfsq + R) + k * ln2_lo)))
  * Aquí ln2 se divide en dos números de coma flotante:
  * ln2_hi + ln2_lo,
  * donde n * ln2_hi siempre es exacto para | n |  <2000.

Un buen ‘truco’ para calcular el logaritmo natural de un número real y positivo es a través de la identidad

[matemáticas] \ int_ {1} ^ {x} \ frac {1} {t} \, dt = \ log (x) – \ log (1) = \ log (x). [/ matemáticas]

Una vez que reconoce esta identidad, calcular [math] \ log (x) [/ math] es simplemente una cuestión de calcular una aproximación numérica de la integral al grado deseado de precisión (usando la regla trapezoidal, tal vez). Creo que esto dará una convergencia más rápida que la serie de potencia.

Aparte de los que mencionó, uno común sería la serie de potencia. Por ejemplo:

[matemáticas] \ ln (z) = 2 \ sum_ {n = 0} ^ \ infty \ frac {1} {2n + 1} \ left (\ frac {z-1} {z + 1} \ right) ^ { 2n + 1} [/ matemáticas]
http://en.wikipedia.org/wiki/Log

More Interesting

Se me pide que lea datos de un archivo .txt en una matriz y que haga cosas con esa información (encontrar promedio, encontrar número de elementos, encontrar valores máximos / mínimos). ¿Cómo se puede hacer esto en Java?

Cómo saber si / cuándo puede aplicar la manipulación de bits para resolver un problema

Si solo quiero escribir algoritmos y lógica, y no quiero molestarme con la interfaz de usuario y la codificación frontal, ¿qué tipo de posición de software me conviene más?

Java: ¿Cómo podemos verificar si un número es feliz o no mediante el uso de funciones de cadena simples y bucles sin ningún arreglo?

Cómo encontrar el segundo número más pequeño de 3 entradas sin usar la matriz

¿Debería alguien que se aplica a un campo de arranque de desarrollo ya saber cómo escribir una función para sumar una matriz multidimensional?

¿Qué algoritmo se debe usar para encontrar que hay una conexión en cada dos vértices en un gráfico dirigido?

Cómo analizar la complejidad temporal del algoritmo MST de prims

¿Cuáles son algunos ejemplos de problemas que son: (1) NP pero no NP-Complete; (2) NP-Completo; (3) NP-Hard pero no NP-Complete?

¿Qué algoritmo de clasificación es eficiente para grandes datos y por qué?

¿Vale la pena pagar 6 x $ 49 por una estructura de datos y especialización de algoritmos en Coursera?

¿Cuándo puede el paralelismo hacer que sus algoritmos se ejecuten más rápido? ¿Cuándo podría hacer que sus algoritmos funcionen más lentamente?

Dados los pares 'n1' de corchetes "[]", los pares 'n2' de corchetes "{}" y los pares 'n3' de corchetes "()", ¿cómo podemos encontrar todas las combinaciones válidas posibles de todos estos pares de manera eficiente?

¿Cuál es la diferencia entre binario, algoritmo y lenguaje de programación?

Entonces, ¿es una estructura de datos un algoritmo que describe cómo organizar las cosas?