1*3e12c5d1SDavid du Colombier /* 2*3e12c5d1SDavid du Colombier * asin(arg) and acos(arg) return the arcsin, arccos, 3*3e12c5d1SDavid du Colombier * respectively of their arguments. 4*3e12c5d1SDavid du Colombier * 5*3e12c5d1SDavid du Colombier * Arctan is called after appropriate range reduction. 6*3e12c5d1SDavid du Colombier */ 7*3e12c5d1SDavid du Colombier 8*3e12c5d1SDavid du Colombier #include <u.h> 9*3e12c5d1SDavid du Colombier #include <libc.h> 10*3e12c5d1SDavid du Colombier 11*3e12c5d1SDavid du Colombier double asin(double arg)12*3e12c5d1SDavid du Colombierasin(double arg) 13*3e12c5d1SDavid du Colombier { 14*3e12c5d1SDavid du Colombier double temp; 15*3e12c5d1SDavid du Colombier int sign; 16*3e12c5d1SDavid du Colombier 17*3e12c5d1SDavid du Colombier sign = 0; 18*3e12c5d1SDavid du Colombier if(arg < 0) { 19*3e12c5d1SDavid du Colombier arg = -arg; 20*3e12c5d1SDavid du Colombier sign++; 21*3e12c5d1SDavid du Colombier } 22*3e12c5d1SDavid du Colombier if(arg > 1) 23*3e12c5d1SDavid du Colombier return NaN(); 24*3e12c5d1SDavid du Colombier temp = sqrt(1 - arg*arg); 25*3e12c5d1SDavid du Colombier if(arg > 0.7) 26*3e12c5d1SDavid du Colombier temp = PIO2 - atan(temp/arg); 27*3e12c5d1SDavid du Colombier else 28*3e12c5d1SDavid du Colombier temp = atan(arg/temp); 29*3e12c5d1SDavid du Colombier if(sign) 30*3e12c5d1SDavid du Colombier temp = -temp; 31*3e12c5d1SDavid du Colombier return temp; 32*3e12c5d1SDavid du Colombier } 33*3e12c5d1SDavid du Colombier 34*3e12c5d1SDavid du Colombier double acos(double arg)35*3e12c5d1SDavid du Colombieracos(double arg) 36*3e12c5d1SDavid du Colombier { 37*3e12c5d1SDavid du Colombier if(arg > 1 || arg < -1) 38*3e12c5d1SDavid du Colombier return NaN(); 39*3e12c5d1SDavid du Colombier return PIO2 - asin(arg); 40*3e12c5d1SDavid du Colombier } 41