2012-12-12 20 views
18

Muszę ocenić logarytm dowolnej podstawy, bez znaczenia, z pewną precyzją. Czy istnieje algorytm do tego? Programuję w Javie, więc nie mam problemów z kodem Java.Algorytm logarytmiczny

How to find a binary logarithm very fast? (O(1) at best) może być w stanie odpowiedzieć na moje pytanie, ale nie rozumiem tego. Czy można to wyjaśnić?

+0

Sztuczki wspomniane w tym pytaniu wykorzystują sposób, w jaki liczby są przechowywane w pamięci. Lepiej polegaj na metodach Math (lub BigInteger/BigDecimal), jeśli nie w pełni rozumiesz te sztuczki. W każdym razie wykorzystują fakt, że liczby są wewnętrznie reprezentowane bardzo blisko ich reprezentacji w bazie 2. W Javie nie masz żadnych związków, zamiast tego dostajesz nieprzetworzone kawałki podwójnego za pomocą [Double.doubleToRawLongBits] (http: // docs .oracle.com/javase/6/docs/api/java/lang/Double.html # doubleToRawLongBits (double)). – ignis

+0

BigInteger i BigDecimal nie zawierają metod logowania. Dokładnie – Justin

+0

. dla ints użyć tego oczywistego przesunięcia bitowego w zliczanej pętli. – vaxquis

Odpowiedz

58

Zastosowanie Tożsamość:

log b (n) = log e (n)/log e (b)

przypadku log może być funkcją logarytmu w dowolnej bazie jest numerem n, a podstawą jest b. Na przykład w Javie to znajdzie base-2 logarytm 256:

Math.log(256)/Math.log(2) 
=> 8.0 

Math.log() wykorzystuje baza e, nawiasem mówiąc. Jest też Math.log10(), który używa bazy 10.

+0

Znam tę tożsamość. Chcę obliczyć logarytm z większą dokładnością, niż może dać podwójne. – Justin

+1

@ user1896169 w takim przypadku, przełącz na 'BigDecimal' i użyj tego [przepis] (http://stackoverflow.com/questions/739532/logarithm-of-a-bigdecimal) do obliczenia logarytmu –

+0

Math.log() domyślnie podstawa jest e – Suranga