Python 中的精确 math.log(x, 2)
Precise math.log(x, 2) in Python
在 python 中,我需要获取以 2 为底的正整数的四舍五入对数,包括大数。
但是,由于使用了浮点运算,我可能会得到不好的结果,例如:
>>> import math
>>> int(math.log(281474976710655, 2))
48
但是:
>>> 2 ** 48
281474976710656
所以正确的结果,四舍五入,应该是 47。
如何获得正确的值?
在python 3 int
s甚至有一个高效的.bit_length()
方法!
>>> (281474976710655).bit_length()
48
>>> (281474976710656).bit_length()
49
在python2中,不使用浮点运算,而是计算位数:
def log2(n):
assert n >= 1
return len(bin(n)) - 3 # bin() returns a string starting with '0b'
(已编辑 关注 )
在 Python 3 中,整数有一个 .bit_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)
输出
47 True
999 True
1000 True
1000 True
在 python 中,我需要获取以 2 为底的正整数的四舍五入对数,包括大数。
但是,由于使用了浮点运算,我可能会得到不好的结果,例如:
>>> import math
>>> int(math.log(281474976710655, 2))
48
但是:
>>> 2 ** 48
281474976710656
所以正确的结果,四舍五入,应该是 47。
如何获得正确的值?
在python 3 int
s甚至有一个高效的.bit_length()
方法!
>>> (281474976710655).bit_length()
48
>>> (281474976710656).bit_length()
49
在python2中,不使用浮点运算,而是计算位数:
def log2(n):
assert n >= 1
return len(bin(n)) - 3 # bin() returns a string starting with '0b'
(已编辑 关注
在 Python 3 中,整数有一个 .bit_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)
输出
47 True
999 True
1000 True
1000 True