2024-04-26 01:03:43 发布
网友
在python中,我需要得到以2为底的正整数的向下舍入对数,包括大数。你知道吗
但是,由于使用了浮点数学,我可能会得到不好的结果,例如:
>>> import math >>> int(math.log(281474976710655, 2)) 48
但是:
>>> 2 ** 48 281474976710656
所以正确的结果,四舍五入,应该是47。你知道吗
如何获得正确的值?你知道吗
在python3中,整数有一个.bit_length方法,因此您应该使用它来获得向下舍入的以2为底的对数。你知道吗
.bit_length
下面是一个简短的演示:
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
在python3中int甚至有一个有效的.bit_length()方法!你知道吗
int
.bit_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'
(编辑后this comment)
在python3中,整数有一个
.bit_length
方法,因此您应该使用它来获得向下舍入的以2为底的对数。你知道吗下面是一个简短的演示:
输出
在python3中
int
甚至有一个有效的.bit_length()
方法!你知道吗在python 2中,不要使用浮点数学,而是计算位数:
(编辑后this comment)
相关问题 更多 >
编程相关推荐