xref: /csrg-svn/old/libm/libom/asin.c (revision 9926)
1*9926Ssam /*	@(#)asin.c	4.1	12/25/82	*/
2*9926Ssam 
3*9926Ssam /*
4*9926Ssam 	asin(arg) and acos(arg) return the arcsin, arccos,
5*9926Ssam 	respectively of their arguments.
6*9926Ssam 
7*9926Ssam 	Arctan is called after appropriate range reduction.
8*9926Ssam */
9*9926Ssam 
10*9926Ssam #include	<errno.h>
11*9926Ssam int errno;
12*9926Ssam double atan();
13*9926Ssam double sqrt();
14*9926Ssam static double pio2	= 1.570796326794896619;
15*9926Ssam 
16*9926Ssam double
asin(arg)17*9926Ssam asin(arg) double arg; {
18*9926Ssam 
19*9926Ssam 	double sign, temp;
20*9926Ssam 
21*9926Ssam 	sign = 1.;
22*9926Ssam 	if(arg <0){
23*9926Ssam 		arg = -arg;
24*9926Ssam 		sign = -1.;
25*9926Ssam 	}
26*9926Ssam 
27*9926Ssam 	if(arg > 1.){
28*9926Ssam 		errno = EDOM;
29*9926Ssam 		return(0.);
30*9926Ssam 	}
31*9926Ssam 
32*9926Ssam 	temp = sqrt(1. - arg*arg);
33*9926Ssam 	if(arg > 0.7)
34*9926Ssam 		temp = pio2 - atan(temp/arg);
35*9926Ssam 	else
36*9926Ssam 		temp = atan(arg/temp);
37*9926Ssam 
38*9926Ssam 	return(sign*temp);
39*9926Ssam }
40*9926Ssam 
41*9926Ssam double
acos(arg)42*9926Ssam acos(arg) double arg; {
43*9926Ssam 
44*9926Ssam 	if((arg > 1.) || (arg < -1.)){
45*9926Ssam 		errno = EDOM;
46*9926Ssam 		return(0.);
47*9926Ssam 	}
48*9926Ssam 
49*9926Ssam 	return(pio2 - asin(arg));
50*9926Ssam }
51