2015-02-09 37 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建议优化。