Python数学模块的对数函数

5 投票
3 回答
7545 浏览
提问于 2025-04-17 14:01

可能重复的问题:
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.log10math.log(x, 10) 使用了不同的计算方法,前者通常更准确。实际上,这个问题是个已知的bug(Issue6765):math.log, log10 不一致

可以这样理解:log10(x) 是一个固定的底数,所以可以直接通过一些数学近似公式(比如泰勒级数)来计算。而 log(x, 10) 是来自一个更一般的公式,有两个变量,可能是通过 log(x) / log(10) 间接计算出来的(至少 log(10) 的精度会影响结果的精度)。所以,前者的计算方式自然会更快也更准确,这也很合理,因为它利用了一个已知的对数底数(即 10)。

撰写回答