Для получения корня N-ой степени нужно;
1. Определить приблизительное минимальное значение результата - значение,
близкое 'снизу' .
2. Определить верхний предел - значение, близкое сверху.
3. Иметь обратную функция - в нашем случае это pow(S,N) - возведение
числа в произвольную степень.
4. Убедиться, что функция непрерывна и возрастающая на данном промежутке.
5. Выполнить двоичный поиск, пока разность верхнего и нижнего предела
больше допустимой погрешности вычисления.
Разумеется, данным способом можно найти не только корень произвольной степени из чмсла, но и значение практически любой функции от одного аргумента, если известа обратьная функция и функция непрерывна и возрастающая на данном промежутке. Примеры: если есть функция sin, то можно легко найти asin с некоторой проверкой непрерывности и возрастания.
Пример кода:
/*
@author Korniloff E.
@version 1.00
2007
@site: www.sbor.net/~e_k
@compiler
Gnu C for windows
корень в N-ой степени
*/
#include <math.h>
#include <stdio.h>
int cnt;
double SqrtN(double S, int N){
const double math_err = 0.001;
const int Max = 1000;
cnt = 0;
double low = 0, high = S<1
? 2 : S*2;
while( high - low > math_err
&& ++cnt < Max )
{
double r
= (high + low)/2;
double x
= pow( r, N );
if( x ==
S ) return r;
else if(
x < S ) low = r;
else high
= r;
}
return (low + high) / 2;
}
main(){
printf("%0.2lf; %d %\n", SqrtN(0.64,
2), cnt);
printf("%0.2lf; %d %\n", SqrtN(9.3,
3), cnt);
printf("%0.2lf; %d %\n", SqrtN(32,
5), cnt);
printf("%0.2lf; %d %\n", SqrtN(1000,
7), cnt);
system("PAUSE");
}
/************** output ************
0.80; 11
2.10; 15
2.00; 5
2.68; 21
************************************/