Python数学模块中的log2函数

46

为什么它不存在?

import math
[x for x in dir(math) if 'log' in x]
>>> ['log', 'log10', 'log1p']

我知道可以使用log(x,2)来计算,但是log2更加常用,所以有些困惑。

哦,看起来它只在C99中被定义,而不是C90,我想这回答了我的问题。尽管还是有点傻。

3个回答

55

我认为你已经回答了自己的问题。 :-) 没有 log2(x),因为你可以用 log(x, 2) 来代替。正如 Python 之禅(PEP 20)所说:"做一件事应该有-- 最好只有一种 --明显的方法。"

尽管如此,log2Issue3366 中被考虑过(请向下滚动到最后三个信息),并且在 Python 2.7 和 3.2 的 math 模块中添加了几个其他 C99 数学函数。

编辑: log2 在 Issue11888 中重新考虑并添加到 Python 3.3 中。


18
那就得问了,为什么存在log10 - Mark Ransom
5
log10是C89标准中的函数,因此它存在于所有常见平台上,包括Windows。因此,对于Python来说,在其周围添加一个包装器非常容易。 - Mark Dickinson
1
好的,说得也有道理。我猜人们喜欢log10,所以特别包含它,但不包括log2。看起来它实际上在numpy中,所以问题解决了。 - nick maxwell
1
文档实际上建议使用log10(x)而不是log(x, 10):"math.log10(x)返回x的以10为底的对数。这通常比log(x, 10)更准确"。那么,log(x, 2)是否比专用实现不够精确? - endolith
3
例如,如果你尝试找到大于或等于2 ** 29(=本身)的2的幂次方,使用2 ** ceil(log(n, 2)),你会得到错误答案,因为math.log(n, 2) = 29.000000000000004而不是29.0。 np.log2(n)= 29.0确切地产生了正确的答案。 - endolith

6

我不确定你想要什么,但从数学角度来看,可以使用math.log(x)/math.log(2)。

如果输入的X具有整数类型,并且您正在等待整数舍入结果,则可以使用右移运算符更快地完成。这可以使用SHR命令完成,而无需使用Taylor级数+本地插值(这是libc log()调用底层的内容)。


但从数字精度或良好编码的角度来看,不要这样做。 - SteveWithamDuplicate
是的,i.位数、i>>x、i/2**x 和/或 log2 的组合可以比单独使用 log2 获得更多位或更快的结果。 - SteveWithamDuplicate

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接