В ответе Игнасио уже упоминалось использование логарифмов. Но в конечном итоге мы используем exp()
, что опять-таки является библиотечной функцией. Так что, если вы вообще не хотите использовать библиотечные функции, вам придется прибегнуть к чему-то вроде расширения Тейлора из x^y
Поскольку прямая оценка расширения Тейлора для x^y
является утомительной, как упомянул Игнасио, base^power = exp( power*ln(base) )
. И разложение Тейлора для e ^ x довольно просто, а для ln (x) также очень просто. Оба они дают простую интерактивную / рекурсивную реализацию в C
Вот простая реализация e^x
с использованием вышеупомянутого расширения Тейлора
double pow_x ( double x , unsigned i )
{
double prod=1;
if ( i == 0 )
return 1;
while ( i )
{
prod*=x;
i--;
}
return prod;
}
long long factorial ( unsigned n )
{
if ( n == 0 )
return 1;
return n * factorial (n-1);
}
double expo ( double x, int terms )
{
/* terms tells us how long should we expand the taylor's series */
double sum=0;
unsigned i=0;
while ( i< terms )
{
sum+= pow_x(x,i)/factorial(i);
i++;
}
return sum;
}
exp(5.93,20)
дает 376.152869
, с чем Google стремится согласиться.
Надеюсь, используя этот пример, вы можете реализовать ln(x)
самостоятельно.