Корень в N-ой степени.


Для получения корня 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
 

************************************/