summaryrefslogtreecommitdiff
path: root/src/sqr.c
diff options
context:
space:
mode:
authorenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2008-10-04 22:03:00 +0000
committerenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2008-10-04 22:03:00 +0000
commit09ddbbc6d17ccb51ee253cf5cc426882f2ac6f05 (patch)
tree63269d1e6d48f6960bf7122374ec538a4236e250 /src/sqr.c
parentd40cf65aee9976cb8fb8ed0a7ddbc9959d6d7a76 (diff)
downloadmpc-09ddbbc6d17ccb51ee253cf5cc426882f2ac6f05.tar.gz
sin: lower precision for sign determination
sqr: use internal MPFR_SIGN macro instead of mpfr_signbit git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@247 211d60ee-9f03-0410-a15a-8952a2c7a4e4
Diffstat (limited to 'src/sqr.c')
-rw-r--r--src/sqr.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/src/sqr.c b/src/sqr.c
index f66d2df..c94f77a 100644
--- a/src/sqr.c
+++ b/src/sqr.c
@@ -39,13 +39,6 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
mp_prec_t prec;
int inex_re, inex_im, inexact;
- /* sign of RE(op)*IM(op) */
- int sign = 1;
- if (mpfr_signbit (MPC_RE (op)))
- sign = -sign;
- if (mpfr_signbit (MPC_IM (op)))
- sign = -sign;
-
/* special values: NaN and infinities */
if (!mpfr_number_p (MPC_RE (op)) || !mpfr_number_p (MPC_IM (op))) {
if (mpfr_nan_p (MPC_RE (op)) || mpfr_nan_p (MPC_IM (op))) {
@@ -55,14 +48,16 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
else if (mpfr_inf_p (MPC_RE (op))) {
if (mpfr_inf_p (MPC_IM (op))) {
mpfr_set_nan (MPC_RE (rop));
- mpfr_set_inf (MPC_IM (rop), sign);
+ mpfr_set_inf (MPC_IM (rop),
+ MPFR_SIGN (MPC_RE (op)) * MPFR_SIGN (MPC_IM (op)));
}
else {
mpfr_set_inf (MPC_RE (rop), +1);
if (mpfr_zero_p (MPC_IM (op)))
mpfr_set_nan (MPC_IM (rop));
else
- mpfr_set_inf (MPC_IM (rop), sign);
+ mpfr_set_inf (MPC_IM (rop),
+ MPFR_SIGN (MPC_RE (op)) * MPFR_SIGN (MPC_IM (op)));
}
}
else /* IM(op) is infinity, RE(op) is not */ {
@@ -70,7 +65,8 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
if (mpfr_zero_p (MPC_RE (op)))
mpfr_set_nan (MPC_IM (rop));
else
- mpfr_set_inf (MPC_IM (rop), sign);
+ mpfr_set_inf (MPC_IM (rop),
+ MPFR_SIGN (MPC_RE (op)) * MPFR_SIGN (MPC_IM (op)));
}
return MPC_INEX (0, 0); /* exact */
}
@@ -82,7 +78,7 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
{
inex_re = mpfr_sqr (MPC_RE(rop), MPC_RE(op), MPC_RND_RE(rnd));
inex_im = mpfr_set_ui (MPC_IM(rop), 0ul, GMP_RNDN);
- if (sign < 0)
+ if (MPFR_SIGN (MPC_RE (op)) * MPFR_SIGN (MPC_IM (op)) < 0)
MPFR_CHANGE_SIGN (MPC_IM (rop));
return MPC_INEX(inex_re, inex_im);
}
@@ -91,7 +87,7 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
inex_re = -mpfr_sqr (MPC_RE(rop), MPC_IM(op), INV_RND (MPC_RND_RE(rnd)));
mpfr_neg (MPC_RE(rop), MPC_RE(rop), GMP_RNDN);
inex_im = mpfr_set_ui (MPC_IM(rop), 0ul, GMP_RNDN);
- if (sign < 0)
+ if (MPFR_SIGN (MPC_RE (op)) * MPFR_SIGN (MPC_IM (op)) < 0)
MPFR_CHANGE_SIGN (MPC_IM (rop));
return MPC_INEX(inex_re, inex_im);
}