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 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 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