diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-10-05 21:57:48 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2005-10-05 21:57:48 +0000 |
commit | 0e1d259e33037098ec273c12ddf464c25040f4df (patch) | |
tree | 2fb9f8f2ccea70882325d2f7d74de46a907aa321 /sin_cos.c | |
parent | 415cf48cb5ac8045a61ef890e4434f77417601e9 (diff) | |
download | mpfr-0e1d259e33037098ec273c12ddf464c25040f4df.tar.gz |
small improvement in sign detection
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@3880 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'sin_cos.c')
-rw-r--r-- | sin_cos.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -62,8 +62,10 @@ mpfr_sin_cos (mpfr_ptr y, mpfr_ptr z, mpfr_srcptr x, mp_rnd_t rnd_mode) mpfr_init2 (c, m); /* first determine sign of sinus */ - if (MPFR_GET_EXP (x) > 0) + if (MPFR_GET_EXP (x) > 1) /* |x| >= 2 */ { + /* FIXME: we can start with a small precision, + and increase until we can decide the sign. */ mpfr_init2 (k, m); mpfr_const_pi (c, GMP_RNDN); mpfr_mul_2ui (c, c, 1, GMP_RNDN); /* 2*Pi */ @@ -75,7 +77,7 @@ mpfr_sin_cos (mpfr_ptr y, mpfr_ptr z, mpfr_srcptr x, mp_rnd_t rnd_mode) neg = mpfr_cmp (k, c) > 0; mpfr_clear (k); } - else + else /* if EXP(x) <= 1, then |x| < 2, thus sign(sin(x)) = sign(x) */ neg = MPFR_IS_NEG (x); MPFR_ZIV_INIT (loop, m); @@ -83,7 +85,7 @@ mpfr_sin_cos (mpfr_ptr y, mpfr_ptr z, mpfr_srcptr x, mp_rnd_t rnd_mode) { mpfr_cos (c, x, GMP_RNDZ); if (!mpfr_can_round (c, m, GMP_RNDZ, rnd_mode, MPFR_PREC (z))) - goto next_step; + goto next_step; mpfr_set (z, c, rnd_mode); mpfr_sqr (c, c, GMP_RNDU); mpfr_ui_sub (c, 1, c, GMP_RNDN); |