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

2024-04-26 01:03:43 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,我需要得到以2为底的正整数的向下舍入对数,包括大数。你知道吗

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

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

但是:

>>> 2 ** 48
281474976710656

所以正确的结果,四舍五入,应该是47。你知道吗

如何获得正确的值?你知道吗


Tags: importlog对数数学mathint浮点正整数
2条回答

在python3中,整数有一个.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

在python3中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

相关问题 更多 >

    热门问题