summaryrefslogtreecommitdiff
path: root/const_pi.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2003-10-14 11:49:06 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2003-10-14 11:49:06 +0000
commit1fa2277c10582baa8b8402b8cf1702116ccbc560 (patch)
tree672209195ecad922dc489260098588b4dca469ad /const_pi.c
parent51aef80e83eaf2fc76dd6be59c0549e890dccd2b (diff)
downloadmpfr-1fa2277c10582baa8b8402b8cf1702116ccbc560.tar.gz
replaced mpfr_can_round (approx, err, rnd1, GMP_RNDN, prec)
by mpfr_can_round (approx, err, rnd1, GMP_RNDZ, prec + 1) which in addition guarantees a correct inexact flag git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@2492 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'const_pi.c')
-rw-r--r--const_pi.c35
1 files changed, 20 insertions, 15 deletions
diff --git a/const_pi.c b/const_pi.c
index 62d5d72c8..e97bc02f6 100644
--- a/const_pi.c
+++ b/const_pi.c
@@ -51,6 +51,7 @@ mpfr_pi_machin3 (mpfr_ptr mylog, mp_rnd_t rnd_mode)
int good = 0;
mpfr_t tmp1, tmp2, result,tmp3,tmp4,tmp5,tmp6;
mpz_t cst;
+ int inex;
MPFR_CLEAR_FLAGS(mylog);
logn = __gmpfr_ceil_log2 ((double) MPFR_PREC(mylog));
@@ -105,20 +106,20 @@ mpfr_pi_machin3 (mpfr_ptr mylog, mp_rnd_t rnd_mode)
mpfr_clear(tmp4);
mpfr_clear(tmp5);
mpfr_clear(tmp6);
- if (mpfr_can_round(result, prec_x - 5, GMP_RNDD, rnd_mode, prec_i_want))
+ if (mpfr_can_round (result, prec_x - 5, GMP_RNDD, GMP_RNDZ,
+ prec_i_want + (rnd_mode == GMP_RNDN)))
{
- mpfr_set(mylog, result, rnd_mode);
- mpfr_clear(result);
+ inex = mpfr_set (mylog, result, rnd_mode);
good = 1;
}
else
{
- mpfr_clear(result);
prec_x += logn;
}
+ mpfr_clear (result);
}
- mpz_clear(cst);
- return 0;
+ mpz_clear (cst);
+ return inex;
}
/*
@@ -161,6 +162,7 @@ mpfr_const_pi (mpfr_ptr x, mp_rnd_t rnd_mode)
int N, oldN, n, prec;
mpz_t pi, num, den, d3, d2, tmp;
mpfr_t y;
+ int inex;
prec=MPFR_PREC(x);
@@ -168,9 +170,10 @@ mpfr_const_pi (mpfr_ptr x, mp_rnd_t rnd_mode)
if ((prec==__gmpfr_const_pi_prec && rnd_mode==__mpfr_const_pi_rnd) ||
(prec<=__gmpfr_const_pi_prec &&
mpfr_can_round(__mpfr_const_pi, __gmpfr_const_pi_prec,
- __mpfr_const_pi_rnd, rnd_mode, prec)))
+ __mpfr_const_pi_rnd, GMP_RNDZ,
+ prec + (rnd_mode == GMP_RNDN))))
{
- return mpfr_set(x, __mpfr_const_pi, rnd_mode);
+ return mpfr_set (x, __mpfr_const_pi, rnd_mode);
}
if (prec < 20000)
@@ -215,11 +218,11 @@ mpfr_const_pi (mpfr_ptr x, mp_rnd_t rnd_mode)
mpz_fdiv_q(tmp, tmp, den);
mpz_add(pi, pi, tmp);
}
- mpfr_set_z(x, pi, rnd_mode);
- mpfr_init2(y, mpfr_get_prec(x));
- mpz_add_ui(pi, pi, N+1);
- mpfr_set_z(y, pi, rnd_mode);
- if (mpfr_cmp(x, y) != 0)
+ mpfr_set_z (x, pi, rnd_mode);
+ mpfr_init2 (y, mpfr_get_prec(x));
+ mpz_add_ui (pi, pi, N+1);
+ mpfr_set_z (y, pi, rnd_mode);
+ if (mpfr_cmp (x, y) != 0)
{
fprintf(stderr, "does not converge\n");
exit(1);
@@ -234,7 +237,8 @@ mpfr_const_pi (mpfr_ptr x, mp_rnd_t rnd_mode)
mpfr_clear(y);
}
else
- mpfr_pi_machin3(x, rnd_mode);
+ inex = mpfr_pi_machin3 (x, rnd_mode);
+
/* store computed value */
if (__gmpfr_const_pi_prec==0)
mpfr_init2(__mpfr_const_pi, prec);
@@ -243,5 +247,6 @@ mpfr_const_pi (mpfr_ptr x, mp_rnd_t rnd_mode)
mpfr_set(__mpfr_const_pi, x, rnd_mode);
__gmpfr_const_pi_prec=prec;
__mpfr_const_pi_rnd=rnd_mode;
- return 1;
+
+ return inex;
}