Algoritmo para calcular logaritmos en C. Sin math.h

Volver atrás

Publicado por |

Introducción.

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.

Algoritmo.

Image title

Explicación.

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.


Image title

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).

Expresemos el algoritmo.

  1. Tenemos b (base) y n (número) como parámetros. Creamos una variable accurate (precisión) y una val=0.
  2. Repetiremos este apartado hasta que n!=1 o hallamos alcanzado la precisión buscada (en cada paso: reps++).
    1. Dividimos n entre b hasta que n<b. Nos dará un número i de veces.
    2. val=10*(val-i); (En la primera repetición tendremos -10i)
    3. n=n^10; 
    4. 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.
  3. Obtenemos el valor x dividiendo entre 10^reps (es decir, el número de veces que hemos repetido el paso 2).

Código en C.

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);
}

Echaremos mano de una función para elevar números a exponente entero:

double p(double x,int i) {
    double r = 1.0;
    for(i;i>0;i--) r *= x;
    return r;
}


C/C++ algoritmosalgoritmiamatemáticas

Programación

Redes sociales

Twitter BrainumGoogle Plus BrainumFacebook Brainum


Política de privacidad