summaryrefslogtreecommitdiff
path: root/sin_cos.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2005-10-05 21:57:48 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2005-10-05 21:57:48 +0000
commit0e1d259e33037098ec273c12ddf464c25040f4df (patch)
tree2fb9f8f2ccea70882325d2f7d74de46a907aa321 /sin_cos.c
parent415cf48cb5ac8045a61ef890e4434f77417601e9 (diff)
downloadmpfr-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.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sin_cos.c b/sin_cos.c
index 22a25bf47..ec822fd9f 100644
--- a/sin_cos.c
+++ b/sin_cos.c
@@ -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);