2011-01-23 10 views
5

Ten wydaje się łatwy, ale mam problem z obliczeniem logu (Base 5) w Ruby.Obliczanie logarytmu Base-n w Ruby

Wyraźnie średnia base-10 log działa dobrze:

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

Ale w moim projekcie muszę korzystać z bazy 5. Zgodnie z docs Ruby (http://www.ruby-doc.org/ rdzeń/classes/Math.html # M001473) wydaje powinienem być w stanie to zrobić:

Math.log (num, baza) → unosić

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

którym nie podoba. Czy ktoś wie, jak obliczyć logi w bazie-n w rubinach na szynach?

Dzięki!

+0

Z której wersji Ruby korzystasz? Pracuje dla mnie. – Dogbert

Odpowiedz

10

Sprawdzę funkcję Ruby, ale nie zapomnij Podstawy: alt text

przed Ruby 1.9:

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

W Ruby 1.9 i później drugi argument został wprowadzony:

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

działa to w dowolnej bazie - nie tylko na podstawie e. po prostu użyj logarytmu dekadowego zamiast ln. – Femaref

+1

Właściwie to jest jeszcze bardziej ogólne: 'log_b1 (x) = log_b2 (x)/log_b2 (b1)' (edytuj: w stosunkowo prostym języku angielskim, co powiedział @Femaref). – delnan

+0

po prostu nie mógł wymyślić rozsądnej dobrej notacji dla baz. – Femaref

3

Inna odpowiedź jest prawidłowa, ale w interesie oszczędzania czasu, Math.log(n, base) działa w Ruby> = 1.9

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

+0

Ja + 1'd ciebie, ponieważ jest o wiele więcej Rubyish, ale jeśli spojrzysz na kod źródłowy 'log (x, base)', zobaczysz, że po prostu się zakręca używając tej samej relacji: 'd = log (d0) ; if (argc == 2) d/= log (RFLOAT_VALUE (baza)); '. Tak więc, użycie jednego połączenia do funkcji, które w każdym razie zajmuje się dowolną bazą, jest bardziej wydajne - wykonuje jedno wywołanie funkcji zamiast dwóch. – tkroman