特殊情况下的快速整数对数

前端之家收集整理的这篇文章主要介绍了特殊情况下的快速整数对数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有32-8191的整数值,我想映射到一个粗略的对数刻度.如果我使用base 2,我可以计算前导零位并将它们映射到8个插槽,但这也是过程粗糙的;我需要32个插槽(更多会更好,但我需要它们映射到32位值中的位),这对于对数大约为1.18-1.20.任何人都有一些技巧来计算这个值,或者一个合理的近似值,非常快?

我的直觉是用条件将范围分解为2或3个子范围,并为每个使用一个小的查找表,但我想知道是否有一些技巧我可以用count-leading-zeros然后改进结果,特别是因为结果不必是准确的,只是大致对数.

解决方法

为什么不使用前导位以外的下两位.您可以先将数字划分为8 bin,然后将接下来的两位进一步划分为4.在这种情况下,您可以使用非常快速的简单移位操作.

编辑:如果您认为使用对数是一个可行的解决方案.这是一般算法:

设a为对数的基数,范围为(b_min,b_max)=(32,8191).您可以使用以下公式找到基数:

log(b_max/b_min) / log(a) = 32 bin

哪个给你一个~1.1892026.如果使用此a作为对数的基数,则可以将范围(b_min,b_max)映射到(log_a(b_min),log_a(b_max))=(20.0004,52.0004).

现在你只需要用20.0004减去所有元素来得到范围(0,32).它保证所有元素都是对数均匀的.完成

注意:由于数值错误,元素可能会超出范围.您应该自己计算确切的值.

注2:log_a(b)= log(b)/ log(a)

猜你在找的C&C++相关文章