加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:48:07 所属栏目:百科 来源:网络整理
导读:我有32-8191的整数值,我想映射到一个粗略的对数刻度.如果我使用base 2,我可以计算前导零位并将它们映射到8个插槽,但这也是过程粗糙的;我需要32个插槽(更多会更好,但我需要它们映射到32位值中的位),这对于对数大约为1.18-1.20.任何人都有一些技巧来计算这个值
我有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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读