Развитие темы с табличным методом.
Пусть у нас есть таблица экспонент для интервала [0.,1.), двоичным поиском в которой мы находим логарифм для [1.,10.)
Понятное дело, количество элементов обратно точности: для 4 знаков это 10_000, для 5 — 100_000... в общем, много.
Заметим, однако, что экспонента на этом интервале растёт очень плавно, и её можно аппроксимировать кусочно-линейной функцией.
Дальше всё просто:
Пусть powers[] — таблица экспонент: powers[k] = 10^(a + k*10^-a), где a — точность (accuracy), количество знаков
Пусть xs[],ys[],vs[] — таблица точек изломов:
— xs[j] = k,
— ys[j] = powers[k],
— vs[j] = powers[k+1]-powers[k] = j+2
lg(x) для x в [10^a,10^(a+1)] находится следующим образом
— j = lower_bound(ys,x)
— d = x-ys[j]
— k = xs[j] + d/vs[j]
— lg(x) = k
1/lg'(1.) = 2.302, 1/lg'(10.) = 23.02 — так что...
Ура, товарищи!
Мы умеем находить логарифм с помощью таблицы из 23 элементов!
(На самом деле, чем выше точность, тем больше отрезков придётся вводить: скажем, не по +1, а по +0.1 — и, соответственно, масштабировать содержимое таблицы).
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>