【问题标题】:Python math module logarithm functions [duplicate]Python数学模块对数函数[重复]
【发布时间】:2013-01-29 06:57:27
【问题描述】:

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

【问题讨论】:

  • 一些浮点精度问题
  • 看起来 log(1000,10) 被解释为 log(1000)/log(10),这是有道理的。然后归结为具有直接 log10 函数与执行两个对数并将它们相除的浮点误差之间的区别。前者更准确也就不足为奇了。

标签: python math ieee-754


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      正如其他人所指出的,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,所以最终的结果也是不准确的。

      【讨论】:

        猜你喜欢
        • 2012-02-05
        • 2019-03-22
        • 2018-03-17
        • 2011-01-05
        • 2016-05-24
        • 1970-01-01
        • 2015-10-27
        • 2022-07-23
        • 2017-03-24
        相关资源
        最近更新 更多