重複の可能性:
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
重複の可能性:
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
これは既知のバグです: http://bugs.python.org/issue3724
logX(y) は、同等の log(Y, X) よりも常に正確であるようです。
math.log10
とmath.log(x, 10)
は異なるアルゴリズムを使用しており、通常は前者の方が正確です。実際には、既知の問題 (Issue6765): math.log, log10 inconsistencyです。
次のように考えることができます:log10(x)
固定ベースを持っているため、いくつかの数学的近似式 (テイラー級数など) によって直接計算できますがlog(x, 10)
、log(x) / log(10)
(少なくともlog(10) の精度は商の精度に影響します)。したがって、前者の方法の方が高速で正確であることは当然であり、既知の対数底 (つまり 10) を利用することを考えると妥当です。
他の人が指摘しているように、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
ため、最終結果も不正確です。