Питон математические функции логарифм модуля [дубликат]
Возможный дубликат:
неточный логарифм в 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 ответа:
math.log10
иmath.log(x, 10)
используют другой алгоритм, и первый, как правило, более точен. На самом деле, это известная проблема(Issue6765): математика.log, log10 несоответствие .Можно думать так:
log10(x)
имеет фиксированную базу, следовательно, она может быть вычислена непосредственно по некоторой математической формуле аппроксимации(например, ряд Тейлора), в то время какlog(x, 10)
исходит из более общей формулы с двумя переменными, которые могут быть косвенно вычислены поlog(x) / log(10)
(по крайней мере, точность log (10) повлияет на точность логарифма). точность частного). Поэтому естественно, что первый способ является одновременно более быстрым и точным, и это разумно, учитывая, что он использует заранее известную логарифмическую базу(т. е.
Это известная ошибка: http://bugs.python.org/issue3724
Кажется, что logX(y) всегда более точен, чем эквивалентный log (Y, X).
Как указывали другие,
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
, поэтому конечный результат также неточен.