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.
- Explicar cómo funciona el ordenamiento de burbujas. ¿Cuál es su complejidad temporal?
- Cómo escribir un programa para ingresar una cadena e imprimir el número de caracteres en minúscula y mayúscula en la cadena
- ¿Cuáles son algunas habilidades de programación, algoritmos o marcos que se ven muy bien pero que son muy simples?
- Cómo entender un algoritmo de búsqueda CSP
- Cómo dominar algoritmos, estructuras de datos y desarrollar un enfoque de resolución de problemas
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.