سلام!
در این مثال ابتدا تابع ln با استفاده از بسط Taylor تابع (ln(x+1 اطراف ۰، موسوم به Mercator Series یا Newton-Mercator Series محاسبه می شه:
که در این برنامه ۱۰۰۰ جمله ی اول محاسبه می شه. هر چه جملات بیش تر و بیش تری محاسبه بشه، خطا کم تر و کم تر می شه...
برای مقادیر بزرگ تر ۱ از این رابطه استفاده شده:
... بعد تابع log در هر مبنای دیگه ای با توجه به این رابطه پیاده سازی می شه:
#include <iostream>
#include <cmath>
using namespace std;
double my_ln(double x)
{
if (x == 1) return 0;
double s = 0;
if (abs(-1 + x) < 1)
{
for (int k = 1; k <= 1000; k++)
s += pow(-1, k) * pow(-1 + x, k) / k;
return -s;
} else return -my_ln(1 / x);
}
double my_log(double x, double base)
{
return my_ln(x) / my_ln(base);
}
int main()
{
cout << "x = "; double x; cin >> x;
cout << "ln(x) = " << my_ln(x) << endl;
return 0;
}