2011-01-23 19 views
5

Este parece fácil, pero tengo problemas para calcular el registro (Base 5) en Ruby.Cálculo del logaritmo Base-n en Ruby

Es evidente que el estándar de logaritmo en base 10 funciona bien:

>> value = Math::log(234504) 
=> 12.3652279242923 

Pero en mi proyecto tengo que usar Base 5. De acuerdo con los documentos de rubí (http://www.ruby-doc.org/ core/classes/Math.html # M001473) parece que debería ser capaz de hacer esto:

Math.log (num, base) → flotar

>> value = Math::log(234504, 5) 
ArgumentError: wrong number of arguments (2 for 1) 
    from (irb):203:in `log' 
    from (irb):203 
    from :0 

¿Qué no le gusta. ¿Alguien sabe cómo calcular los registros en base-n en ruby ​​en los rieles?

Gracias!

+0

¿Qué versión de Ruby estás utilizando? Funciona para mi. – Dogbert

Respuesta

10

Voy a comprobar la función de Ruby, pero no olvido sus fundamentos: alt text

Antes de Ruby 1.9:

> Math::log(234504)/Math::log(5) 
=> 7.682948083154834 

en Ruby 1.9 y posteriores, se introdujo el segundo argumento:

> Math::log(234504, 5) 
=> 7.682948083154834 
+1

esto funciona en cualquier base, no solo a la base de e. solo use el logaritmo decádico en lugar de ln. – Femaref

+1

En realidad, es 'aún más general: 'log_b1 (x) = log_b2 (x)/log_b2 (b1)' (editar: en inglés relativamente simple, lo que dijo @Femaref). – delnan

+0

simplemente no se pudo obtener una buena notación razonable para las bases. – Femaref

3

La otra respuesta es correcta, por supuesto, pero con el interés de ahorrar tiempo, Math.log(n, base) funciona en Ruby> = 1.9

http://www.ruby-doc.org/core-2.0/Math.html#method-c-log

+0

I + 1 porque el código fuente es mucho más Ruby, pero si observa el código fuente 'log (x, base)', verá que termina con la misma relación: 'd = log (d0) ; if (argc == 2) d/= log (RFLOAT_VALUE (base)); '. Por lo tanto, utilizar una llamada a la función que de todos modos se ocupa de la base arbitraria es más eficiente: realiza una llamada de función en lugar de dos. – tkroman