gl es es es en gl es gl es es es es es es es es es es gl es gl es en es es gl en es en pt es gl es es ca es es es en es es es it es en
Sabemos que la librería math.h nos ofrece una extensa cantidad de funciones para cálculos matemáticos. Es el caso de las funciones para calcular logartimos. La función que se da más abajo no va a ser más que una aplicación de un algoritmo. Puede conseguir buena precisión, pero para utilidades prácticas siempre será recomendable utilizar las funciones de la librería math.
Este es un ejemplo de cómo lo haremos, tomando como b=2 y n=30. Lo expresamos en forma de potencia (paso 2) y dividimos tantas veces como sea posible el número n entre la b, hasta que sea menor que b. Lo hemos podido dividir un total de cuatro veces (paso 3). Elevamos a 10 en ambos miembros y volvemos a dividir entre b tantas veces como podamos (pasos 5 y 6, a1 es el número anterior dividido entre 29). Si nos fijamos hemos conseguido los número 4 y 9. Y podemos observar que log2 30 es aproximadamente 4,9. Llegaremos al resultado perfecto cuando el segundo miembro de la ecuación sea 1, es decir 20, pudiendo tener bases iguales y así igualar exponentes. Sería despejar la x.
Expresado con letras quedaría tal y como se muestra en la imagen de la izquierda.
Tendríamos que en el primer paso x-i; En el segundo 10x-10i-j; En el tercero 10(10x-10i+j)+k, ... Es decir, en cada paso multiplicaremos por 10 lo anterior, y le sumaremos un nuevo número (dado por la cantidad de veces que se puede dividir el segundo miembro de la ecuación: n,n1...). Cada vez se multiplica por 100 y se le añade ese numero número. Al final del todo igualaremos a 0 (si conseguimos que n llegue a ser 1, el número obtenido será el exacto) esa expresión. A más pasos, más exacto. Por esto último aplicaremos un número de precisión (para no estar hasta el infinito, si se diese el caso).
Tenemos b (base) y n (número) como parámetros. Creamos una variable accurate (precisión) y una val=0.
Repetiremos este apartado hasta que n!=1 o hallamos alcanzado la precisión buscada (en cada paso: reps++).
Dividimos n entre b hasta que n<b. Nos dará un número i de veces.
val=10*(val-i); (En la primera repetición tendremos -10i)
Es decir, estamos en el paso 4 de las imágenes. La diferencia es que estamos ya despejando la 10x,100x,1000x... Ese coeficiente será pasado al otro lado de la ecuación al final.
Obtenemos el valor x dividiendo entre 10^reps (es decir, el número de veces que hemos repetido el paso 2).
double log(int b,double n) { double val = 0; int i,accurate = 10,reps=0; while(n != 1 && accurate>=0) { for(i=0;n>=b;i++) n /= b; n = p(n,10); val = 10*(val+i); accurate--; reps++; } return (double)val/p(10,reps); }