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 Colombierasin(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 Colombieracos(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