diff options
author | enge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2010-09-16 19:33:31 +0000 |
---|---|---|
committer | enge <enge@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2010-09-16 19:33:31 +0000 |
commit | 5dd71beaeabff358025a9c659bf2d875dd4921a9 (patch) | |
tree | 723310120f80d5c86e043f78ea45961e9181faac /src/sqr.c | |
parent | 8a1058609d66b3b7953546364c91c2985881f5a3 (diff) | |
download | mpc-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.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -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, |