Python数学模块的对数函数
可能重复的问题:
Python中的对数不准确
为什么 math.log10(x)
和 math.log(x,10)
的结果会不一样呢?
In [1]: from math import *
In [2]: log10(1000)
Out[2]: 3.0
In [3]: log(1000,10)
Out[3]: 2.9999999999999996
3 个回答
2
正如其他人提到的,log(1000, 10)
这个计算实际上是通过 log(1000) / log(10)
来完成的。你可以通过实际测试来验证这一点:
In [3]: math.log(1000, 10) == math.log(1000) / math.log(10)
Out[3]: True
In [4]: math.log10(1000) == math.log(1000) / math.log(10)
Out[4]: False
而且 log(1000)
和 log(10)
的结果都不能用 float
这种格式准确表示,所以最后得到的结果也是不精确的。
5
这是一个众所周知的错误:http://bugs.python.org/issue3724
看起来 logX(y) 的计算总是比 log(Y, X) 更准确。
4
math.log10
和 math.log(x, 10)
使用了不同的计算方法,前者通常更准确。实际上,这个问题是个已知的bug(Issue6765):math.log, log10 不一致。
可以这样理解:log10(x)
是一个固定的底数,所以可以直接通过一些数学近似公式(比如泰勒级数)来计算。而 log(x, 10)
是来自一个更一般的公式,有两个变量,可能是通过 log(x) / log(10)
间接计算出来的(至少 log(10)
的精度会影响结果的精度)。所以,前者的计算方式自然会更快也更准确,这也很合理,因为它利用了一个已知的对数底数(即 10)。