在Java中计算双精度数的以2为底的对数

4
我正在尝试使用以下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只有自然对数和以10为底的对数。我正在尝试使用换底公式来获取letterFrequencies[i]的以2为底的对数。我不知道我是否正确地实现了它,因为我期望得到接近4.18的答案,但实际上得到的是大约0.028。


@turbo OP正在使用这个公式:http://en.wikipedia.org/wiki/Logarithm#Change_of_base - Luiggi Mendoza
可能不是重复问题,但与您的情况相关:https://dev59.com/LXA75IYBdhLWcg3wboYz - Luiggi Mendoza
letterFrequencies 的内容是什么? - tmyklebu
1
“i < letterFrequencies[i]” 这个对吗?难道不应该是 “i < letterFrequencies.length” 吗? - fps
1
应该是letterFrequencies.length。那就是我的问题了。 - Nick Gilbert
显示剩余2条评论
2个回答

2
问题出在 for 循环的停止条件上: i < letterFrequencies[i] 应该改为 i < letterFrequencies.length
此外,我建议使用Guava 的 DoubleMath.log2() 方法,这是一种优化方法,正如 @LutzL 所建议的那样。

-3

从数学上讲,这个实现是正确的,但在代码中却行不通。相反,你可以编写自己的实现,它运行速度显著更快:

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

来源:如何在Java中计算整数的以2为底的对数?


是的,那是log2的正确实现。从数学上讲是正确的,但从程序上讲不是。 - Luiggi Mendoza
是的。这也在您发布的代码片段所在的问题中有解释。 - Luiggi Mendoza
我可以这样编辑我的回答吗?(我是stackoverflow的新手) - flaghacker
返回值给出了Math.floor(Math.log(n)/Math.log(2))。 - Yossarian42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接