在Java中计算浮点的整数log base 2

在Java中计算浮点的整数log base 2,java,Java,在Java中,如何找到浮点值的对数基数2(作为整数)向下舍入 有没有快速的方法可以做到这一点?您可以使用Java的标准数学库,通过更改对数的基本规则来计算: public static final int log2(float f) { return (int)Math.floor(Math.log(f)/Math.log(2.0)); } 或者,您可以利用该信息显式存储在IEEE 754浮点中的事实: 指数实际上精确地包含了你要寻找的答案,你所要做的就是将它一直向右移位,然后从中减

在Java中,如何找到浮点值的对数基数2(作为整数)向下舍入


有没有快速的方法可以做到这一点?

您可以使用Java的标准数学库,通过更改对数的基本规则来计算:

public static final int log2(float f)
{
    return (int)Math.floor(Math.log(f)/Math.log(2.0));
}
或者,您可以利用该信息显式存储在IEEE 754浮点中的事实:

指数实际上精确地包含了你要寻找的答案,你所要做的就是将它一直向右移位,然后从中减去127。当然,有些浮点值的指数为-127(表示为零)。这些被称为次正常值,提取它们的对数有点棘手。此处使用查找表查找:

private static final int[] logTable = new int[256];

static
{
    logTable[0] = logTable[1] = 0;
    for (int i=2; i<256; i++) logTable[i] = 1 + logTable[i/2];
    logTable[0] = -1;
}

public static final int log2(float f)
{
    int x = Float.floatToIntBits(f);
    int c = x >> 23;

    if (c != 0) return c - 127; //Compute directly from exponent.
    else //Subnormal, must compute from mantissa.
    {
        int t = x >> 16;
        if (t != 0) return logTable[t] - 133;
        else return (x >> 8 != 0) ? logTable[t] - 141 : logTable[x] - 149;
    }
}
private static final int[]logTable=new int[256];
静止的
{
logTable[0]=logTable[1]=0;
对于(int i=2;i>23;
如果(c!=0)返回c-127;//直接从指数计算。
否则//低于正常值,必须从尾数计算。
{
int t=x>>16;
如果(t!=0)返回日志表[t]-133;
else返回(x>>8!=0)?logTable[t]-141:logTable[x]-149;
}
}

此解决方案(改编自)比前一个解决方案快了很多。这两种方法都会对负值或无穷大值、零和NaN产生未定义的结果,除非您在复杂空间中工作。

值得注意的是,有一个
Math.getExponent(float)
方法将完成第一部分(从浮动中获取指数)为您提供。