summaryrefslogtreecommitdiff
path: root/src/sqr.c
diff options
context:
space:
mode:
authorenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2010-09-16 19:33:31 +0000
committerenge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2010-09-16 19:33:31 +0000
commit5dd71beaeabff358025a9c659bf2d875dd4921a9 (patch)
tree723310120f80d5c86e043f78ea45961e9181faac /src/sqr.c
parent8a1058609d66b3b7953546364c91c2985881f5a3 (diff)
downloadmpc-5dd71beaeabff358025a9c659bf2d875dd4921a9.tar.gz
sqr.c: bug fix: when an under- or overflow occurred during Karatsuba squaring,
the real part of the result was not necessarily set git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@836 211d60ee-9f03-0410-a15a-8952a2c7a4e4
Diffstat (limited to 'src/sqr.c')
-rw-r--r--src/sqr.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/sqr.c b/src/sqr.c
index 2dc8f68..41e1e6c 100644
--- a/src/sqr.c
+++ b/src/sqr.c
@@ -154,7 +154,6 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
mpfr_add_one_ulp (v, GMP_RNDN);
inexact = 1;
}
-
/* compute the real part as u*v, rounded away */
/* determine also the sign of inex_re */
if (mpfr_sgn (u) == 0 || mpfr_sgn (v) == 0)
@@ -179,8 +178,10 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
mpfr_set_ui_2exp (MPC_RE (rop), 1, emax, rnd_re);
inex_re = -1;
}
- else /* round up or away from zero */
+ else /* round up or away from zero */ {
+ mpfr_set_inf (MPC_RE (rop), 1);
inex_re = 1;
+ }
break;
}
ok = (!inexact) | mpfr_can_round (u, prec - 3, GMP_RNDU, GMP_RNDZ,
@@ -210,8 +211,10 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd)
mpfr_set_ui (MPC_RE (rop), 0, rnd_re);
inex_re = 1;
}
- else /* round down or away from zero */
+ else /* round down or away from zero */ {
+ mpfr_set (MPC_RE (rop), u, rnd_re);
inex_re = -1;
+ }
break;
}
ok = (!inexact) | mpfr_can_round (u, prec - 3, GMP_RNDD, GMP_RNDZ,