快速找到基数2对数的整数部分

And*_* H. 4 c c++ floating-point ieee-754

计算浮点数的基数2对数的整数部分的有效方法是什么?就像是

N = ceil( log2( f ))
Run Code Online (Sandbox Code Playgroud)

要么

N = floor( log2( f ))
Run Code Online (Sandbox Code Playgroud)

浮点数f.我想这可能会以某种方式非常有效地实现,因为可能只需要访问浮点指数.

编辑2:我对准确性并不感兴趣.我可以容忍+ -1的错误.我列举了这两个变种只是作为一个例子,因为一个可能在计算上比另一个更便宜(但我不知道).

我需要这个用于算法的精确控制,其中参数f是一些容差,并且需要日志来控制术语的数量.准确计算日志并不重要.

编辑:这不是要求整数参数的log2的其他许多问题的重复(例如,如何在C++中执行整数log2()?).这是关于浮点论证和完全不同的故事.具体来说,我需要f <1,这对于整数方法是不可能的

ric*_*ici 7

标准库函数frexp就是这样:它将double分解为整数指数和标准化尾数.

如果您满足于对数的最低限度,而不是将对数舍入到最接近的整数,那么使用较新的标准库函数可能会更好ilogb.

请注意,这两个函数以不同方式处理零和无穷大,因此它们不是可互换的.