2011-01-23 3 views
5

Questo sembra facile, ma ho problemi a calcolare il log (Base 5) in Ruby.Calcolo del logaritmo Base-n in Ruby

Chiaramente lo standard di log di base-10 funziona bene:

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

Ma nel mio progetto ho bisogno di usare Base 5. Secondo la documentazione rubino (http://www.ruby-doc.org/ nucleo/classes/Math.html # M001473) sembra dovrei essere in grado di fare questo:

Math.log (num, base) → galleggiare

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

il che non gli piace. Qualcuno sa come calcolare i log in base-n in ruby ​​on rails?

Grazie!

+0

Quale versione di Ruby stai usando? Per me va bene. – Dogbert

risposta

10

Vado a controllare la funzione di Ruby, ma non dimentico i tuoi principi fondamentali: alt text

Prima di Ruby 1.9:

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

In Ruby 1.9 e versioni successive, è stato introdotto il secondo argomento:

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

funziona in qualsiasi base, non solo alla base di e. usa il logaritmo decadico invece di ln. – Femaref

+1

In realtà, è anche più generale: 'log_b1 (x) = log_b2 (x)/log_b2 (b1)' (modifica: in inglese relativamente semplice, cosa che @Femaref ha detto). – delnan

+0

non riuscivo a inventare una buona notazione ragionevole per le basi. – Femaref

3

L'altra risposta è corretta, naturalmente, ma nell'interesse di risparmiare tempo, Math.log(n, base) funziona in Ruby> = 1.9

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

+0

Ti ho fatto +1 perché è molto più Rubyish, ma se guardi il codice sorgente di 'log (x, base) ', vedrai che si finisce solo usando la stessa relazione:' d = log (d0) ; if (argc == 2) d/= log (RFLOAT_VALUE (base)); '. Quindi, usare una chiamata per funzionare che comunque ha a che fare con una base arbitraria è più efficiente - fa una chiamata di funzione invece di due. – tkroman