static float128 poly_ln(float128 x1) { /* // // 3 5 7 9 11 13 15 // 1+u u u u u u u u // 1/2 ln --- ~ u + --- + --- + --- + --- + ---- + ---- + ---- = // 1-u 3 5 7 9 11 13 15 // // 2 4 6 8 10 12 14 // u u u u u u u // = u * [ 1 + --- + --- + --- + --- + ---- + ---- + ---- ] = // 3 5 7 9 11 13 15 // // 3 3 // -- 4k -- 4k+2 // p(u) = > C * u q(u) = > C * u // -- 2k -- 2k+1 // k=0 k=0 // // 1+u 2 // 1/2 ln --- ~ u * [ p(u) + u * q(u) ] // 1-u // */ return OddPoly(x1, ln_arr, L2_ARR_SIZE); }
/* |x| < 1/4 */ static float128 poly_atan(float128 x1, float_status_t &status) { /* // 3 5 7 9 11 13 15 17 // x x x x x x x x // atan(x) ~ x - --- + --- - --- + --- - ---- + ---- - ---- + ---- // 3 5 7 9 11 13 15 17 // // 2 4 6 8 10 12 14 16 // x x x x x x x x // = x * [ 1 - --- + --- - --- + --- - ---- + ---- - ---- + ---- ] // 3 5 7 9 11 13 15 17 // // 5 5 // -- 4k -- 4k+2 // p(x) = > C * x q(x) = > C * x // -- 2k -- 2k+1 // k=0 k=0 // // 2 // atan(x) ~ x * [ p(x) + x * q(x) ] // */ return OddPoly(x1, atan_arr, FPATAN_ARR_SIZE, status); }
/* 0 <= x <= pi/4 */ BX_CPP_INLINE float128 poly_sin(float128 x, float_status_t &status) { // 3 5 7 9 11 13 15 // x x x x x x x // sin (x) ~ x - --- + --- - --- + --- - ---- + ---- - ---- = // 3! 5! 7! 9! 11! 13! 15! // // 2 4 6 8 10 12 14 // x x x x x x x // = x * [ 1 - --- + --- - --- + --- - ---- + ---- - ---- ] = // 3! 5! 7! 9! 11! 13! 15! // // 3 3 // -- 4k -- 4k+2 // p(x) = > C * x > 0 q(x) = > C * x < 0 // -- 2k -- 2k+1 // k=0 k=0 // // 2 // sin(x) ~ x * [ p(x) + x * q(x) ] // return OddPoly(x, sin_arr, SIN_ARR_SIZE, status); }