2012-12-12 29 views
18

我需要評估任何基數的對數,這對一些精度無關緊要。有沒有這樣的算法?我用Java編程,所以用Java代碼很好。對數算法

How to find a binary logarithm very fast? (O(1) at best)也許能夠回答我的問題,但我不明白。可以澄清嗎?

+0

該問題中提到的技巧利用數字在內存中的存儲方式。如果你不完全理解這些技巧,你最好依靠數學(或BigInteger/BigDecimal)的方法。無論如何,他們利用這樣一個事實,即數字在內部非常接近於他們在基數2中的表示。在Java中,您沒有聯盟,而是通過[Double.doubleToRawLongBits]獲得雙精度的原始位(http:// docs .oracle.com/JavaSE的/ 6 /文檔/ API /爪哇/郎/ Double.html#doubleToRawLongBits(雙))。 – ignis

+0

BigInteger和BigDecimal不包含日誌方法。 – Justin

+0

確切。對於整數使用計數循環中明顯的位移。 – vaxquis

回答

58

使用該身份:

日誌 b(N)=登錄È(N)/日誌ë(B)

在哪裏log可以是一個對數函數在任何基地,n是數字和b是基地。例如,在Java中,這將發現的256基2對數:

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

Math.log()使用基地e,順便說一句。還有Math.log10(),它使用基地10

+0

我知道身份。我想計算一個比雙精度值更精確的對數。 – Justin

+1

@ user1896169在這種情況下,切換到'BigDecimal'並使用此[配方](http://stackoverflow.com/questions/739532/logarithm-of-a-bigdecimal)來計算對數 –

+0

Math.log()默認基地是e – Suranga