【问题标题】:Log base 2 in Java for doubles在 Java 中记录以 2 为基础的双打
【发布时间】:2015-02-09 16:07:22
【问题描述】:

我正在尝试使用以下 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 使用这个公式:en.wikipedia.org/wiki/Logarithm#Change_of_base
  • 可能不是重复但与您的情况有关:stackoverflow.com/q/3305059/1065197
  • 确保所有其他部分都按预期工作。你可能试图解决错误的问题。我会删除日志部分以检查值是否符合预期。
  • i &lt; letterFrequencies[i] 这是正确的吗?不是i &lt; letterFrequencies.length吗?
  • 应该是 letterFrequencies.length。那是我的问题

标签: java math entropy


【解决方案1】:

问题在于for的停止条件:

i &lt; letterFrequencies[i] 应该是i &lt; letterFrequencies.length

此外,我会使用Guava's DoubleMath.log2() method,它按照@LutzL 的建议进行了优化。

【讨论】:

    【解决方案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?

    【讨论】:

    • 是的,这是 log2 的正确实现在数学上是正确的,但在编程上却不是。
    • 是的。问题中也说明了这一点,您从哪里获得了您发布的代码。
    • 可以这样编辑我的答案吗? (我是stackoverflow的新手)
    • 返回值给你 Math.floor(Math.log(n)/Math.log(2))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多