Питон математические функции логарифм модуля [дубликат]


Возможный дубликат:
неточный логарифм в 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 3

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, поэтому конечный результат также неточен.