xref: /netbsd-src/external/lgpl3/mpfr/dist/src/rec_sqrt.c (revision ec6772edaf0cdcb5f52a48f4aca5e33a8fb8ecfd)
1 /* mpfr_rec_sqrt -- inverse square root
2 
3 Copyright 2008-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 /* for umul_ppmm */
24 #include "mpfr-impl.h"
25 
26 #define LIMB_SIZE(x) ((((x)-1)>>MPFR_LOG2_GMP_NUMB_BITS) + 1)
27 
28 #define MPFR_COM_N(x,y,n)                               \
29   do                                                    \
30     {                                                   \
31       mp_size_t i;                                      \
32       for (i = 0; i < n; i++)                           \
33         *((x)+i) = ~*((y)+i);                           \
34     }                                                   \
35   while (0)
36 
37 /* Put in X a p-bit approximation of 1/sqrt(A),
38    where X = {x, n}/B^n, n = ceil(p/GMP_NUMB_BITS),
39    A = 2^(1+as)*{a, an}/B^an, as is 0 or 1, an = ceil(ap/GMP_NUMB_BITS),
40    where B = 2^GMP_NUMB_BITS.
41 
42    We have 1 <= A < 4 and 1/2 <= X < 1.
43 
44    The error in the approximate result with respect to the true
45    value 1/sqrt(A) is bounded by 1 ulp(X), i.e., 2^{-p} since 1/2 <= X < 1.
46 
47    Note: x and a are left-aligned, i.e., the most significant bit of
48    a[an-1] is set, and so is the most significant bit of the output x[n-1].
49 
50    If p is not a multiple of GMP_NUMB_BITS, the extra low bits of the input
51    A are taken into account to compute the approximation of 1/sqrt(A), but
52    whether or not they are zero, the error between X and 1/sqrt(A) is bounded
53    by 1 ulp(X) [in precision p].
54    The extra low bits of the output X (if p is not a multiple of GMP_NUMB_BITS)
55    are set to 0.
56 
57    Assumptions:
58    (1) A should be normalized, i.e., the most significant bit of a[an-1]
59        should be 1. If as=0, we have 1 <= A < 2; if as=1, we have 2 <= A < 4.
60    (2) p >= 12
61    (3) {a, an} and {x, n} should not overlap
62    (4) GMP_NUMB_BITS >= 12 and is even
63 
64    Note: this routine is much more efficient when ap is small compared to p,
65    including the case where ap <= GMP_NUMB_BITS, thus it can be used to
66    implement an efficient mpfr_rec_sqrt_ui function.
67 
68    References:
69    [1] Modern Computer Algebra, Richard Brent and Paul Zimmermann,
70    https://members.loria.fr/PZimmermann/mca/pub226.html
71 */
72 static void
mpfr_mpn_rec_sqrt(mpfr_limb_ptr x,mpfr_prec_t p,mpfr_limb_srcptr a,mpfr_prec_t ap,int as)73 mpfr_mpn_rec_sqrt (mpfr_limb_ptr x, mpfr_prec_t p,
74                    mpfr_limb_srcptr a, mpfr_prec_t ap, int as)
75 
76 {
77   /* the following T1 and T2 are bipartite tables giving initial
78      approximation for the inverse square root, with 13-bit input split in
79      5+4+4, and 11-bit output. More precisely, if 2048 <= i < 8192,
80      with i = a*2^8 + b*2^4 + c, we use for approximation of
81      2048/sqrt(i/2048) the value x = T1[16*(a-8)+b] + T2[16*(a-8)+c].
82      The largest error is obtained for i = 2054, where x = 2044,
83      and 2048/sqrt(i/2048) = 2045.006576...
84   */
85   static short int T1[384] = {
86 2040, 2033, 2025, 2017, 2009, 2002, 1994, 1987, 1980, 1972, 1965, 1958, 1951,
87 1944, 1938, 1931, /* a=8 */
88 1925, 1918, 1912, 1905, 1899, 1892, 1886, 1880, 1874, 1867, 1861, 1855, 1849,
89 1844, 1838, 1832, /* a=9 */
90 1827, 1821, 1815, 1810, 1804, 1799, 1793, 1788, 1783, 1777, 1772, 1767, 1762,
91 1757, 1752, 1747, /* a=10 */
92 1742, 1737, 1733, 1728, 1723, 1718, 1713, 1709, 1704, 1699, 1695, 1690, 1686,
93 1681, 1677, 1673, /* a=11 */
94 1669, 1664, 1660, 1656, 1652, 1647, 1643, 1639, 1635, 1631, 1627, 1623, 1619,
95 1615, 1611, 1607, /* a=12 */
96 1603, 1600, 1596, 1592, 1588, 1585, 1581, 1577, 1574, 1570, 1566, 1563, 1559,
97 1556, 1552, 1549, /* a=13 */
98 1545, 1542, 1538, 1535, 1532, 1528, 1525, 1522, 1518, 1515, 1512, 1509, 1505,
99 1502, 1499, 1496, /* a=14 */
100 1493, 1490, 1487, 1484, 1481, 1478, 1475, 1472, 1469, 1466, 1463, 1460, 1457,
101 1454, 1451, 1449, /* a=15 */
102 1446, 1443, 1440, 1438, 1435, 1432, 1429, 1427, 1424, 1421, 1419, 1416, 1413,
103 1411, 1408, 1405, /* a=16 */
104 1403, 1400, 1398, 1395, 1393, 1390, 1388, 1385, 1383, 1380, 1378, 1375, 1373,
105 1371, 1368, 1366, /* a=17 */
106 1363, 1360, 1358, 1356, 1353, 1351, 1349, 1346, 1344, 1342, 1340, 1337, 1335,
107 1333, 1331, 1329, /* a=18 */
108 1327, 1325, 1323, 1321, 1319, 1316, 1314, 1312, 1310, 1308, 1306, 1304, 1302,
109 1300, 1298, 1296, /* a=19 */
110 1294, 1292, 1290, 1288, 1286, 1284, 1282, 1280, 1278, 1276, 1274, 1272, 1270,
111 1268, 1266, 1265, /* a=20 */
112 1263, 1261, 1259, 1257, 1255, 1253, 1251, 1250, 1248, 1246, 1244, 1242, 1241,
113 1239, 1237, 1235, /* a=21 */
114 1234, 1232, 1230, 1229, 1227, 1225, 1223, 1222, 1220, 1218, 1217, 1215, 1213,
115 1212, 1210, 1208, /* a=22 */
116 1206, 1204, 1203, 1201, 1199, 1198, 1196, 1195, 1193, 1191, 1190, 1188, 1187,
117 1185, 1184, 1182, /* a=23 */
118 1181, 1180, 1178, 1177, 1175, 1174, 1172, 1171, 1169, 1168, 1166, 1165, 1163,
119 1162, 1160, 1159, /* a=24 */
120 1157, 1156, 1154, 1153, 1151, 1150, 1149, 1147, 1146, 1144, 1143, 1142, 1140,
121 1139, 1137, 1136, /* a=25 */
122 1135, 1133, 1132, 1131, 1129, 1128, 1127, 1125, 1124, 1123, 1121, 1120, 1119,
123 1117, 1116, 1115, /* a=26 */
124 1114, 1113, 1111, 1110, 1109, 1108, 1106, 1105, 1104, 1103, 1101, 1100, 1099,
125 1098, 1096, 1095, /* a=27 */
126 1093, 1092, 1091, 1090, 1089, 1087, 1086, 1085, 1084, 1083, 1081, 1080, 1079,
127 1078, 1077, 1076, /* a=28 */
128 1075, 1073, 1072, 1071, 1070, 1069, 1068, 1067, 1065, 1064, 1063, 1062, 1061,
129 1060, 1059, 1058, /* a=29 */
130 1057, 1056, 1055, 1054, 1052, 1051, 1050, 1049, 1048, 1047, 1046, 1045, 1044,
131 1043, 1042, 1041, /* a=30 */
132 1040, 1039, 1038, 1037, 1036, 1035, 1034, 1033, 1032, 1031, 1030, 1029, 1028,
133 1027, 1026, 1025 /* a=31 */
134 };
135   static unsigned char T2[384] = {
136     7, 7, 6, 6, 5, 5, 4, 4, 4, 3, 3, 2, 2, 1, 1, 0, /* a=8 */
137     6, 5, 5, 5, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 0, 0, /* a=9 */
138     5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, /* a=10 */
139     4, 4, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, /* a=11 */
140     3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, /* a=12 */
141     3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* a=13 */
142     3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, /* a=14 */
143     2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* a=15 */
144     2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* a=16 */
145     2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* a=17 */
146     3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, /* a=18 */
147     2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* a=19 */
148     1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, /* a=20 */
149     1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* a=21 */
150     1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a=22 */
151     2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* a=23 */
152     1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a=24 */
153     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* a=25 */
154     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* a=26 */
155     1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a=27 */
156     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* a=28 */
157     1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* a=29 */
158     1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* a=30 */
159     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  /* a=31 */
160 };
161   mp_size_t n = LIMB_SIZE(p);   /* number of limbs of X */
162   mp_size_t an = LIMB_SIZE(ap); /* number of limbs of A */
163 
164   /* A should be normalized */
165   MPFR_ASSERTD((a[an - 1] & MPFR_LIMB_HIGHBIT) != 0);
166   /* We should have enough bits in one limb and GMP_NUMB_BITS should be even.
167      Since that does not depend on MPFR, we always check this. */
168   MPFR_STAT_STATIC_ASSERT ((GMP_NUMB_BITS & 1) == 0);
169   /* {a, an} and {x, n} should not overlap */
170   MPFR_ASSERTD((a + an <= x) || (x + n <= a));
171   MPFR_ASSERTD(p >= 11);
172 
173   if (MPFR_UNLIKELY(an > n)) /* we can cut the input to n limbs */
174     {
175       a += an - n;
176       an = n;
177     }
178 
179   if (p == 11) /* should happen only from recursive calls */
180     {
181       unsigned long i, ab, ac;
182       unsigned int t;
183 
184       /* take the 12+as most significant bits of A */
185 #if GMP_NUMB_BITS >= 16
186       i = a[an - 1] >> (GMP_NUMB_BITS - (12 + as));
187 #else
188       MPFR_STAT_STATIC_ASSERT (GMP_NUMB_BITS == 8);
189       {
190         unsigned int a12 = a[an - 1] << 8;
191         if (an >= 2)
192           a12 |= a[an - 2];
193         MPFR_ASSERTN(GMP_NUMB_BITS >= 4 + as);
194         i = a12 >> (GMP_NUMB_BITS - (4 + as));
195       }
196 #endif
197       /* if one wants faithful rounding for p=11, replace #if 0 by #if 1 */
198       ab = i >> 4;
199       ac = (ab & 0x3F0) | (i & 0x0F);
200       t = T1[ab - 0x80] + T2[ac - 0x80];  /* fits on 16 bits */
201 #if GMP_NUMB_BITS >= 16
202       /* x has only one limb */
203       x[0] = (mp_limb_t) t << (GMP_NUMB_BITS - p);
204 #else
205       MPFR_STAT_STATIC_ASSERT (GMP_NUMB_BITS == 8);
206       MPFR_ASSERTD (1024 <= t && t <= 2047);
207       x[1] = t >> 3; /* 128 <= x[1] <= 255 */
208       x[0] = MPFR_LIMB_LSHIFT(t, 5);
209 #endif
210     }
211   else /* p >= 12 */
212     {
213       mpfr_prec_t h, pl;
214       mpfr_limb_ptr r, s, t, u;
215       mp_size_t xn, rn, th, ln, tn, sn, ahn, un;
216       mp_limb_t neg, cy, cu;
217       MPFR_TMP_DECL(marker);
218 
219       /* compared to Algorithm 3.9 of [1], we have {a, an} = A/2 if as=0,
220          and A/4 if as=1. */
221 
222       /* h = max(11, ceil((p+3)/2)) is the bitsize of the recursive call */
223       h = (p < 18) ? 11 : (p >> 1) + 2;
224 
225       xn = LIMB_SIZE(h);       /* limb size of the recursive Xh */
226       rn = LIMB_SIZE(2 * h);   /* a priori limb size of Xh^2 */
227       ln = n - xn;             /* remaining limbs to be computed */
228 
229       /* Since |Xh - A^{-1/2}| <= 2^{-h}, then by multiplying by Xh + A^{-1/2}
230          we get |Xh^2 - 1/A| <= 2^{-h+1}, thus |A*Xh^2 - 1| <= 2^{-h+3},
231          thus the h-3 most significant bits of t should be zero,
232          which is in fact h+1+as-3 because of the normalization of A.
233          This corresponds to th=floor((h+1+as-3)/GMP_NUMB_BITS) limbs.
234 
235          More precisely we have |Xh^2 - 1/A| <= 2^{-h} * (Xh + A^{-1/2})
236          <= 2^{-h} * (2 A^{-1/2} + 2^{-h}) <= 2.001 * 2^{-h} * A^{-1/2}
237          since A < 4 and h >= 11, thus
238          |A*Xh^2 - 1| <= 2.001 * 2^{-h} * A^{1/2} <= 1.001 * 2^{2-h}.
239          This is sufficient to prove that the upper limb of {t,tn} below is
240          less that 0.501 * 2^GMP_NUMB_BITS, thus cu = 0 below.
241       */
242       th = (h + 1 + as - 3) >> MPFR_LOG2_GMP_NUMB_BITS;
243       tn = LIMB_SIZE(2 * h + 1 + as);
244 
245       /* we need h+1+as bits of a */
246       ahn = LIMB_SIZE(h + 1 + as); /* number of high limbs of A
247                                       needed for the recursive call */
248       if (MPFR_UNLIKELY(ahn > an))
249         ahn = an;
250       mpfr_mpn_rec_sqrt (x + ln, h, a + an - ahn, ahn * GMP_NUMB_BITS, as);
251       /* the most h significant bits of X are set, X has ceil(h/GMP_NUMB_BITS)
252          limbs, the low (-h) % GMP_NUMB_BITS bits are zero */
253 
254       /* compared to Algorithm 3.9 of [1], we have {x+ln,xn} = X_h */
255 
256       MPFR_TMP_MARK (marker);
257       /* first step: square X in r, result is exact */
258       un = xn + (tn - th);
259       /* We use the same temporary buffer to store r and u: r needs 2*xn
260          limbs where u needs xn+(tn-th) limbs. Since tn can store at least
261          2h bits, and th at most h bits, then tn-th can store at least h bits,
262          thus tn - th >= xn, and reserving the space for u is enough. */
263       MPFR_ASSERTD(2 * xn <= un);
264       u = r = MPFR_TMP_LIMBS_ALLOC (un);
265       if (2 * h <= GMP_NUMB_BITS) /* xn=rn=1, and since p <= 2h-3, n=1,
266                                      thus ln = 0 */
267         {
268           MPFR_ASSERTD(ln == 0);
269           cy = x[0] >> (GMP_NUMB_BITS >> 1);
270           r ++;
271           r[0] = cy * cy;
272         }
273       else if (xn == 1) /* xn=1, rn=2 */
274         umul_ppmm(r[1], r[0], x[ln], x[ln]);
275       else
276         {
277           mpn_sqr (r, x + ln, xn);
278           /* we have {r, 2*xn} = X_h^2 */
279           if (rn < 2 * xn)
280             r ++;
281         }
282       /* now the 2h most significant bits of {r, rn} contains X^2, r has rn
283          limbs, and the low (-2h) % GMP_NUMB_BITS bits are zero */
284 
285       /* Second step: s <- A * (r^2), and truncate the low ap bits,
286          i.e., at weight 2^{-2h} (s is aligned to the low significant bits)
287        */
288       sn = an + rn;
289       s = MPFR_TMP_LIMBS_ALLOC (sn);
290       if (rn == 1) /* rn=1 implies n=1, since rn*GMP_NUMB_BITS >= 2h,
291                            and 2h >= p+3 */
292         {
293           /* necessarily p <= GMP_NUMB_BITS-3: we can ignore the two low
294              bits from A */
295           /* since n=1, and we ensured an <= n, we also have an=1 */
296           MPFR_ASSERTD(an == 1);
297           umul_ppmm (s[1], s[0], r[0], a[0]);
298         }
299       else
300         {
301           /* we have p <= n * GMP_NUMB_BITS
302              2h <= rn * GMP_NUMB_BITS with p+3 <= 2h <= p+4
303              thus n <= rn <= n + 1 */
304           MPFR_ASSERTD(rn <= n + 1);
305           /* since we ensured an <= n, we have an <= rn */
306           MPFR_ASSERTD(an <= rn);
307           mpn_mul (s, r, rn, a, an);
308           /* s should be near B^sn/2^(1+as), thus s[sn-1] is either
309              100000... or 011111... if as=0, or
310              010000... or 001111... if as=1.
311              We ignore the bits of s after the first 2h+1+as ones.
312              We have {s, rn+an} = A*X_h^2/2 if as=0, A*X_h^2/4 if as=1. */
313         }
314 
315       /* We ignore the bits of s after the first 2h+1+as ones: s has rn + an
316          limbs, where rn = LIMBS(2h), an=LIMBS(a), and tn = LIMBS(2h+1+as). */
317       t = s + sn - tn; /* pointer to low limb of the high part of t */
318       /* the upper h-3 bits of 1-t should be zero,
319          where 1 corresponds to the most significant bit of t[tn-1] if as=0,
320          and to the 2nd most significant bit of t[tn-1] if as=1 */
321 
322       /* compute t <- 1 - t, which is B^tn - {t, tn+1},
323          with rounding toward -Inf, i.e., rounding the input t toward +Inf.
324          We could only modify the low tn - th limbs from t, but it gives only
325          a small speedup, and would make the code more complex.
326       */
327       neg = t[tn - 1] & (MPFR_LIMB_HIGHBIT >> as);
328       if (neg == 0) /* Ax^2 < 1: we have t = th + eps, where 0 <= eps < ulp(th)
329                        is the part truncated above, thus 1 - t rounded to -Inf
330                        is 1 - th - ulp(th) */
331         {
332           /* since the 1+as most significant bits of t are zero, set them
333              to 1 before the one-complement */
334           t[tn - 1] |= MPFR_LIMB_HIGHBIT | (MPFR_LIMB_HIGHBIT >> as);
335           MPFR_COM_N (t, t, tn);
336           /* we should add 1 here to get 1-th complement, and subtract 1 for
337              -ulp(th), thus we do nothing */
338         }
339       else /* negative case: we want 1 - t rounded toward -Inf, i.e.,
340               th + eps rounded toward +Inf, which is th + ulp(th):
341               we discard the bit corresponding to 1,
342               and we add 1 to the least significant bit of t */
343         {
344           t[tn - 1] ^= neg;
345           mpn_add_1 (t, t, tn, 1);
346         }
347       tn -= th; /* we know at least th = floor((h+1+as-3)/GMP_NUMB_LIMBS) of
348                    the high limbs of {t, tn} are zero */
349 
350       /* tn = rn - th, where rn * GMP_NUMB_BITS >= 2*h and
351          th * GMP_NUMB_BITS <= h+1+as-3, thus tn > 0 */
352       MPFR_ASSERTD(tn > 0);
353 
354       /* u <- x * t, where {t, tn} contains at least h+3 bits,
355          and {x, xn} contains h bits, thus tn >= xn */
356       MPFR_ASSERTD(tn >= xn);
357       if (tn == 1) /* necessarily xn=1 */
358         umul_ppmm (u[1], u[0], t[0], x[ln]);
359       else
360         mpn_mul (u, t, tn, x + ln, xn);
361 
362       /* we have {u, tn+xn} = T_l X_h/2 if as=0, T_l X_h/4 if as=1 */
363 
364       /* we have already discarded the upper th high limbs of t, thus we only
365          have to consider the upper n - th limbs of u */
366       un = n - th; /* un cannot be zero, since p <= n*GMP_NUMB_BITS,
367                       h = ceil((p+3)/2) <= (p+4)/2,
368                       th*GMP_NUMB_BITS <= h-1 <= p/2+1,
369                       thus (n-th)*GMP_NUMB_BITS >= p/2-1.
370                    */
371       MPFR_ASSERTD(un > 0);
372       u += (tn + xn) - un; /* xn + tn - un = xn + (original_tn - th) - (n - th)
373                                            = xn + original_tn - n
374                               = LIMBS(h) + LIMBS(2h+1+as) - LIMBS(p) > 0
375                               since 2h >= p+3 */
376       MPFR_ASSERTD(tn + xn > un); /* will allow to access u[-1] below */
377 
378       /* In case as=0, u contains |x*(1-Ax^2)/2|, which is exactly what we
379          need to add or subtract.
380          In case as=1, u contains |x*(1-Ax^2)/4|, thus we need to multiply
381          u by 2. */
382 
383       if (as == 1)
384         /* shift on un+1 limbs to get most significant bit of u[-1] into
385            least significant bit of u[0] */
386         mpn_lshift (u - 1, u - 1, un + 1, 1);
387 
388       /* now {u,un} represents U / 2 from Algorithm 3.9 */
389 
390       pl = n * GMP_NUMB_BITS - p;       /* low bits from x */
391       /* We want that the low pl bits are zero after rounding to nearest,
392          thus we round u to nearest at bit pl-1 of u[0] */
393       if (pl > 0)
394         {
395           cu = mpn_add_1 (u, u, un,
396                           u[0] & MPFR_LIMB_LSHIFT(MPFR_LIMB_ONE, pl - 1));
397           /* mask bits 0..pl-1 of u[0] */
398           u[0] &= MPFR_LIMB(~MPFR_LIMB_MASK(pl));
399         }
400       else /* round bit is in u[-1] */
401         cu = mpn_add_1 (u, u, un, u[-1] >> (GMP_NUMB_BITS - 1));
402       MPFR_ASSERTN(cu == 0);
403 
404       /* We already have filled {x + ln, xn = n - ln}, and we want to add or
405          subtract {u, un} at position x.
406          un = n - th, where th contains <= h+1+as-3<=h-1 bits
407          ln = n - xn, where xn contains >= h bits
408          thus un > ln.
409          Warning: ln might be zero.
410       */
411       MPFR_ASSERTD(un > ln);
412       /* we can have un = ln + 2, for example with GMP_NUMB_BITS=32 and
413          p=62, as=0, then h=33, n=2, th=0, xn=2, thus un=2 and ln=0. */
414       MPFR_ASSERTD(un == ln + 1 || un == ln + 2);
415       /* the high un-ln limbs of u will overlap the low part of {x+ln,xn},
416          we need to add or subtract the overlapping part {u + ln, un - ln} */
417       /* Warning! th may be 0, in which case the mpn_add_1 and mpn_sub_1
418          below (with size = th) mustn't be used. */
419       if (neg == 0)
420         {
421           if (ln > 0)
422             MPN_COPY (x, u, ln);
423           cy = mpn_add (x + ln, x + ln, xn, u + ln, un - ln);
424           /* cy is the carry at x + (ln + xn) = x + n */
425         }
426       else /* negative case */
427         {
428           /* subtract {u+ln, un-ln} from {x+ln,un} */
429           cy = mpn_sub (x + ln, x + ln, xn, u + ln, un - ln);
430           /* cy is the borrow at x + (ln + xn) = x + n */
431 
432           /* cy cannot be non-zero, since the most significant bit of Xh is 1,
433              and the correction is bounded by 2^{-h+3} */
434           MPFR_ASSERTD(cy == 0);
435           if (ln > 0)
436             {
437               MPFR_COM_N (x, u, ln);
438               /* we must add one for the 2-complement ... */
439               cy = mpn_add_1 (x, x, n, MPFR_LIMB_ONE);
440               /* ... and subtract 1 at x[ln], where n = ln + xn */
441               cy -= mpn_sub_1 (x + ln, x + ln, xn, MPFR_LIMB_ONE);
442             }
443         }
444 
445       /* cy can be 1 when A=1, i.e., {a, n} = B^n. In that case we should
446          have X = B^n, and setting X to 1-2^{-p} satisfies the error bound
447          of 1 ulp. */
448       if (MPFR_UNLIKELY(cy != 0))
449         {
450           cy -= mpn_sub_1 (x, x, n, MPFR_LIMB_ONE << pl);
451           MPFR_ASSERTD(cy == 0);
452         }
453 
454       MPFR_TMP_FREE (marker);
455     }
456 }
457 
458 int
mpfr_rec_sqrt(mpfr_ptr r,mpfr_srcptr u,mpfr_rnd_t rnd_mode)459 mpfr_rec_sqrt (mpfr_ptr r, mpfr_srcptr u, mpfr_rnd_t rnd_mode)
460 {
461   mpfr_prec_t rp, up, wp;
462   mp_size_t rn, wn;
463   int s, cy, inex;
464   mpfr_limb_ptr x;
465   MPFR_TMP_DECL(marker);
466   MPFR_ZIV_DECL (loop);
467 
468   MPFR_LOG_FUNC
469     (("x[%Pd]=%.*Rg rnd=%d", mpfr_get_prec (u), mpfr_log_prec, u, rnd_mode),
470      ("y[%Pd]=%.*Rg inexact=%d", mpfr_get_prec (r), mpfr_log_prec, r, inex));
471 
472   /* special values */
473   if (MPFR_UNLIKELY(MPFR_IS_SINGULAR(u)))
474     {
475       if (MPFR_IS_NAN(u))
476         {
477           MPFR_SET_NAN(r);
478           MPFR_RET_NAN;
479         }
480       else if (MPFR_IS_ZERO(u)) /* 1/sqrt(+0) = 1/sqrt(-0) = +Inf */
481         {
482           /* +0 or -0 */
483           MPFR_SET_INF(r);
484           MPFR_SET_POS(r);
485           MPFR_SET_DIVBY0 ();
486           MPFR_RET(0); /* Inf is exact */
487         }
488       else
489         {
490           MPFR_ASSERTD(MPFR_IS_INF(u));
491           /* 1/sqrt(-Inf) = NAN */
492           if (MPFR_IS_NEG(u))
493             {
494               MPFR_SET_NAN(r);
495               MPFR_RET_NAN;
496             }
497           /* 1/sqrt(+Inf) = +0 */
498           MPFR_SET_POS(r);
499           MPFR_SET_ZERO(r);
500           MPFR_RET(0);
501         }
502     }
503 
504   /* if u < 0, 1/sqrt(u) is NaN */
505   if (MPFR_UNLIKELY(MPFR_IS_NEG(u)))
506     {
507       MPFR_SET_NAN(r);
508       MPFR_RET_NAN;
509     }
510 
511   MPFR_SET_POS(r);
512 
513   rp = MPFR_PREC(r); /* output precision */
514   up = MPFR_PREC(u); /* input precision */
515   wp = rp + 11;      /* initial working precision */
516 
517   /* Let u = U*2^e, where e = EXP(u), and 1/2 <= U < 1.
518      If e is even, we compute an approximation of X of (4U)^{-1/2},
519      and the result is X*2^(-(e-2)/2) [case s=1].
520      If e is odd, we compute an approximation of X of (2U)^{-1/2},
521      and the result is X*2^(-(e-1)/2) [case s=0]. */
522 
523   /* parity of the exponent of u */
524   s = 1 - ((mpfr_uexp_t) MPFR_GET_EXP (u) & 1);
525 
526   rn = LIMB_SIZE(rp);
527 
528   /* for the first iteration, if rp + 11 fits into rn limbs, we round up
529      up to a full limb to maximize the chance of rounding, while avoiding
530      to allocate extra space */
531   wp = rp + 11;
532   if (wp < rn * GMP_NUMB_BITS)
533     wp = rn * GMP_NUMB_BITS;
534   MPFR_ZIV_INIT (loop, wp);
535   for (;;)
536     {
537       MPFR_TMP_MARK (marker);
538       wn = LIMB_SIZE(wp);
539       if (r == u || wn > rn) /* out of place, i.e., we cannot write to r */
540         x = MPFR_TMP_LIMBS_ALLOC (wn);
541       else
542         x = MPFR_MANT(r);
543       mpfr_mpn_rec_sqrt (x, wp, MPFR_MANT(u), up, s);
544       /* If the input was not truncated, the error is at most one ulp;
545          if the input was truncated, the error is at most two ulps
546          (see algorithms.tex). */
547       if (MPFR_LIKELY (mpfr_round_p (x, wn, wp - (wp < up),
548                                      rp + (rnd_mode == MPFR_RNDN))))
549         break;
550 
551       /* We detect only now the exact case where u=2^(2e), to avoid
552          slowing down the average case. This can happen only when the
553          mantissa is exactly 1/2 and the exponent is odd. */
554       if (s == 0 && mpfr_cmp_ui_2exp (u, 1, MPFR_EXP(u) - 1) == 0)
555         {
556           mpfr_prec_t pl = wn * GMP_NUMB_BITS - wp;
557 
558           /* we should have x=111...111 */
559           mpn_add_1 (x, x, wn, MPFR_LIMB_ONE << pl);
560           x[wn - 1] = MPFR_LIMB_HIGHBIT;
561           s += 2;
562           break; /* go through */
563         }
564       MPFR_TMP_FREE(marker);
565 
566       MPFR_ZIV_NEXT (loop, wp);
567     }
568   MPFR_ZIV_FREE (loop);
569   cy = mpfr_round_raw (MPFR_MANT(r), x, wp, 0, rp, rnd_mode, &inex);
570   MPFR_EXP(r) = - (MPFR_EXP(u) - 1 - s) / 2;
571   if (MPFR_UNLIKELY(cy != 0))
572     {
573       MPFR_EXP(r) ++;
574       MPFR_MANT(r)[rn - 1] = MPFR_LIMB_HIGHBIT;
575     }
576   MPFR_TMP_FREE(marker);
577   return mpfr_check_range (r, inex, rnd_mode);
578 }
579