Python中的精确数学.log(x,2)
在python中,我需要得到基数为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()方法
>>> 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