10 votos

Una forma alternativa de calcular el $\log(x)$

Cómo se puede reemplazar el $\log(x)$ función matemática simple operadores como $+,-,\div$, e $\times$?

Estoy escribiendo un código de computadora y tengo que usar $\log(x)$. Sin embargo, la tecnología de la que estoy utilizando no proporciona un mecanismo para calcular el logaritmo. Por lo tanto, necesito implementar mi propia función con sólo simples operadores ($+,-,\div$, e $\times$).

Gracias.

21voto

Andrew Puntos 140

Contrariamente a la creencia popular, usted puede hacer mejor que el poder de la serie. El truco está en el uso de fracciones continuas y las relacionadas con la Padé approximants.

Una continuación de la fracción por el logaritmo (debido a Khovanskiĭ) va un poco como esto:

$$\log(1+z)=\cfrac{2z}{z+2-\cfrac{z^2}{3(z+2)-\cfrac{4z^2}{5(z+2)-\cfrac{9z^2}{7(z+2)-\cdots}}}}$$

La belleza de esto es que tiene un amplio dominio de aplicabilidad: es válida siempre que $|\arg(1+z)| < \pi$.

Uno puede usar el Lentz-Thompson-Barnett método en este CF, por supuesto, pero también se podría elegir para explotar el argumento de la reducción de aquí, por la adecuada explotación de la identidad de $\log(ab)=\log\,a+\log\,b$. Si usted toma esa ruta, puede ser justificado sólo en el uso de un truncamiento de la continuación de la fracción. Que el truncamiento es lo que se llama un Padé approximant.

Voy a editar más adelante con más detalles si es necesario.

14voto

Andrew Puntos 140

En el interés de demostrar que no es más que una forma de la piel de un gato, puedo mostrar aquí Borchardt del algoritmo para calcular $\log\,x$, que es una modificación de la forma más convencional de la aritmética-media geométrica de la iteración:

$a_0=\dfrac{1+x}{2};\quad b_0=\sqrt{x};$
$\text{repeat}$
$a_{k+1}=\dfrac{a_k+b_k}{2}$

$b_{k+1}=\sqrt{a_{k+1}b_k}$

$k=k+1$
$\text{until }|a_k-b_k| < \varepsilon$
$\log\,x\approx 2\dfrac{x-1}{a_k+b_k}$

Por supuesto, esto supone que dispone de una función de raíz cuadrada disponible, pero que sigue siendo factible, incluso con sus restricciones.

Si usted encuentra que la tasa de convergencia es demasiado lento para su gusto, Carlson muestra que puede utilizar la extrapolación de Richardson para acelerar la convergencia en el artículo que he enlazado. A partir de mis propios experimentos, he encontrado que la velocidad de convergencia de la no modificada Borchardt algoritmo ya es bastante decente, por lo menos que necesita el speed-up (y recordando que la extrapolación de Richardson requiere un auxiliar de la matriz para su implementación, la cual se suma a la de los costos de almacenamiento), la vainilla Borchardt está bien como está.

5voto

user21783 Puntos 11

Curiosamente, nadie propuso el algoritmo CORDIC que fue muy útil cuando el 'precio' de la multiplicación y la división era alta y/o la CPU limitada.
El truco es usar un precalculadas tabla de logaritmos (decir $\ln(10), \ln(2), \ln(1.1), \ln(1.01)... \ln(1.000001)$) y calcula los logaritmos utilizando sólo la suma/resta y de las operaciones del turno (código de ejemplo aquí).
Un poco tarde pero...

2voto

Si el número de $N$ (en base 10) es $n$-dígitos

$$n-1 \leq \log_{10}(N) < n$$

Luego logaritmo se puede aproximar utilizando

$$\log_{10}(N) \approx n-1 + \frac{N}{10^{n} - 10^{n-1}}$$

Ejemplo,

$\log_{10}(53) = 1.72427587 $

Aquí $n= 2, N=53$ a continuación,

$$\log_{10}(53) = 2 -1 + \frac{53}{100-10}=1.588888$$

Logaritmo asigna números del 10 al 100 en el intervalo de 1 a 2 por lo que el registro de los números de cerca de 50 es de alrededor de 1.5. Pero esto es sólo una aproximación lineal, bueno para el cálculo mental y el juguete de los proyectos, pero no es bueno para la investigación seria.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X