2015-02-09 201 views
2

我嘗試使用下面的Java函數來計算英文熵日誌基地2 Java進行雙打

public static void calculateEntropy() 
    { 
     for(int i = 0; i < letterFrequencies[i]; i++) 
     { 
      entropy += letterFrequencies[i] * (Math.log(letterFrequencies[i])/Math.log(2)); 
     } 
     entropy *= -1; 
    } 

我使用的公式需要數底2,但Java只有自然對數和日誌base 10.我試圖使用基本公式的變化來獲取letterFrequencies [i]的日誌基2。我不知道我是否正確實施它,因爲我期望接近4.18的答案,而是大致獲得.028

+0

@turbo OP使用此公式:http://en.wikipedia.org/wiki/Logarithm#Change_of_base – 2015-02-09 16:12:41

+0

可能不是一個dup,但與您的情況有關:http://stackoverflow.com/q/3305059/1065197 – 2015-02-09 16:12:59

+0

確保所有其他部件實際上按預期工作。你可能試圖解決錯誤的問題。我會刪除日誌部分來檢查值是否是預期的。 – Voicu 2015-02-09 16:27:42

回答

-2

從數學上來說,實現是正確的,但它在代碼中不起作用。你可以代替寫自己的實現,女巫顯著運行速度會快:

public static int log2(int n){ 
    if(n <= 0) throw new IllegalArgumentException(); 
    return 31 - Integer.numberOfLeadingZeros(n); 
} 

來源:How do you calculate log base 2 in Java for integers?

+0

*是的,這是log2 *的正確實現,它在數學上是正確的,但在編程上它不是。 – 2015-02-09 16:13:24

+0

爲什麼不呢?浮點錯誤? – flaghacker 2015-02-09 16:15:34

+0

是的。這也解釋了你從哪裏獲得你發佈的代碼的問題。 – 2015-02-09 16:16:02

1

的問題是在for的停止條件:

i < letterFrequencies[i]應該i < letterFrequencies.length

此外,我會使用Guava's DoubleMath.log2() method,這是作爲@LutzL建議優化。