xref: /plan9/sys/src/ape/lib/ap/math/asin.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier 	asin(arg) and acos(arg) return the arcsin, arccos,
33e12c5d1SDavid du Colombier 	respectively of their arguments.
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier 	Arctan is called after appropriate range reduction.
63e12c5d1SDavid du Colombier  */
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier #include <math.h>
93e12c5d1SDavid du Colombier #include <errno.h>
103e12c5d1SDavid du Colombier 
11*7dd7cddfSDavid du Colombier static double pio2	= 1.570796326794896619231e0;
123e12c5d1SDavid du Colombier 
133e12c5d1SDavid du Colombier double
asin(double arg)143e12c5d1SDavid du Colombier asin(double arg)
153e12c5d1SDavid du Colombier {
16*7dd7cddfSDavid du Colombier 	double temp;
17*7dd7cddfSDavid du Colombier 	int sign;
183e12c5d1SDavid du Colombier 
19*7dd7cddfSDavid du Colombier 	sign = 0;
203e12c5d1SDavid du Colombier 	if(arg < 0) {
213e12c5d1SDavid du Colombier 		arg = -arg;
22*7dd7cddfSDavid du Colombier 		sign++;
233e12c5d1SDavid du Colombier 	}
243e12c5d1SDavid du Colombier 	if(arg > 1) {
253e12c5d1SDavid du Colombier 		errno = EDOM;
263e12c5d1SDavid du Colombier 		return 0;
273e12c5d1SDavid du Colombier 	}
283e12c5d1SDavid du Colombier 	temp = sqrt(1 - arg*arg);
293e12c5d1SDavid du Colombier 	if(arg > 0.7)
303e12c5d1SDavid du Colombier 		temp = pio2 - atan(temp/arg);
313e12c5d1SDavid du Colombier 	else
323e12c5d1SDavid du Colombier 		temp = atan(arg/temp);
333e12c5d1SDavid du Colombier 
34*7dd7cddfSDavid du Colombier 	if(sign)
35*7dd7cddfSDavid du Colombier 		temp = -temp;
36*7dd7cddfSDavid du Colombier 	return temp;
373e12c5d1SDavid du Colombier }
383e12c5d1SDavid du Colombier 
393e12c5d1SDavid du Colombier double
acos(double arg)403e12c5d1SDavid du Colombier acos(double arg)
413e12c5d1SDavid du Colombier {
423e12c5d1SDavid du Colombier 	if(arg > 1 || arg < -1) {
433e12c5d1SDavid du Colombier 		errno = EDOM;
443e12c5d1SDavid du Colombier 		return 0;
453e12c5d1SDavid du Colombier 	}
463e12c5d1SDavid du Colombier 	return pio2 - asin(arg);
473e12c5d1SDavid du Colombier }
48