在Java中记录基数2以获得双精度数

时间:2015-02-09 16:07:23

标签: java math entropy

我正在尝试使用以下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;
    }

我使用的公式需要log base 2,但Java只有自然日志和日志库10.我正在尝试使用基本公式的更改来获取letterFrequencies [i]的日志库2。我不知道我是否正确实现它,因为我期待接近4.18的答案,而是大致得到.028

2 个答案:

答案 0 :(得分:1)

问题出在for停止条件:

i < letterFrequencies[i]应为i < letterFrequencies.length

此外,我会使用Guava's DoubleMath.log2() method,这是根据@LutzL建议优化的。

答案 1 :(得分:-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?