5

可能重复:
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
4

3 回答 3

5

这是一个已知的错误:http ://bugs.python.org/issue3724

似乎 logX(y) 总是比等效的 log(Y, X) 更精确。

于 2013-01-29T07:03:09.570 回答
4

math.log10并且math.log(x, 10)使用不同的算法,前者通常更准确。实际上,这是一个已知问题(Issue6765):math.log, log10 inconsistency

有人可能会这样想:log10(x)有一个固定的底,因此可以直接通过一些数学逼近公式(例如泰勒级数)来计算,而log(x, 10)来自一个更一般的有两个变量的公式,可以通过log(x) / log(10)(至少log(10) 的精度会影响商的精度)。所以很自然,前一种方法更快更准确,考虑到它利用了预先知道的对数基数(即 10),这是合理的。

于 2013-01-29T07:05:01.990 回答
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,所以最终的结果也是不精确的。

于 2013-01-29T07:56:53.710 回答