/* * x * arcsin(x) = arctan(---------------) * sqrt(1 - x^2) */ struct fpn * fpu_asin(struct fpemu *fe) { struct fpn x; struct fpn *r; if (ISNAN(&fe->fe_f2)) return &fe->fe_f2; if (ISZERO(&fe->fe_f2)) return &fe->fe_f2; if (ISINF(&fe->fe_f2)) return fpu_newnan(fe); CPYFPN(&x, &fe->fe_f2); /* x^2 */ CPYFPN(&fe->fe_f1, &fe->fe_f2); r = fpu_mul(fe); /* 1 - x^2 */ CPYFPN(&fe->fe_f2, r); fe->fe_f2.fp_sign = 1; fpu_const(&fe->fe_f1, FPU_CONST_1); r = fpu_add(fe); /* sqrt(1-x^2) */ CPYFPN(&fe->fe_f2, r); r = fpu_sqrt(fe); /* x/sqrt */ CPYFPN(&fe->fe_f2, r); CPYFPN(&fe->fe_f1, &x); r = fpu_div(fe); /* arctan */ CPYFPN(&fe->fe_f2, r); return fpu_atan(fe); }
double sqrt( double val ) { extern double fpu_sqrt(double); return fpu_sqrt(val); }