summaryrefslogtreecommitdiff
path: root/src/sin_cos.c
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2017-07-17 23:10:45 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2017-07-17 23:10:45 +0000
commit79f4bdd5caa21c72ec6deb51c2caec68974d8d8d (patch)
treeeacec33037c85146152aa3d02e1c996bc941a224 /src/sin_cos.c
parent1a8f3c35c4f7e42d93239b3e1cab0893572ac9ac (diff)
downloadmpfr-79f4bdd5caa21c72ec6deb51c2caec68974d8d8d.tar.gz
[src/sin_cos.c] Avoid integer overflows with precision 1100000 and
the 32-bit ABI (32-bit long), fixing bug reported by Simon Byrne: https://sympa.inria.fr/sympa/arc/mpfr/2017-07/msg00002.html git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@11590 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'src/sin_cos.c')
-rw-r--r--src/sin_cos.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/sin_cos.c b/src/sin_cos.c
index 336e8216e..d2fd71e0d 100644
--- a/src/sin_cos.c
+++ b/src/sin_cos.c
@@ -354,10 +354,12 @@ sin_bs_aux (mpz_t Q0, mpz_t S0, mpz_t C0, mpz_srcptr p, mpfr_prec_t r,
which reduces to T[k] = (2*i+2)*(2*i+3)*2^r-pp,
Q[k] = (2*i)*(2*i+1)*(2*i+2)*(2*i+3). */
log2_nb_terms[k] = 1;
- mpz_set_ui (Q[k], (2 * i + 2) * (2 * i + 3));
+ mpz_set_ui (Q[k], 2 * i + 2);
+ mpz_mul_ui (Q[k], Q[k], 2 * i + 3);
mpz_mul_2exp (T[k], Q[k], r);
mpz_sub (T[k], T[k], pp);
- mpz_mul_ui (Q[k], Q[k], (2 * i) * (2 * i + 1));
+ mpz_mul_ui (Q[k], Q[k], 2 * i);
+ mpz_mul_ui (Q[k], Q[k], 2 * i + 1);
/* the next term of the series is divided by Q[k] and multiplied
by pp^2/2^(2r), thus the mult. factor < 1/2^mult[k] */
MPFR_MPZ_SIZEINBASE2(mult[k], Q[k]);