diff options
author | zimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2009-10-01 06:54:30 +0000 |
---|---|---|
committer | zimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2009-10-01 06:54:30 +0000 |
commit | 29754b106f78f82bc04117541cd3dba03d288878 (patch) | |
tree | 836a9b748d742da9452ff385dab5e4f0709f8e14 /src/sqr.c | |
parent | a4ae4972059da7895ff7d2a101c81916f6a4b162 (diff) | |
download | mpc-29754b106f78f82bc04117541cd3dba03d288878.tar.gz |
[tlog.c] disabled test for exp(log(z)) = z, since it gives false positives
[sqr.c] fixed infinite loop with large exponents
[tsqr.c] added new test
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@690 211d60ee-9f03-0410-a15a-8952a2c7a4e4
Diffstat (limited to 'src/sqr.c')
-rw-r--r-- | src/sqr.c | 8 |
1 files changed, 8 insertions, 0 deletions
@@ -31,6 +31,7 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) needed in the case rop==op */ mp_prec_t prec; int inex_re, inex_im, inexact; + mp_exp_t emax; /* special values: NaN and infinities */ if (!mpfr_number_p (MPC_RE (op)) || !mpfr_number_p (MPC_IM (op))) { @@ -119,6 +120,10 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) else x [0] = op->re [0]; + /* store the maximal exponent */ + emax = mpfr_get_emax (); + mpfr_set_emax (mpfr_get_emax_max ()); + do { prec += mpc_ceil_log2 (prec) + 5; @@ -193,5 +198,8 @@ mpc_sqr (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) if (rop == op) mpfr_clear (x); + /* restore the exponent range */ + mpfr_set_emax (emax); + return MPC_INEX (inex_re, inex_im); } |