我有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)