Python中的精确数学.log(x,2)

Python中的精确数学.log(x,2),python,binary,logarithm,Python,Binary,Logarithm,在python中,我需要得到基数为2的正整数的向下舍入对数,包括大数字 但是,由于使用浮点数学,我可能会得到不好的结果,例如: >>> import math >>> int(math.log(281474976710655, 2)) 48 然而: >>> 2 ** 48 281474976710656 所以正确的结果,四舍五入,应该是47 如何获得正确的值?在python 3中ints甚至有一个有效的.bit\u length()方法

在python中,我需要得到基数为2的正整数的向下舍入对数,包括大数字

但是,由于使用浮点数学,我可能会得到不好的结果,例如:

>>> import math
>>> int(math.log(281474976710655, 2))
48
然而:

>>> 2 ** 48
281474976710656
所以正确的结果,四舍五入,应该是47


如何获得正确的值?

在python 3中
int
s甚至有一个有效的
.bit\u length()
方法

>>> (281474976710655).bit_length()
48
>>> (281474976710656).bit_length()
49
在python 2中,不使用浮点数学,而是计算位数:

def log2(n):
    assert n >= 1
    return len(bin(n)) - 3  # bin() returns a string starting with '0b'

编辑后的如下)

在Python3中,整数有一个
.bit\u length
方法,因此您应该使用该方法来获得以2为底的四舍五入对数

下面是一个简短的演示:

m = 2 ** 1000
for n in (281474976710655, m-1, m, m+1):
    a = n.bit_length() - 1
    b = 2 ** a
    print(a, b <= n < 2 * b)

对于Python2来说这很好,但是在Python3中,bit_length比将数字转换为二进制字符串更有效。顺便说一句,在Python2.6+
格式中(n,'b')
bin
更方便,因为您不会得到讨厌的
'0b'
47 True
999 True
1000 True
1000 True