Алгоритм вычисления арктангенса Страница 2. Программа вычисления арктангенса
|
Страница 2 из 2 Программа вычисления арктангенса
Ниже приведена программа вычисления арктангенса по указанному алгоритму. Программа вычисления арксинуса и арккосинуса, приведенная еще ниже, использует как внешние ее и программу для квадратного корня. /* вычисление арктангенса без мат. библиотеки */
float Arctan(float x); */
#define M_PI ((float)3.141592653589793) #define M_PI12 (M_PI/12.F) #define M_PI6 (M_PI/6.F) #define M_PI2 (M_PI/2.F) /* квадратный корень из 3 */ #define SQRT3 ((float)1.732050807569)
float Arctan(float x) { int sta=0,sp=0; float x2,a; /* проверка смены знака */ if(x<0.F) {x=-x;sta|=1;} /* проверка инверсии */ if(x>1.F) {x=1.F/x;sta|=2;} /* сжатие области, пока не x<PI/12 */ while(x>M_PI12) { sp++; a=x+SQRT3; a=1.F/a; x*=SQRT3; x-=1.F; x*=a; } /* вычисления */ x2=x*x; a=x2+1.4087812F; a=0.55913709F/a; a+=0.60310579F; a-=0.05160454F*x2; a*=x; /* пока не sp=0 */ while(sp>0) {a+=M_PI6;sp--;} if(sta&2) a=M_PI2-a; if(sta&1) a=-a; return(a); }
/* Вычисление арксинуса и арккосинуса. Использует Arctan() и Sqroot() как внешние вызовы.
int Arcsin(float *a,float x); x - аргумент, a - указатель на результат Возвращает код ошибки NORMAL или EDOM
int Arccos(float *a,float x); x - аргумент, a - указатель на результат Возвращает код ошибки NORMAL или EDOM
*/
#define M_PI ((float)3.141592653589793) #define M_PI2 (M_PI/2.F)
enum{NORMAL,EDOM};
extern float Arctan(float x); extern float Sqroot(float x);
int Arcsin(float *a,float x) { /* проверка исключений */ if(x<-1.F) {*a=-M_PI2;return(EDOM);} if(x==-1.F) {*a=-M_PI2;return(NORMAL);} if(x>1.F) {*a=M_PI2;return(EDOM);} if(x==1.F) {*a=M_PI2;return(NORMAL);} /* преобразование аргумента */ x/=Sqroot(1.F-x*x); *a=Arctan(x); // положительный результат return(NORMAL); }
int Arccos(float *a,float x) { int re=Arcsin(a,x); *a=M_PI2-(*a); return(re); }
|