summaryrefslogtreecommitdiff
path: root/src/sqr.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2009-10-01 06:54:30 +0000
committerzimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2009-10-01 06:54:30 +0000
commit29754b106f78f82bc04117541cd3dba03d288878 (patch)
tree836a9b748d742da9452ff385dab5e4f0709f8e14 /src/sqr.c
parenta4ae4972059da7895ff7d2a101c81916f6a4b162 (diff)
downloadmpc-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.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/sqr.c b/src/sqr.c
index 29f91d8..f78cd4b 100644
--- a/src/sqr.c
+++ b/src/sqr.c
@@ -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);
}