Python数学模块对数函数

时间:2013-01-29 06:57:28

标签: python math ieee-754

  

可能重复:
  Inaccurate Logarithm in 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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分: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,因此最终结果也不准确。