ref: 2e9835e771c54cb9a0c9cd81012e7b4b75f878f7
dir: /sys/src/ape/lib/ap/math/asin.c/
/* asin(arg) and acos(arg) return the arcsin, arccos, respectively of their arguments. Arctan is called after appropriate range reduction. */ #include <math.h> #include <errno.h> static double pio2 = 1.570796326794896619231e0; double asin(double arg) { double temp; int sign; sign = 0; if(arg < 0) { arg = -arg; sign++; } if(arg > 1) { errno = EDOM; return 0; } temp = sqrt(1 - arg*arg); if(arg > 0.7) temp = pio2 - atan(temp/arg); else temp = atan(arg/temp); if(sign) temp = -temp; return temp; } double acos(double arg) { if(arg > 1 || arg < -1) { errno = EDOM; return 0; } return pio2 - asin(arg); }