Алгоритм вычисления арктангенса - Программа вычисления арктангенса

ОГЛАВЛЕНИЕ

 

Программа вычисления арктангенса

Ниже приведена программа вычисления арктангенса по указанному алгоритму. Программа вычисления арксинуса и арккосинуса, приведенная еще ниже, использует как внешние ее и программу для квадратного корня.

/* вычисление арктангенса без мат. библиотеки */

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);
}