From aeb0d53641d56926616f5bee59abf7337e44bddf Mon Sep 17 00:00:00 2001 From: enge Date: Wed, 7 Mar 2012 10:15:17 +0000 Subject: sqr.c: small changes to drop goto git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@1141 211d60ee-9f03-0410-a15a-8952a2c7a4e4 --- src/sqr.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/sqr.c b/src/sqr.c index 5b4b182..f71a6ad 100644 --- a/src/sqr.c +++ b/src/sqr.c @@ -287,25 +287,29 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) and we round up, an overflow will give +Inf, but an underflow will give 0.5*2^emin */ if (mpfr_get_exp (u) == emin) /* underflow */ - { + { inex_re = mpfr_fsss (rop->re, x, op->im, MPC_RND_RE (rnd)); - goto end_of_real_part; - } + ok = 1; + } else if (mpfr_inf_p (u)) - { + { /* let mpc_realref(rop) be a "correctly rounded overflow" */ - inex_re = mpfr_set_ui_2exp (mpc_realref (rop), 1, emax, MPC_RND_RE (rnd)); - break; - } - ok = (!inexact) | mpfr_can_round (u, prec - 3, GMP_RNDU, GMP_RNDZ, - MPC_PREC_RE (rop) + (MPC_RND_RE (rnd) == GMP_RNDN)); - if (ok) + inex_re = mpfr_set_ui_2exp (mpc_realref (rop), 1, emax, + MPC_RND_RE (rnd)); + ok = 1; + } + else { + ok = (!inexact) | mpfr_can_round (u, prec - 3, + GMP_RNDU, GMP_RNDZ, + MPC_PREC_RE (rop) + (MPC_RND_RE (rnd) == GMP_RNDN)); + if (ok) { - inex_re = mpfr_set (mpc_realref (rop), u, MPC_RND_RE (rnd)); - if (inex_re == 0) - /* remember that u was already rounded */ - inex_re = inexact; + inex_re = mpfr_set (mpc_realref (rop), u, MPC_RND_RE (rnd)); + if (inex_re == 0) + /* remember that u was already rounded */ + inex_re = inexact; } + } } else { @@ -351,7 +355,6 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) } while (!ok); - end_of_real_part: mpfr_clear (u); mpfr_clear (v); } -- cgit v1.2.1