1 /* mpfr_atan -- arc-tangent of a floating-point number
2
3 Copyright 2001-2023 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramba projects, INRIA.
5
6 This file is part of the GNU MPFR Library.
7
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22
23 #define MPFR_NEED_LONGLONG_H
24 #include "mpfr-impl.h"
25
26 #if GMP_NUMB_BITS == 64
27 /* for each pair (r,p), we store a 192-bit approximation of atan(x)/x for
28 x=p/2^r, with lowest limb first.
29 Sage code:
30 for p in range(1,2^ceil(r/2)):
31 x=p/2^r
32 l=floor(2^192*n(atan(x)/x, 300)).digits(2^64)
33 print ("{0x%x, 0x%x, 0x%x}, /"+"* (%d,%d) *"+"/") % (l[0],l[1],l[2],r,p)
34 */
35 static const mp_limb_t atan_table[][3] = {
36 {0x6e141587261cdf00, 0x6fe445ecbc3a8d03, 0xed63382b0dda7b45}, /* (1,1) */
37 {0xaa7fa90388b3836b, 0x6dc79ef5f7a217e5, 0xfadbafc96406eb15}, /* (2,1) */
38 {0x319c12cf59d4b2dc, 0xcb2792dc0e2e0d51, 0xffaaddb967ef4e36}, /* (4,1) */
39 {0x8b3957d95d9ad922, 0xc897989f3e888ef7, 0xfeadd4d5617b6e32}, /* (4,2) */
40 {0xc4e6abc8af62e439, 0x4eb9bf602625f0b4, 0xfd0fcdd343cac19b}, /* (4,3) */
41 {0x7c18baeb9bc95789, 0xb12afb6b6d4f7e16, 0xffffaaaaddddb94b}, /* (8,1) */
42 {0x6856a0171a2f001a, 0x62351fbbe60af47, 0xfffeaaadddd4b968}, /* (8,2) */
43 {0x69164c094f49da06, 0xd517294f7373d07a, 0xfffd001032cb1179}, /* (8,3) */
44 {0x20ef65c10deef460, 0xe78c564015f76048, 0xfffaaadddb94d5bb}, /* (8,4) */
45 {0x3ce233aa002f0344, 0x9dd8ea342a65d4cc, 0xfff7ab27a1f32f95}, /* (8,5) */
46 {0xa37f403c7279c5cb, 0x13ab53a1c8db8497, 0xfff40103192ce74d}, /* (8,6) */
47 {0xe5a85657103c1aa8, 0xb8409e6c914191d3, 0xffefac8a9c40a26b}, /* (8,7) */
48 {0x806d0294c0db8816, 0x779d776dda8c6213, 0xffeaaddd4bb12542}, /* (8,8) */
49 {0x5545d1914ef21478, 0x3aea58d6660f5a12, 0xffe5051f0aebf73a}, /* (8,9) */
50 {0x6e47a91d015f4133, 0xc085ab6b490b7f02, 0xffdeb2787d4adac1}, /* (8,10) */
51 {0x4efc1f931f7ec9b3, 0xb7f43cd16195ef4b, 0xffd7b61702b09aad}, /* (8,11) */
52 {0xd27d1dbf55fed60d, 0xd812c11d7d473e5e, 0xffd0102cb3c1bfbe}, /* (8,12) */
53 {0xca629e927383fe97, 0x8c61aedf58e42206, 0xffc7c0f05db9d1b6}, /* (8,13) */
54 {0x4eff0b53d4e905b7, 0x28ac1e800ca31e9d, 0xffbec89d7dddd7e9}, /* (8,14) */
55 {0xb0a7931deec6fe60, 0xb46feea78588554b, 0xffb527743c8cdd8f} /* (8,15) */
56 };
57
58 static void
set_table(mpfr_ptr y,const mp_limb_t x[3])59 set_table (mpfr_ptr y, const mp_limb_t x[3])
60 {
61 mpfr_prec_t p = MPFR_PREC(y);
62 mp_size_t n = MPFR_PREC2LIMBS(p);
63 mpfr_prec_t sh;
64 mp_limb_t *yp = MPFR_MANT(y);
65
66 MPFR_UNSIGNED_MINUS_MODULO (sh, p);
67 MPFR_ASSERTD (n >= 1 && n <= 3);
68 mpn_copyi (yp, x + 3 - n, n);
69 yp[0] &= ~MPFR_LIMB_MASK(sh);
70 MPFR_SET_EXP(y, 0);
71 }
72 #endif
73
74 /* If x = p/2^r, put in y an approximation to atan(x)/x using 2^m terms
75 for the series expansion, with an error of at most 1 ulp.
76 Assumes 0 < x < 1, thus 1 <= p < 2^r.
77 More precisely, p consists of the floor(r/2) bits of the binary expansion
78 of a number 0 < s < 1:
79 * the bit of weight 2^-1 is for r=1, thus p <= 1
80 * the bit of weight 2^-2 is for r=2, thus p <= 1
81 * the two bits of weight 2^-3 and 2^-4 are for r=4, thus p <= 3
82 * more generally p < 2^(r/2).
83
84 If X=x^2, we want 1 - X/3 + X^2/5 - ... + (-1)^k*X^k/(2k+1) + ...
85
86 When we sum terms up to x^k/(2k+1), the denominator Q[0] is
87 3*5*7*...*(2k+1) ~ (2k/e)^k.
88
89 The tab[] array should have at least 3*(m+1) entries.
90 */
91 static void
mpfr_atan_aux(mpfr_ptr y,mpz_ptr p,unsigned long r,int m,mpz_t * tab)92 mpfr_atan_aux (mpfr_ptr y, mpz_ptr p, unsigned long r, int m, mpz_t *tab)
93 {
94 mpz_t *S, *Q, *ptoj;
95 mp_bitcnt_t n, h, j; /* unsigned type, which is >= unsigned long */
96 mpfr_exp_t diff, expo;
97 int im, i, k, l, done;
98 mpfr_prec_t mult;
99 mpfr_prec_t accu[MPFR_PREC_BITS], log2_nb_terms[MPFR_PREC_BITS];
100 mpfr_prec_t precy = MPFR_PREC(y);
101
102 MPFR_ASSERTD (mpz_sgn (p) > 0);
103 MPFR_ASSERTD (m > 0);
104 MPFR_ASSERTD (m <= MPFR_PREC_BITS - 1);
105
106 #if GMP_NUMB_BITS == 64
107 /* tabulate values for small precision and small value of r (which are the
108 most expensive to compute) */
109 if (precy <= 192)
110 {
111 unsigned long u;
112
113 switch (r)
114 {
115 case 1:
116 /* p has 1 bit: necessarily p=1 */
117 MPFR_ASSERTD(mpz_cmp_ui (p, 1) == 0);
118 set_table (y, atan_table[0]);
119 return;
120 case 2:
121 /* p has 1 bit: necessarily p=1 too */
122 MPFR_ASSERTD(mpz_cmp_ui (p, 1) == 0);
123 set_table (y, atan_table[1]);
124 return;
125 case 4:
126 /* p has at most 2 bits: 1 <= p <= 3 */
127 u = mpz_get_ui (p);
128 MPFR_ASSERTD(1 <= u && u <= 3);
129 set_table (y, atan_table[1 + u]);
130 return;
131 case 8:
132 /* p has at most 4 bits: 1 <= p <= 15 */
133 u = mpz_get_ui (p);
134 MPFR_ASSERTD(1 <= u && u <= 15);
135 set_table (y, atan_table[4 + u]);
136 return;
137 }
138 }
139 #endif
140
141 /* Set Tables */
142 S = tab; /* S */
143 ptoj = S + 1*(m+1); /* p^2^j Precomputed table */
144 Q = S + 2*(m+1); /* Product of Odd integer table */
145
146 /* From p to p^2, and r to 2r */
147 mpz_mul (p, p, p);
148 MPFR_ASSERTD (2 * r > r);
149 r = 2 * r;
150
151 /* Normalize p */
152 n = mpz_scan1 (p, 0);
153 if (n > 0)
154 {
155 mpz_tdiv_q_2exp (p, p, n); /* exact */
156 MPFR_ASSERTD (r > n);
157 r -= n;
158 }
159
160 /* Since |p/2^r| < 1, and p is a non-zero integer, necessarily r > 0. */
161 MPFR_ASSERTD (mpz_sgn (p) > 0);
162 MPFR_ASSERTD (m > 0);
163 MPFR_ASSERTD (r > 0);
164
165 /* check if p=1 (special case) */
166 l = 0;
167 /*
168 We compute by binary splitting, with X = x^2 = p/2^r:
169 P(a,b) = p if a+1=b, P(a,c)*P(c,b) otherwise
170 Q(a,b) = (2a+1)*2^r if a+1=b [except Q(0,1)=1], Q(a,c)*Q(c,b) otherwise
171 S(a,b) = p*(2a+1) if a+1=b, Q(c,b)*S(a,c)+Q(a,c)*P(a,c)*S(c,b) otherwise
172 Then atan(x)/x ~ S(0,i)/Q(0,i) for i so that (p/2^r)^i/i is small enough.
173 The factor 2^(r*(b-a)) in Q(a,b) is implicit, thus we have to take it
174 into account when we compute with Q.
175 */
176 accu[0] = 0; /* accu[k] = Mult[0] + ... + Mult[k], where Mult[j] is the
177 number of bits of the corresponding term S[j]/Q[j] */
178 if (mpz_cmp_ui (p, 1) != 0)
179 {
180 /* p <> 1: precompute ptoj table */
181 mpz_set (ptoj[0], p);
182 for (im = 1 ; im <= m ; im ++)
183 mpz_mul (ptoj[im], ptoj[im - 1], ptoj[im - 1]);
184 /* main loop */
185 n = 1UL << m;
186 MPFR_ASSERTN (n != 0); /* no overflow */
187 /* the i-th term being X^i/(2i+1) with X=p/2^r, we can stop when
188 p^i/2^(r*i) < 2^(-precy), i.e. r*i > precy + log2(p^i) */
189 for (i = k = done = 0; (i < n) && (done == 0); i += 2, k ++)
190 {
191 /* initialize both S[k],Q[k] and S[k+1],Q[k+1] */
192 mpz_set_ui (Q[k+1], 2 * i + 3); /* Q(i+1,i+2) */
193 mpz_mul_ui (S[k+1], p, 2 * i + 1); /* S(i+1,i+2) */
194 mpz_mul_2exp (S[k], Q[k+1], r);
195 mpz_sub (S[k], S[k], S[k+1]); /* S(i,i+2) */
196 mpz_mul_ui (Q[k], Q[k+1], 2 * i + 1); /* Q(i,i+2) */
197 log2_nb_terms[k] = 1; /* S[k]/Q[k] corresponds to 2 terms */
198 for (j = (i + 2) >> 1, l = 1; (j & 1) == 0; l ++, j >>= 1, k --)
199 {
200 /* invariant: S[k-1]/Q[k-1] and S[k]/Q[k] correspond
201 to 2^l terms each. We combine them into S[k-1]/Q[k-1] */
202 MPFR_ASSERTD (k > 0);
203 mpz_mul (S[k], S[k], Q[k-1]);
204 mpz_mul (S[k], S[k], ptoj[l]);
205 mpz_mul (S[k-1], S[k-1], Q[k]);
206 mpz_mul_2exp (S[k-1], S[k-1], r << l);
207 mpz_add (S[k-1], S[k-1], S[k]);
208 mpz_mul (Q[k-1], Q[k-1], Q[k]);
209 log2_nb_terms[k-1] = l + 1;
210 /* now S[k-1]/Q[k-1] corresponds to 2^(l+1) terms */
211 MPFR_MPZ_SIZEINBASE2(mult, ptoj[l+1]);
212 mult = (r << (l + 1)) - mult - 1;
213 accu[k-1] = (k == 1) ? mult : accu[k-2] + mult;
214 if (accu[k-1] > precy)
215 done = 1;
216 }
217 }
218 }
219 else /* special case p=1: the i-th term being X^i/(2i+1) with X=1/2^r,
220 we can stop when r*i > precy i.e. i > precy/r */
221 {
222 n = 1UL << m;
223 if (precy / r <= n)
224 n = (precy / r) + 1;
225 MPFR_ASSERTN (n != 0); /* no overflow */
226 for (i = k = 0; i < n; i += 2, k ++)
227 {
228 mpz_set_ui (Q[k + 1], 2 * i + 3);
229 mpz_mul_2exp (S[k], Q[k+1], r);
230 mpz_sub_ui (S[k], S[k], 1 + 2 * i);
231 mpz_mul_ui (Q[k], Q[k + 1], 1 + 2 * i);
232 log2_nb_terms[k] = 1; /* S[k]/Q[k] corresponds to 2 terms */
233 for (j = (i + 2) >> 1, l = 1; (j & 1) == 0; l++, j >>= 1, k --)
234 {
235 MPFR_ASSERTD (k > 0);
236 mpz_mul (S[k], S[k], Q[k-1]);
237 mpz_mul (S[k-1], S[k-1], Q[k]);
238 mpz_mul_2exp (S[k-1], S[k-1], r << l);
239 mpz_add (S[k-1], S[k-1], S[k]);
240 mpz_mul (Q[k-1], Q[k-1], Q[k]);
241 log2_nb_terms[k-1] = l + 1;
242 }
243 }
244 }
245
246 /* we need to combine S[0]/Q[0]...S[k-1]/Q[k-1] */
247 h = 0; /* number of terms accumulated in S[k]/Q[k] */
248 while (k > 1)
249 {
250 k --;
251 /* combine S[k-1]/Q[k-1] and S[k]/Q[k] */
252 mpz_mul (S[k], S[k], Q[k-1]);
253 if (mpz_cmp_ui (p, 1) != 0)
254 mpz_mul (S[k], S[k], ptoj[log2_nb_terms[k-1]]);
255 mpz_mul (S[k-1], S[k-1], Q[k]);
256 h += (mp_bitcnt_t) 1 << log2_nb_terms[k];
257 mpz_mul_2exp (S[k-1], S[k-1], r * h);
258 mpz_add (S[k-1], S[k-1], S[k]);
259 mpz_mul (Q[k-1], Q[k-1], Q[k]);
260 }
261
262 MPFR_MPZ_SIZEINBASE2 (diff, S[0]);
263 diff -= 2 * precy;
264 expo = diff;
265 if (diff >= 0)
266 mpz_tdiv_q_2exp (S[0], S[0], diff);
267 else
268 mpz_mul_2exp (S[0], S[0], -diff);
269
270 MPFR_MPZ_SIZEINBASE2 (diff, Q[0]);
271 diff -= precy;
272 expo -= diff;
273 if (diff >= 0)
274 mpz_tdiv_q_2exp (Q[0], Q[0], diff);
275 else
276 mpz_mul_2exp (Q[0], Q[0], -diff);
277
278 mpz_tdiv_q (S[0], S[0], Q[0]);
279 mpfr_set_z (y, S[0], MPFR_RNDD);
280 /* TODO: Check/prove that the following expression doesn't overflow. */
281 expo = MPFR_GET_EXP (y) + expo - r * (i - 1);
282 MPFR_SET_EXP (y, expo);
283 }
284
285 int
mpfr_atan(mpfr_ptr atan,mpfr_srcptr x,mpfr_rnd_t rnd_mode)286 mpfr_atan (mpfr_ptr atan, mpfr_srcptr x, mpfr_rnd_t rnd_mode)
287 {
288 mpfr_t xp, arctgt, sk, tmp, tmp2;
289 mpz_t ukz;
290 mpz_t tabz[3*(MPFR_PREC_BITS+1)];
291 mpfr_exp_t exptol;
292 mpfr_prec_t prec, realprec, est_lost, lost;
293 unsigned long twopoweri, log2p, red;
294 int comparison, inexact;
295 int i, n0, oldn0;
296 MPFR_GROUP_DECL (group);
297 MPFR_SAVE_EXPO_DECL (expo);
298 MPFR_ZIV_DECL (loop);
299
300 MPFR_LOG_FUNC
301 (("x[%Pd]=%.*Rg rnd=%d", mpfr_get_prec (x), mpfr_log_prec, x, rnd_mode),
302 ("atan[%Pd]=%.*Rg inexact=%d",
303 mpfr_get_prec (atan), mpfr_log_prec, atan, inexact));
304
305 /* Singular cases */
306 if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (x)))
307 {
308 if (MPFR_IS_NAN (x))
309 {
310 MPFR_SET_NAN (atan);
311 MPFR_RET_NAN;
312 }
313 else if (MPFR_IS_INF (x))
314 {
315 MPFR_SAVE_EXPO_MARK (expo);
316 if (MPFR_IS_POS (x)) /* arctan(+inf) = Pi/2 */
317 inexact = mpfr_const_pi (atan, rnd_mode);
318 else /* arctan(-inf) = -Pi/2 */
319 {
320 inexact = -mpfr_const_pi (atan,
321 MPFR_INVERT_RND (rnd_mode));
322 MPFR_CHANGE_SIGN (atan);
323 }
324 mpfr_div_2ui (atan, atan, 1, rnd_mode); /* exact (no exceptions) */
325 MPFR_SAVE_EXPO_FREE (expo);
326 return mpfr_check_range (atan, inexact, rnd_mode);
327 }
328 else /* x is necessarily 0 */
329 {
330 MPFR_ASSERTD (MPFR_IS_ZERO (x));
331 MPFR_SET_ZERO (atan);
332 MPFR_SET_SAME_SIGN (atan, x);
333 MPFR_RET (0);
334 }
335 }
336
337 /* atan(x) = x - x^3/3 + x^5/5...
338 so the error is < 2^(3*EXP(x)-1)
339 so `EXP(x)-(3*EXP(x)-1)` = -2*EXP(x)+1 */
340 MPFR_FAST_COMPUTE_IF_SMALL_INPUT (atan, x, -2 * MPFR_GET_EXP (x), 1, 0,
341 rnd_mode, {});
342
343 /* Set x_p=|x| */
344 MPFR_TMP_INIT_ABS (xp, x);
345
346 MPFR_SAVE_EXPO_MARK (expo);
347
348 /* Other simple case arctan(-+1)=-+pi/4 */
349 comparison = mpfr_cmp_ui (xp, 1);
350 if (MPFR_UNLIKELY (comparison == 0))
351 {
352 int neg = MPFR_IS_NEG (x);
353 inexact = mpfr_const_pi (atan, MPFR_IS_POS (x) ? rnd_mode
354 : MPFR_INVERT_RND (rnd_mode));
355 if (neg)
356 {
357 inexact = -inexact;
358 MPFR_CHANGE_SIGN (atan);
359 }
360 mpfr_div_2ui (atan, atan, 2, rnd_mode); /* exact (no exceptions) */
361 MPFR_SAVE_EXPO_FREE (expo);
362 return mpfr_check_range (atan, inexact, rnd_mode);
363 }
364
365 realprec = MPFR_PREC (atan) + MPFR_INT_CEIL_LOG2 (MPFR_PREC (atan)) + 4;
366 prec = realprec + GMP_NUMB_BITS;
367
368 /* Initialisation */
369 mpz_init2 (ukz, prec); /* ukz will need 'prec' bits below */
370 MPFR_GROUP_INIT_4 (group, prec, sk, tmp, tmp2, arctgt);
371 oldn0 = 0;
372
373 MPFR_ZIV_INIT (loop, prec);
374 for (;;)
375 {
376 /* First, if |x| < 1, we need to have more prec to be able to round (sup)
377 n0 = ceil(log(prec_requested + 2 + 1+ln(2.4)/ln(2))/log(2)) */
378 mpfr_prec_t sup;
379 sup = MPFR_GET_EXP (xp) < 0 ? 2 - MPFR_GET_EXP (xp) : 1; /* sup >= 1 */
380
381 n0 = MPFR_INT_CEIL_LOG2 ((realprec + sup) + 3);
382 /* since realprec >= 4, n0 >= ceil(log2(8)) >= 3, thus 3*n0 > 2 */
383 prec = (realprec + sup) + 1 + MPFR_INT_CEIL_LOG2 (3*n0-2);
384
385 /* the number of lost bits due to argument reduction is
386 9 - 2 * EXP(sk), which we estimate by 9 + 2*ceil(log2(p))
387 since we manage that sk < 1/p */
388 if (MPFR_PREC (atan) > 100)
389 {
390 log2p = MPFR_INT_CEIL_LOG2(prec) / 2 - 3;
391 est_lost = 9 + 2 * log2p;
392 prec += est_lost;
393 }
394 else
395 log2p = est_lost = 0; /* don't reduce the argument */
396
397 /* Initialisation */
398 MPFR_GROUP_REPREC_4 (group, prec, sk, tmp, tmp2, arctgt);
399 MPFR_ASSERTD (n0 <= MPFR_PREC_BITS);
400 /* Note: the tabz[] entries are used to get a rational approximation
401 of atan(x) to precision 'prec', thus allocating them to 'prec' bits
402 should be good enough. */
403 for (i = oldn0; i < 3 * (n0 + 1); i++)
404 mpz_init2 (tabz[i], prec);
405 oldn0 = 3 * (n0 + 1);
406
407 /* The mpfr_ui_div below mustn't underflow. This is guaranteed by
408 MPFR_SAVE_EXPO_MARK, but let's check that for maintainability. */
409 MPFR_ASSERTD (__gmpfr_emax <= 1 - __gmpfr_emin);
410
411 if (comparison > 0) /* use atan(xp) = Pi/2 - atan(1/xp) */
412 mpfr_ui_div (sk, 1, xp, MPFR_RNDN);
413 else
414 mpfr_set (sk, xp, MPFR_RNDN);
415
416 /* now 0 < sk <= 1 */
417
418 /* Argument reduction: atan(x) = 2 atan((sqrt(1+x^2)-1)/x).
419 We want |sk| < k/sqrt(p) where p is the target precision. */
420 lost = 0;
421 for (red = 0; MPFR_GET_EXP(sk) > - (mpfr_exp_t) log2p; red ++)
422 {
423 lost = 9 - 2 * MPFR_EXP(sk);
424 mpfr_sqr (tmp, sk, MPFR_RNDN);
425 mpfr_add_ui (tmp, tmp, 1, MPFR_RNDN);
426 mpfr_sqrt (tmp, tmp, MPFR_RNDN);
427 mpfr_sub_ui (tmp, tmp, 1, MPFR_RNDN);
428 if (red == 0 && comparison > 0)
429 /* use xp = 1/sk */
430 mpfr_mul (sk, tmp, xp, MPFR_RNDN);
431 else
432 mpfr_div (sk, tmp, sk, MPFR_RNDN);
433 }
434
435 /* We started from x0 = 1/|x| if |x| > 1, and |x| otherwise, thus
436 we had x0 = min(|x|, 1/|x|) <= 1, and applied 'red' times the
437 argument reduction x -> (sqrt(1+x^2)-1)/x, which keeps 0 < x <= 1 */
438
439 /* We first show that if the for-loop is executed at least once, then
440 sk < 1 after the loop. Indeed for 1/2 <= x <= 1, interval
441 arithmetic with precision 5 shows that (sqrt(1+x^2)-1)/x,
442 when evaluated with rounding to nearest, gives a value <= 0.875.
443 Now assume 2^(-k-1) <= x <= 2^(-k) for k >= 1.
444 Then o(x^2) <= 2^(-2k), o(1+x^2) <= 1+2^(-2k),
445 o(sqrt(1+x^2)) <= 1+2^(-2k-1), o(sqrt(1+x^2)-1) <= 2^(-2k-1),
446 and o((sqrt(1+x^2)-1)/x) <= 2^(-k) <= 1/2.
447
448 Now if sk=1 before the loop, then EXP(sk)=1 and since log2p >= 0,
449 the loop is performed at least once, thus the case sk=1 cannot
450 happen below.
451 */
452
453 MPFR_ASSERTD(mpfr_cmp_ui (sk, 1) < 0);
454
455 /* Assignation */
456 MPFR_SET_ZERO (arctgt);
457 twopoweri = 1 << 0;
458 MPFR_ASSERTD (n0 >= 4);
459 for (i = 0 ; i < n0; i++)
460 {
461 if (MPFR_UNLIKELY (MPFR_IS_ZERO (sk)))
462 break;
463 /* Calculation of trunc(tmp) --> mpz */
464 mpfr_mul_2ui (tmp, sk, twopoweri, MPFR_RNDN);
465 mpfr_trunc (tmp, tmp);
466 if (!MPFR_IS_ZERO (tmp))
467 {
468 /* tmp = ukz*2^exptol */
469 exptol = mpfr_get_z_2exp (ukz, tmp);
470 /* since the s_k are decreasing (see algorithms.tex),
471 and s_0 = min(|x|, 1/|x|) < 1, we have sk < 1,
472 thus exptol < 0 */
473 MPFR_ASSERTD (exptol < 0);
474 mpz_tdiv_q_2exp (ukz, ukz, (unsigned long int) (-exptol));
475 /* since tmp is a non-zero integer, and tmp = ukzold*2^exptol,
476 we now have ukz = tmp, thus ukz is non-zero */
477 /* Calculation of arctan(Ak) */
478 mpfr_set_z (tmp, ukz, MPFR_RNDN);
479 mpfr_div_2ui (tmp, tmp, twopoweri, MPFR_RNDN);
480 mpfr_atan_aux (tmp2, ukz, twopoweri, n0 - i, tabz);
481 mpfr_mul (tmp2, tmp2, tmp, MPFR_RNDN);
482 /* Addition */
483 mpfr_add (arctgt, arctgt, tmp2, MPFR_RNDN);
484 /* Next iteration */
485 mpfr_sub (tmp2, sk, tmp, MPFR_RNDN);
486 mpfr_mul (sk, sk, tmp, MPFR_RNDN);
487 mpfr_add_ui (sk, sk, 1, MPFR_RNDN);
488 mpfr_div (sk, tmp2, sk, MPFR_RNDN);
489 }
490 twopoweri <<= 1;
491 }
492 /* Add last step (Arctan(sk) ~= sk */
493 mpfr_add (arctgt, arctgt, sk, MPFR_RNDN);
494
495 /* argument reduction */
496 mpfr_mul_2ui (arctgt, arctgt, red, MPFR_RNDN);
497
498 if (comparison > 0)
499 { /* atan(x) = Pi/2-atan(1/x) for x > 0 */
500 mpfr_const_pi (tmp, MPFR_RNDN);
501 mpfr_div_2ui (tmp, tmp, 1, MPFR_RNDN);
502 mpfr_sub (arctgt, tmp, arctgt, MPFR_RNDN);
503 }
504 MPFR_SET_POS (arctgt);
505
506 if (MPFR_LIKELY (MPFR_CAN_ROUND (arctgt, realprec + est_lost - lost,
507 MPFR_PREC (atan), rnd_mode)))
508 break;
509 MPFR_ZIV_NEXT (loop, realprec);
510 }
511 MPFR_ZIV_FREE (loop);
512
513 inexact = mpfr_set4 (atan, arctgt, rnd_mode, MPFR_SIGN (x));
514
515 for (i = 0 ; i < oldn0 ; i++)
516 mpz_clear (tabz[i]);
517 mpz_clear (ukz);
518 MPFR_GROUP_CLEAR (group);
519
520 MPFR_SAVE_EXPO_FREE (expo);
521 return mpfr_check_range (atan, inexact, rnd_mode);
522 }
523