Я попытался сделать вывод функции, которая аппроксимирует значение логарифма x (x — число с плавающей запятой), используя разложение Тейлора.
ln(x) = {n=0 (сигма) inf} (-1)^n*(x-1)^(n+1)/(n+1)
(использовано сигма-суммирование) для более четкого изображения разложения Тейлора см. https://en.wikipedia.org/wiki/Taylor_series#First_example
Кроме того: log(a,b)=log(a)/log(b) (a - основание)
Ниже приведена моя реализация с использованием этого принципа:
double logtaylor(double a,double b,double prec)
{
double suma=0,sumb=0,n;
for(n=0;n<prec+1;++n)
{
suma+=(pow(-1,n)*pow(a-1,n+1)/(n+1));
sumb+=(pow(-1,n)*pow(b-1,n+1)/(n+1));
printf("%d)suma=%lf\n",(int)n,suma);
printf("%d)sumb=%lf\n",(int)n,sumb);
}
return suma/sumb;
}
Я тестировал журнал от 3 до основания 2 -logtaylor(2,3,30)- на уровне точности 30.
Выход:
math.h: 0.630930
0)suma=1.000000
0)sumb=2.000000
1)suma=0.500000
1)sumb=0.000000
2)suma=0.833333
...
26)suma=0.711323
26)sumb=3272620.000449
27)suma=0.675609
27)sumb=-6314360.570980
28)suma=0.710091
28)sumb=12198429.497986
29)suma=0.676758
29)sumb=-23592964.635348
30)suma=0.709016
30)sumb=45680701.429168
Оба утверждения суммирования a и b абсолютно одинаковы, за исключением переменных, однако они ведут себя совершенно по-разному. Сумма довольно близка к реальному значению, рассчитанному в математическом заголовке. Я также подтвердил с помощью вычисления (log (2,3) ~ 0,63092975356), тогда как его аналог сильно отклоняется, достигая миллионов. Я не мог обдумать это. Я ценю любую помощь. Заранее спасибо.
Область сходимости ряда Тейлора для ln равна (0, 2]. Вне этого ряда ряд не будет сходиться к значению ln Икс; его величина будет расти вечно. Другими словами, у вас есть математическая задача, это не проблема программного обеспечения — программное обеспечение правильно оценивает ряд, но ряд Тейлора не аппроксимирует ln Икс за пределами 0 < Икс ≤ 2.