2012-12-12 6 views
18

Ich muss einen Logarithmus von jeder Basis, es spielt keine Rolle, bis zu einer gewissen Genauigkeit. Gibt es dafür einen Algorithmus? Ich programmiere in Java, also geht es mir gut mit Java-Code.Logarithmus-Algorithmus

How to find a binary logarithm very fast? (O(1) at best) könnte in der Lage sein, meine Frage zu beantworten, aber ich verstehe es nicht. Kann es geklärt werden?

+0

Die Tricks, die in dieser Frage erwähnt werden, nutzen die Art aus, wie Zahlen im Speicher gespeichert werden. Sie sollten sich besser auf die Methoden von Math (oder BigInteger/BigDecimal) verlassen, wenn Sie diese Tricks nicht vollständig verstehen. Jedenfalls nutzen sie die Tatsache aus, dass Zahlen intern sehr eng mit ihrer Repräsentation in Base 2 vertreten sind. In Java haben Sie keine Vereinigungen, stattdessen erhalten Sie die rohen Bits eines Double über [Double.doubleToRawLongBits] (http: // docs .oracle.com/javase/6/docs/api/java/lang/Doppel.html # doubleToRawLongBits (double)). – ignis

+0

BigInteger und BigDecimal enthalten keine Protokollmethoden. – Justin

+0

genau. Für Ints verwenden Sie diese offensichtliche Bitverschiebung in einer gezählten Schleife. – vaxquis

Antwort

58

verwenden Identität:

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

Wo log kann eine Logarithmusfunktion sein In jeder Basis ist n die Nummer und b ist die Basis. Zum Beispiel in Java wird dies die Basis-2-Logarithmus von 256 finden:

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

Math.log() Basis verwendet e, nebenbei bemerkt. Und es gibt auch Math.log10(), die Basis 10 verwendet.

+0

Ich kenne diese Identität. Ich möchte einen Logarithmus mit höherer Genauigkeit berechnen, als ein Doppel geben kann. – Justin

+1

@ user1896169 in diesem Fall wechseln Sie zu 'BigDecimal' und verwenden Sie diese [Rezept] (http://StackOverflow.com/questions/739532/Logarithm-of-Abigdecimal) für die Berechnung des Logarithmus –

+0

Math.log() Standard Basis ist e – Suranga