/************************************************************* ************************************************************* * ROUNDED TO NEAREST * ************************************************************* *************************************************************/ double scs_cos_rn(double x){ scs_t sc1, sc2; double resd; int N; #if EVAL_PERF crlibm_second_step_taken++; #endif scs_set_d(sc1, x); N = rem_pio2_scs(sc2, sc1); N = N & 0x0000003; /* extract the 2 last bits of N */ switch (N){ case 0: cosine(sc2); scs_get_d(&resd, sc2); return resd; case 1: sine(sc2); scs_get_d(&resd, sc2); return -resd; case 2: cosine(sc2); scs_get_d(&resd, sc2); return -resd; case 3: sine(sc2); scs_get_d(&resd, sc2); return resd; default: fprintf(stderr,"ERREUR: %d is not a valid value in s_cos \n", N); return 0.0; } }
static void scs_tan(double x, scs_ptr res_scs){ scs_t x_scs; scs_t x2; int i; scs_t y_scs; int N; scs_set_d(x_scs, x); N = rem_pio2_scs(y_scs, x_scs); /* x (=sc2) is in [-Pi/4,Pi/4] */ N = N & 1; /* extract the last bit of N */ scs_square(x2, y_scs); scs_mul(res_scs, tan_scs_poly_ptr[0], x2); for(i=1; i<(DEGREE_TAN_SCS-1)/2; i++){ /* The last coeff is not read from the file. */ scs_add(res_scs, tan_scs_poly_ptr[i], res_scs); scs_mul(res_scs, res_scs, x2); } scs_mul(res_scs, res_scs, y_scs); scs_add(res_scs, y_scs, res_scs); if(N==1) { scs_inv(res_scs, res_scs); res_scs->sign = -res_scs->sign; } }