예제 #1
0
/*
 *                          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);
}
예제 #2
0
double atan( double ang )
{
	extern double fpu_atan(double);
	return fpu_atan(ang);
}
예제 #3
0
파일: atan.c 프로젝트: lhmouse/MCF
long double atanl(long double x){
	return fpu_atan(x);
}
예제 #4
0
파일: atan.c 프로젝트: lhmouse/MCF
double atan(double x){
	return (double)fpu_atan(x);
}
예제 #5
0
파일: atan.c 프로젝트: lhmouse/MCF
float atanf(float x){
	return (float)fpu_atan(x);
}