tsqrt.c revision 1.1.1.4 1 1.1 mrg /* Test file for mpfr_sqrt.
2 1.1 mrg
3 1.1.1.4 mrg Copyright 1999, 2001-2018 Free Software Foundation, Inc.
4 1.1.1.3 mrg Contributed by the AriC and Caramba projects, INRIA.
5 1.1 mrg
6 1.1 mrg This file is part of the GNU MPFR Library.
7 1.1 mrg
8 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
11 1.1 mrg option) any later version.
12 1.1 mrg
13 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 1.1 mrg License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU Lesser General Public License
19 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 1.1 mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 1.1 mrg
23 1.1 mrg #include "mpfr-test.h"
24 1.1 mrg
25 1.1 mrg #ifdef CHECK_EXTERNAL
26 1.1 mrg static int
27 1.1 mrg test_sqrt (mpfr_ptr a, mpfr_srcptr b, mpfr_rnd_t rnd_mode)
28 1.1 mrg {
29 1.1 mrg int res;
30 1.1 mrg int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b);
31 1.1 mrg if (ok)
32 1.1 mrg {
33 1.1 mrg mpfr_print_raw (b);
34 1.1 mrg }
35 1.1 mrg res = mpfr_sqrt (a, b, rnd_mode);
36 1.1 mrg if (ok)
37 1.1 mrg {
38 1.1 mrg printf (" ");
39 1.1 mrg mpfr_print_raw (a);
40 1.1 mrg printf ("\n");
41 1.1 mrg }
42 1.1 mrg return res;
43 1.1 mrg }
44 1.1 mrg #else
45 1.1 mrg #define test_sqrt mpfr_sqrt
46 1.1 mrg #endif
47 1.1 mrg
48 1.1 mrg static void
49 1.1 mrg check3 (const char *as, mpfr_rnd_t rnd_mode, const char *qs)
50 1.1 mrg {
51 1.1 mrg mpfr_t q;
52 1.1 mrg
53 1.1 mrg mpfr_init2 (q, 53);
54 1.1 mrg mpfr_set_str1 (q, as);
55 1.1 mrg test_sqrt (q, q, rnd_mode);
56 1.1 mrg if (mpfr_cmp_str1 (q, qs) )
57 1.1 mrg {
58 1.1 mrg printf ("mpfr_sqrt failed for a=%s, rnd_mode=%s\n",
59 1.1 mrg as, mpfr_print_rnd_mode (rnd_mode));
60 1.1 mrg printf ("expected sqrt is %s, got ",qs);
61 1.1 mrg mpfr_out_str (stdout, 10, 0, q, MPFR_RNDN);
62 1.1 mrg putchar ('\n');
63 1.1 mrg exit (1);
64 1.1 mrg }
65 1.1 mrg mpfr_clear (q);
66 1.1 mrg }
67 1.1 mrg
68 1.1 mrg static void
69 1.1.1.4 mrg check4 (const char *as, mpfr_rnd_t rnd_mode, const char *qs)
70 1.1 mrg {
71 1.1 mrg mpfr_t q;
72 1.1 mrg
73 1.1 mrg mpfr_init2 (q, 53);
74 1.1 mrg mpfr_set_str1 (q, as);
75 1.1 mrg test_sqrt (q, q, rnd_mode);
76 1.1.1.4 mrg if (mpfr_cmp_str (q, qs, 16, MPFR_RNDN))
77 1.1 mrg {
78 1.1 mrg printf ("mpfr_sqrt failed for a=%s, rnd_mode=%s\n",
79 1.1.1.4 mrg as, mpfr_print_rnd_mode (rnd_mode));
80 1.1.1.4 mrg printf ("expected %s\ngot ", qs);
81 1.1 mrg mpfr_out_str (stdout, 16, 0, q, MPFR_RNDN);
82 1.1.1.4 mrg printf ("\n");
83 1.1 mrg mpfr_clear (q);
84 1.1 mrg exit (1);
85 1.1 mrg }
86 1.1 mrg mpfr_clear (q);
87 1.1 mrg }
88 1.1 mrg
89 1.1 mrg static void
90 1.1 mrg check24 (const char *as, mpfr_rnd_t rnd_mode, const char *qs)
91 1.1 mrg {
92 1.1 mrg mpfr_t q;
93 1.1 mrg
94 1.1 mrg mpfr_init2 (q, 24);
95 1.1 mrg mpfr_set_str1 (q, as);
96 1.1 mrg test_sqrt (q, q, rnd_mode);
97 1.1 mrg if (mpfr_cmp_str1 (q, qs))
98 1.1 mrg {
99 1.1 mrg printf ("mpfr_sqrt failed for a=%s, prec=24, rnd_mode=%s\n",
100 1.1 mrg as, mpfr_print_rnd_mode(rnd_mode));
101 1.1 mrg printf ("expected sqrt is %s, got ",qs);
102 1.1 mrg mpfr_out_str (stdout, 10, 0, q, MPFR_RNDN);
103 1.1 mrg printf ("\n");
104 1.1 mrg exit (1);
105 1.1 mrg }
106 1.1 mrg mpfr_clear (q);
107 1.1 mrg }
108 1.1 mrg
109 1.1 mrg static void
110 1.1 mrg check_diverse (const char *as, mpfr_prec_t p, const char *qs)
111 1.1 mrg {
112 1.1 mrg mpfr_t q;
113 1.1 mrg
114 1.1 mrg mpfr_init2 (q, p);
115 1.1 mrg mpfr_set_str1 (q, as);
116 1.1 mrg test_sqrt (q, q, MPFR_RNDN);
117 1.1 mrg if (mpfr_cmp_str1 (q, qs))
118 1.1 mrg {
119 1.1 mrg printf ("mpfr_sqrt failed for a=%s, prec=%lu, rnd_mode=%s\n",
120 1.1.1.2 mrg as, (unsigned long) p, mpfr_print_rnd_mode (MPFR_RNDN));
121 1.1 mrg printf ("expected sqrt is %s, got ", qs);
122 1.1 mrg mpfr_out_str (stdout, 10, 0, q, MPFR_RNDN);
123 1.1 mrg printf ("\n");
124 1.1 mrg exit (1);
125 1.1 mrg }
126 1.1 mrg mpfr_clear (q);
127 1.1 mrg }
128 1.1 mrg
129 1.1 mrg /* the following examples come from the paper "Number-theoretic Test
130 1.1 mrg Generation for Directed Rounding" from Michael Parks, Table 3 */
131 1.1 mrg static void
132 1.1 mrg check_float (void)
133 1.1 mrg {
134 1.1 mrg check24("70368760954880.0", MPFR_RNDN, "8.388609e6");
135 1.1 mrg check24("281474943156224.0", MPFR_RNDN, "1.6777215e7");
136 1.1 mrg check24("70368777732096.0", MPFR_RNDN, "8.388610e6");
137 1.1 mrg check24("281474909601792.0", MPFR_RNDN, "1.6777214e7");
138 1.1 mrg check24("100216216748032.0", MPFR_RNDN, "1.0010805e7");
139 1.1 mrg check24("120137273311232.0", MPFR_RNDN, "1.0960715e7");
140 1.1 mrg check24("229674600890368.0", MPFR_RNDN, "1.5155019e7");
141 1.1 mrg check24("70368794509312.0", MPFR_RNDN, "8.388611e6");
142 1.1 mrg check24("281474876047360.0", MPFR_RNDN, "1.6777213e7");
143 1.1 mrg check24("91214552498176.0", MPFR_RNDN, "9.550631e6");
144 1.1 mrg
145 1.1 mrg check24("70368760954880.0", MPFR_RNDZ, "8.388608e6");
146 1.1 mrg check24("281474943156224.0", MPFR_RNDZ, "1.6777214e7");
147 1.1 mrg check24("70368777732096.0", MPFR_RNDZ, "8.388609e6");
148 1.1 mrg check24("281474909601792.0", MPFR_RNDZ, "1.6777213e7");
149 1.1 mrg check24("100216216748032.0", MPFR_RNDZ, "1.0010805e7");
150 1.1 mrg check24("120137273311232.0", MPFR_RNDZ, "1.0960715e7");
151 1.1 mrg check24("229674600890368.0", MPFR_RNDZ, "1.5155019e7");
152 1.1 mrg check24("70368794509312.0", MPFR_RNDZ, "8.38861e6");
153 1.1 mrg check24("281474876047360.0", MPFR_RNDZ, "1.6777212e7");
154 1.1 mrg check24("91214552498176.0", MPFR_RNDZ, "9.550631e6");
155 1.1 mrg
156 1.1 mrg check24("70368760954880.0", MPFR_RNDU, "8.388609e6");
157 1.1 mrg check24("281474943156224.0",MPFR_RNDU, "1.6777215e7");
158 1.1 mrg check24("70368777732096.0", MPFR_RNDU, "8.388610e6");
159 1.1 mrg check24("281474909601792.0", MPFR_RNDU, "1.6777214e7");
160 1.1 mrg check24("100216216748032.0", MPFR_RNDU, "1.0010806e7");
161 1.1 mrg check24("120137273311232.0", MPFR_RNDU, "1.0960716e7");
162 1.1 mrg check24("229674600890368.0", MPFR_RNDU, "1.515502e7");
163 1.1 mrg check24("70368794509312.0", MPFR_RNDU, "8.388611e6");
164 1.1 mrg check24("281474876047360.0", MPFR_RNDU, "1.6777213e7");
165 1.1 mrg check24("91214552498176.0", MPFR_RNDU, "9.550632e6");
166 1.1 mrg
167 1.1 mrg check24("70368760954880.0", MPFR_RNDD, "8.388608e6");
168 1.1 mrg check24("281474943156224.0", MPFR_RNDD, "1.6777214e7");
169 1.1 mrg check24("70368777732096.0", MPFR_RNDD, "8.388609e6");
170 1.1 mrg check24("281474909601792.0", MPFR_RNDD, "1.6777213e7");
171 1.1 mrg check24("100216216748032.0", MPFR_RNDD, "1.0010805e7");
172 1.1 mrg check24("120137273311232.0", MPFR_RNDD, "1.0960715e7");
173 1.1 mrg check24("229674600890368.0", MPFR_RNDD, "1.5155019e7");
174 1.1 mrg check24("70368794509312.0", MPFR_RNDD, "8.38861e6");
175 1.1 mrg check24("281474876047360.0", MPFR_RNDD, "1.6777212e7");
176 1.1 mrg check24("91214552498176.0", MPFR_RNDD, "9.550631e6");
177 1.1 mrg
178 1.1 mrg /* check that rounding away is just rounding toward plus infinity */
179 1.1 mrg check24("91214552498176.0", MPFR_RNDA, "9.550632e6");
180 1.1 mrg }
181 1.1 mrg
182 1.1 mrg static void
183 1.1 mrg special (void)
184 1.1 mrg {
185 1.1 mrg mpfr_t x, y, z;
186 1.1 mrg int inexact;
187 1.1 mrg mpfr_prec_t p;
188 1.1 mrg
189 1.1 mrg mpfr_init (x);
190 1.1 mrg mpfr_init (y);
191 1.1 mrg mpfr_init (z);
192 1.1 mrg
193 1.1 mrg mpfr_set_prec (x, 64);
194 1.1 mrg mpfr_set_str_binary (x, "1010000010100011011001010101010010001100001101011101110001011001E-1");
195 1.1 mrg mpfr_set_prec (y, 32);
196 1.1 mrg test_sqrt (y, x, MPFR_RNDN);
197 1.1 mrg if (mpfr_cmp_ui (y, 2405743844UL))
198 1.1 mrg {
199 1.1 mrg printf ("Error for n^2+n+1/2 with n=2405743843\n");
200 1.1 mrg exit (1);
201 1.1 mrg }
202 1.1 mrg
203 1.1 mrg mpfr_set_prec (x, 65);
204 1.1 mrg mpfr_set_str_binary (x, "10100000101000110110010101010100100011000011010111011100010110001E-2");
205 1.1 mrg mpfr_set_prec (y, 32);
206 1.1 mrg test_sqrt (y, x, MPFR_RNDN);
207 1.1 mrg if (mpfr_cmp_ui (y, 2405743844UL))
208 1.1 mrg {
209 1.1 mrg printf ("Error for n^2+n+1/4 with n=2405743843\n");
210 1.1 mrg mpfr_dump (y);
211 1.1 mrg exit (1);
212 1.1 mrg }
213 1.1 mrg
214 1.1 mrg mpfr_set_prec (x, 66);
215 1.1 mrg mpfr_set_str_binary (x, "101000001010001101100101010101001000110000110101110111000101100011E-3");
216 1.1 mrg mpfr_set_prec (y, 32);
217 1.1 mrg test_sqrt (y, x, MPFR_RNDN);
218 1.1 mrg if (mpfr_cmp_ui (y, 2405743844UL))
219 1.1 mrg {
220 1.1 mrg printf ("Error for n^2+n+1/4+1/8 with n=2405743843\n");
221 1.1 mrg mpfr_dump (y);
222 1.1 mrg exit (1);
223 1.1 mrg }
224 1.1 mrg
225 1.1 mrg mpfr_set_prec (x, 66);
226 1.1 mrg mpfr_set_str_binary (x, "101000001010001101100101010101001000110000110101110111000101100001E-3");
227 1.1 mrg mpfr_set_prec (y, 32);
228 1.1 mrg test_sqrt (y, x, MPFR_RNDN);
229 1.1 mrg if (mpfr_cmp_ui (y, 2405743843UL))
230 1.1 mrg {
231 1.1 mrg printf ("Error for n^2+n+1/8 with n=2405743843\n");
232 1.1 mrg mpfr_dump (y);
233 1.1 mrg exit (1);
234 1.1 mrg }
235 1.1 mrg
236 1.1 mrg mpfr_set_prec (x, 27);
237 1.1 mrg mpfr_set_str_binary (x, "0.110100111010101000010001011");
238 1.1 mrg if ((inexact = test_sqrt (x, x, MPFR_RNDZ)) >= 0)
239 1.1 mrg {
240 1.1 mrg printf ("Wrong inexact flag: expected -1, got %d\n", inexact);
241 1.1 mrg exit (1);
242 1.1 mrg }
243 1.1 mrg
244 1.1 mrg mpfr_set_prec (x, 2);
245 1.1 mrg for (p=2; p<1000; p++)
246 1.1 mrg {
247 1.1 mrg mpfr_set_prec (z, p);
248 1.1 mrg mpfr_set_ui (z, 1, MPFR_RNDN);
249 1.1 mrg mpfr_nexttoinf (z);
250 1.1 mrg test_sqrt (x, z, MPFR_RNDU);
251 1.1 mrg if (mpfr_cmp_ui_2exp(x, 3, -1))
252 1.1 mrg {
253 1.1 mrg printf ("Error: sqrt(1+ulp(1), up) should give 1.5 (prec=%u)\n",
254 1.1 mrg (unsigned int) p);
255 1.1.1.4 mrg printf ("got "); mpfr_dump (x);
256 1.1 mrg exit (1);
257 1.1 mrg }
258 1.1 mrg }
259 1.1 mrg
260 1.1 mrg /* check inexact flag */
261 1.1 mrg mpfr_set_prec (x, 5);
262 1.1 mrg mpfr_set_str_binary (x, "1.1001E-2");
263 1.1 mrg if ((inexact = test_sqrt (x, x, MPFR_RNDN)))
264 1.1 mrg {
265 1.1 mrg printf ("Wrong inexact flag: expected 0, got %d\n", inexact);
266 1.1 mrg exit (1);
267 1.1 mrg }
268 1.1 mrg
269 1.1 mrg mpfr_set_prec (x, 2);
270 1.1 mrg mpfr_set_prec (z, 2);
271 1.1 mrg
272 1.1 mrg /* checks the sign is correctly set */
273 1.1 mrg mpfr_set_si (x, 1, MPFR_RNDN);
274 1.1 mrg mpfr_set_si (z, -1, MPFR_RNDN);
275 1.1 mrg test_sqrt (z, x, MPFR_RNDN);
276 1.1 mrg if (mpfr_cmp_ui (z, 0) < 0)
277 1.1 mrg {
278 1.1 mrg printf ("Error: square root of 1 gives ");
279 1.1.1.4 mrg mpfr_dump (z);
280 1.1 mrg exit (1);
281 1.1 mrg }
282 1.1 mrg
283 1.1 mrg mpfr_set_prec (x, 192);
284 1.1 mrg mpfr_set_prec (z, 160);
285 1.1 mrg mpfr_set_str_binary (z, "0.1011010100000100100100100110011001011100100100000011000111011001011101101101110000110100001000100001100001011000E1");
286 1.1 mrg mpfr_set_prec (x, 160);
287 1.1 mrg test_sqrt(x, z, MPFR_RNDN);
288 1.1 mrg test_sqrt(z, x, MPFR_RNDN);
289 1.1 mrg
290 1.1 mrg mpfr_set_prec (x, 53);
291 1.1 mrg mpfr_set_str (x, "8093416094703476.0", 10, MPFR_RNDN);
292 1.1 mrg mpfr_div_2exp (x, x, 1075, MPFR_RNDN);
293 1.1 mrg test_sqrt (x, x, MPFR_RNDN);
294 1.1 mrg mpfr_set_str (z, "1e55596835b5ef@-141", 16, MPFR_RNDN);
295 1.1 mrg if (mpfr_cmp (x, z))
296 1.1 mrg {
297 1.1 mrg printf ("Error: square root of 8093416094703476*2^(-1075)\n");
298 1.1 mrg printf ("expected "); mpfr_dump (z);
299 1.1 mrg printf ("got "); mpfr_dump (x);
300 1.1 mrg exit (1);
301 1.1 mrg }
302 1.1 mrg
303 1.1 mrg mpfr_set_prec (x, 33);
304 1.1 mrg mpfr_set_str_binary (x, "0.111011011011110001100111111001000e-10");
305 1.1 mrg mpfr_set_prec (z, 157);
306 1.1 mrg inexact = test_sqrt (z, x, MPFR_RNDN);
307 1.1 mrg mpfr_set_prec (x, 157);
308 1.1 mrg mpfr_set_str_binary (x, "0.11110110101100101111001011100011100011100001101010111011010000100111011000111110100001001011110011111100101110010110010110011001011011010110010000011001101E-5");
309 1.1 mrg if (mpfr_cmp (x, z))
310 1.1 mrg {
311 1.1 mrg printf ("Error: square root (1)\n");
312 1.1 mrg exit (1);
313 1.1 mrg }
314 1.1 mrg if (inexact <= 0)
315 1.1 mrg {
316 1.1 mrg printf ("Error: wrong inexact flag (1)\n");
317 1.1 mrg exit (1);
318 1.1 mrg }
319 1.1 mrg
320 1.1 mrg /* case prec(result) << prec(input) */
321 1.1 mrg mpfr_set_prec (z, 2);
322 1.1.1.4 mrg for (p = mpfr_get_prec (z); p < 1000; p++)
323 1.1 mrg {
324 1.1 mrg mpfr_set_prec (x, p);
325 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
326 1.1 mrg mpfr_nextabove (x);
327 1.1 mrg /* 1.0 < x <= 1.5 thus 1 < sqrt(x) <= 1.23 */
328 1.1 mrg inexact = test_sqrt (z, x, MPFR_RNDN);
329 1.1 mrg MPFR_ASSERTN(inexact < 0 && mpfr_cmp_ui (z, 1) == 0);
330 1.1 mrg inexact = test_sqrt (z, x, MPFR_RNDZ);
331 1.1 mrg MPFR_ASSERTN(inexact < 0 && mpfr_cmp_ui (z, 1) == 0);
332 1.1 mrg inexact = test_sqrt (z, x, MPFR_RNDU);
333 1.1 mrg MPFR_ASSERTN(inexact > 0 && mpfr_cmp_ui_2exp (z, 3, -1) == 0);
334 1.1 mrg inexact = test_sqrt (z, x, MPFR_RNDD);
335 1.1 mrg MPFR_ASSERTN(inexact < 0 && mpfr_cmp_ui (z, 1) == 0);
336 1.1 mrg inexact = test_sqrt (z, x, MPFR_RNDA);
337 1.1 mrg MPFR_ASSERTN(inexact > 0 && mpfr_cmp_ui_2exp (z, 3, -1) == 0);
338 1.1 mrg }
339 1.1 mrg
340 1.1 mrg /* corner case rw = 0 in rounding to nearest */
341 1.1 mrg mpfr_set_prec (z, GMP_NUMB_BITS - 1);
342 1.1 mrg mpfr_set_prec (y, GMP_NUMB_BITS - 1);
343 1.1 mrg mpfr_set_ui (y, 1, MPFR_RNDN);
344 1.1 mrg mpfr_mul_2exp (y, y, GMP_NUMB_BITS - 1, MPFR_RNDN);
345 1.1 mrg mpfr_nextabove (y);
346 1.1 mrg for (p = 2 * GMP_NUMB_BITS - 1; p <= 1000; p++)
347 1.1 mrg {
348 1.1 mrg mpfr_set_prec (x, p);
349 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
350 1.1 mrg mpfr_set_exp (x, GMP_NUMB_BITS);
351 1.1 mrg mpfr_add_ui (x, x, 1, MPFR_RNDN);
352 1.1 mrg /* now x = 2^(GMP_NUMB_BITS - 1) + 1 (GMP_NUMB_BITS bits) */
353 1.1.1.4 mrg inexact = mpfr_mul (x, x, x, MPFR_RNDN);
354 1.1.1.4 mrg MPFR_ASSERTN (inexact == 0); /* exact */
355 1.1 mrg inexact = test_sqrt (z, x, MPFR_RNDN);
356 1.1 mrg /* even rule: z should be 2^(GMP_NUMB_BITS - 1) */
357 1.1 mrg MPFR_ASSERTN (inexact < 0);
358 1.1.1.4 mrg inexact = mpfr_cmp_ui_2exp (z, 1, GMP_NUMB_BITS - 1);
359 1.1.1.4 mrg MPFR_ASSERTN (inexact == 0);
360 1.1 mrg mpfr_nextbelow (x);
361 1.1 mrg /* now x is just below [2^(GMP_NUMB_BITS - 1) + 1]^2 */
362 1.1 mrg inexact = test_sqrt (z, x, MPFR_RNDN);
363 1.1 mrg MPFR_ASSERTN(inexact < 0 &&
364 1.1 mrg mpfr_cmp_ui_2exp (z, 1, GMP_NUMB_BITS - 1) == 0);
365 1.1 mrg mpfr_nextabove (x);
366 1.1 mrg mpfr_nextabove (x);
367 1.1 mrg /* now x is just above [2^(GMP_NUMB_BITS - 1) + 1]^2 */
368 1.1 mrg inexact = test_sqrt (z, x, MPFR_RNDN);
369 1.1 mrg if (mpfr_cmp (z, y))
370 1.1 mrg {
371 1.1 mrg printf ("Error for sqrt(x) in rounding to nearest\n");
372 1.1 mrg printf ("x="); mpfr_dump (x);
373 1.1 mrg printf ("Expected "); mpfr_dump (y);
374 1.1 mrg printf ("Got "); mpfr_dump (z);
375 1.1 mrg exit (1);
376 1.1 mrg }
377 1.1 mrg if (inexact <= 0)
378 1.1 mrg {
379 1.1 mrg printf ("Wrong inexact flag in corner case for p = %lu\n", (unsigned long) p);
380 1.1 mrg exit (1);
381 1.1 mrg }
382 1.1 mrg }
383 1.1 mrg
384 1.1 mrg mpfr_set_prec (x, 1000);
385 1.1 mrg mpfr_set_ui (x, 9, MPFR_RNDN);
386 1.1 mrg mpfr_set_prec (y, 10);
387 1.1 mrg inexact = test_sqrt (y, x, MPFR_RNDN);
388 1.1 mrg if (mpfr_cmp_ui (y, 3) || inexact != 0)
389 1.1 mrg {
390 1.1 mrg printf ("Error in sqrt(9:1000) for prec=10\n");
391 1.1 mrg exit (1);
392 1.1 mrg }
393 1.1 mrg mpfr_set_prec (y, GMP_NUMB_BITS);
394 1.1 mrg mpfr_nextabove (x);
395 1.1 mrg inexact = test_sqrt (y, x, MPFR_RNDN);
396 1.1 mrg if (mpfr_cmp_ui (y, 3) || inexact >= 0)
397 1.1 mrg {
398 1.1 mrg printf ("Error in sqrt(9:1000) for prec=%d\n", (int) GMP_NUMB_BITS);
399 1.1 mrg exit (1);
400 1.1 mrg }
401 1.1 mrg mpfr_set_prec (x, 2 * GMP_NUMB_BITS);
402 1.1 mrg mpfr_set_prec (y, GMP_NUMB_BITS);
403 1.1 mrg mpfr_set_ui (y, 1, MPFR_RNDN);
404 1.1 mrg mpfr_nextabove (y);
405 1.1 mrg mpfr_set (x, y, MPFR_RNDN);
406 1.1 mrg inexact = test_sqrt (y, x, MPFR_RNDN);
407 1.1 mrg if (mpfr_cmp_ui (y, 1) || inexact >= 0)
408 1.1 mrg {
409 1.1 mrg printf ("Error in sqrt(1) for prec=%d\n", (int) GMP_NUMB_BITS);
410 1.1 mrg mpfr_dump (y);
411 1.1 mrg exit (1);
412 1.1 mrg }
413 1.1 mrg
414 1.1 mrg mpfr_clear (x);
415 1.1 mrg mpfr_clear (y);
416 1.1 mrg mpfr_clear (z);
417 1.1 mrg }
418 1.1 mrg
419 1.1 mrg static void
420 1.1 mrg check_inexact (mpfr_prec_t p)
421 1.1 mrg {
422 1.1 mrg mpfr_t x, y, z;
423 1.1 mrg mpfr_rnd_t rnd;
424 1.1 mrg int inexact, sign;
425 1.1 mrg
426 1.1 mrg mpfr_init2 (x, p);
427 1.1 mrg mpfr_init2 (y, p);
428 1.1 mrg mpfr_init2 (z, 2*p);
429 1.1 mrg mpfr_urandomb (x, RANDS);
430 1.1.1.4 mrg rnd = RND_RAND_NO_RNDF ();
431 1.1 mrg inexact = test_sqrt (y, x, rnd);
432 1.1 mrg if (mpfr_mul (z, y, y, rnd)) /* exact since prec(z) = 2*prec(y) */
433 1.1 mrg {
434 1.1 mrg printf ("Error: multiplication should be exact\n");
435 1.1 mrg exit (1);
436 1.1 mrg }
437 1.1 mrg mpfr_sub (z, z, x, rnd); /* exact also */
438 1.1 mrg sign = mpfr_cmp_ui (z, 0);
439 1.1 mrg if (((inexact == 0) && (sign)) ||
440 1.1 mrg ((inexact > 0) && (sign <= 0)) ||
441 1.1 mrg ((inexact < 0) && (sign >= 0)))
442 1.1 mrg {
443 1.1.1.4 mrg printf ("Error with rnd=%s: wrong ternary value, expected %d, got %d\n",
444 1.1.1.4 mrg mpfr_print_rnd_mode (rnd), sign, inexact);
445 1.1 mrg printf ("x=");
446 1.1.1.4 mrg mpfr_dump (x);
447 1.1.1.4 mrg printf ("y=");
448 1.1.1.4 mrg mpfr_dump (y);
449 1.1 mrg exit (1);
450 1.1 mrg }
451 1.1 mrg mpfr_clear (x);
452 1.1 mrg mpfr_clear (y);
453 1.1 mrg mpfr_clear (z);
454 1.1 mrg }
455 1.1 mrg
456 1.1 mrg static void
457 1.1.1.2 mrg check_singular (void)
458 1.1 mrg {
459 1.1 mrg mpfr_t x, got;
460 1.1 mrg
461 1.1 mrg mpfr_init2 (x, 100L);
462 1.1 mrg mpfr_init2 (got, 100L);
463 1.1 mrg
464 1.1 mrg /* sqrt(NaN) == NaN */
465 1.1 mrg MPFR_SET_NAN (x);
466 1.1 mrg MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
467 1.1 mrg MPFR_ASSERTN (mpfr_nan_p (got));
468 1.1 mrg
469 1.1 mrg /* sqrt(-1) == NaN */
470 1.1 mrg mpfr_set_si (x, -1L, MPFR_RNDZ);
471 1.1 mrg MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
472 1.1 mrg MPFR_ASSERTN (mpfr_nan_p (got));
473 1.1 mrg
474 1.1 mrg /* sqrt(+inf) == +inf */
475 1.1 mrg MPFR_SET_INF (x);
476 1.1 mrg MPFR_SET_POS (x);
477 1.1 mrg MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
478 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (got));
479 1.1 mrg
480 1.1 mrg /* sqrt(-inf) == NaN */
481 1.1 mrg MPFR_SET_INF (x);
482 1.1 mrg MPFR_SET_NEG (x);
483 1.1 mrg MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
484 1.1 mrg MPFR_ASSERTN (mpfr_nan_p (got));
485 1.1 mrg
486 1.1.1.2 mrg /* sqrt(+0) == +0 */
487 1.1.1.2 mrg mpfr_set_si (x, 0L, MPFR_RNDZ);
488 1.1.1.2 mrg MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
489 1.1.1.2 mrg MPFR_ASSERTN (mpfr_number_p (got));
490 1.1.1.2 mrg MPFR_ASSERTN (mpfr_cmp_ui (got, 0L) == 0);
491 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_POS (got));
492 1.1.1.2 mrg
493 1.1.1.2 mrg /* sqrt(-0) == -0 */
494 1.1 mrg mpfr_set_si (x, 0L, MPFR_RNDZ);
495 1.1 mrg MPFR_SET_NEG (x);
496 1.1 mrg MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
497 1.1 mrg MPFR_ASSERTN (mpfr_number_p (got));
498 1.1 mrg MPFR_ASSERTN (mpfr_cmp_ui (got, 0L) == 0);
499 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_NEG (got));
500 1.1 mrg
501 1.1 mrg mpfr_clear (x);
502 1.1 mrg mpfr_clear (got);
503 1.1 mrg }
504 1.1 mrg
505 1.1 mrg /* check that -1 <= x/sqrt(x^2+s*y^2) <= 1 for rounding to nearest or up
506 1.1 mrg with s = 0 and s = 1 */
507 1.1 mrg static void
508 1.1 mrg test_property1 (mpfr_prec_t p, mpfr_rnd_t r, int s)
509 1.1 mrg {
510 1.1 mrg mpfr_t x, y, z, t;
511 1.1 mrg
512 1.1 mrg mpfr_init2 (x, p);
513 1.1 mrg mpfr_init2 (y, p);
514 1.1 mrg mpfr_init2 (z, p);
515 1.1 mrg mpfr_init2 (t, p);
516 1.1 mrg
517 1.1 mrg mpfr_urandomb (x, RANDS);
518 1.1 mrg mpfr_mul (z, x, x, r);
519 1.1 mrg if (s)
520 1.1 mrg {
521 1.1 mrg mpfr_urandomb (y, RANDS);
522 1.1 mrg mpfr_mul (t, y, y, r);
523 1.1 mrg mpfr_add (z, z, t, r);
524 1.1 mrg }
525 1.1 mrg mpfr_sqrt (z, z, r);
526 1.1 mrg mpfr_div (z, x, z, r);
527 1.1 mrg /* Note: if both x and y are 0, z is NAN, but the test below will
528 1.1 mrg be false. So, everything is fine. */
529 1.1 mrg if (mpfr_cmp_si (z, -1) < 0 || mpfr_cmp_ui (z, 1) > 0)
530 1.1 mrg {
531 1.1 mrg printf ("Error, -1 <= x/sqrt(x^2+y^2) <= 1 does not hold for r=%s\n",
532 1.1 mrg mpfr_print_rnd_mode (r));
533 1.1 mrg printf ("x="); mpfr_dump (x);
534 1.1 mrg printf ("y="); mpfr_dump (y);
535 1.1 mrg printf ("got "); mpfr_dump (z);
536 1.1 mrg exit (1);
537 1.1 mrg }
538 1.1 mrg
539 1.1 mrg mpfr_clear (x);
540 1.1 mrg mpfr_clear (y);
541 1.1 mrg mpfr_clear (z);
542 1.1 mrg mpfr_clear (t);
543 1.1 mrg }
544 1.1 mrg
545 1.1 mrg /* check sqrt(x^2) = x */
546 1.1 mrg static void
547 1.1 mrg test_property2 (mpfr_prec_t p, mpfr_rnd_t r)
548 1.1 mrg {
549 1.1 mrg mpfr_t x, y;
550 1.1 mrg
551 1.1 mrg mpfr_init2 (x, p);
552 1.1 mrg mpfr_init2 (y, p);
553 1.1 mrg
554 1.1 mrg mpfr_urandomb (x, RANDS);
555 1.1 mrg mpfr_mul (y, x, x, r);
556 1.1 mrg mpfr_sqrt (y, y, r);
557 1.1 mrg if (mpfr_cmp (y, x))
558 1.1 mrg {
559 1.1 mrg printf ("Error, sqrt(x^2) = x does not hold for r=%s\n",
560 1.1 mrg mpfr_print_rnd_mode (r));
561 1.1 mrg printf ("x="); mpfr_dump (x);
562 1.1 mrg printf ("got "); mpfr_dump (y);
563 1.1 mrg exit (1);
564 1.1 mrg }
565 1.1 mrg
566 1.1 mrg mpfr_clear (x);
567 1.1 mrg mpfr_clear (y);
568 1.1 mrg }
569 1.1 mrg
570 1.1.1.3 mrg /* Bug reported by Fredrik Johansson, occurring when:
571 1.1.1.3 mrg - the precision of the result is a multiple of the number of bits
572 1.1.1.3 mrg per word (GMP_NUMB_BITS),
573 1.1.1.3 mrg - the rounding mode is to nearest (MPFR_RNDN),
574 1.1.1.3 mrg - internally, the result has to be rounded up to a power of 2.
575 1.1.1.3 mrg */
576 1.1.1.3 mrg static void
577 1.1.1.3 mrg bug20160120 (void)
578 1.1.1.3 mrg {
579 1.1.1.3 mrg mpfr_t x, y;
580 1.1.1.3 mrg
581 1.1.1.3 mrg mpfr_init2 (x, 4 * GMP_NUMB_BITS);
582 1.1.1.3 mrg mpfr_init2 (y, GMP_NUMB_BITS);
583 1.1.1.3 mrg
584 1.1.1.3 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
585 1.1.1.3 mrg mpfr_nextbelow (x);
586 1.1.1.3 mrg mpfr_sqrt (y, x, MPFR_RNDN);
587 1.1.1.3 mrg MPFR_ASSERTN(mpfr_check (y));
588 1.1.1.3 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0);
589 1.1.1.3 mrg
590 1.1.1.3 mrg mpfr_set_prec (y, 2 * GMP_NUMB_BITS);
591 1.1.1.3 mrg mpfr_sqrt (y, x, MPFR_RNDN);
592 1.1.1.3 mrg MPFR_ASSERTN(mpfr_check (y));
593 1.1.1.3 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0);
594 1.1.1.3 mrg
595 1.1.1.3 mrg mpfr_clear(x);
596 1.1.1.3 mrg mpfr_clear(y);
597 1.1.1.3 mrg }
598 1.1.1.3 mrg
599 1.1.1.4 mrg /* Bug in mpfr_sqrt2 when prec(u) = 2*GMP_NUMB_BITS and the exponent of u is
600 1.1.1.4 mrg odd: the last bit of u is lost. */
601 1.1.1.4 mrg static void
602 1.1.1.4 mrg bug20160908 (void)
603 1.1.1.4 mrg {
604 1.1.1.4 mrg mpfr_t r, u;
605 1.1.1.4 mrg int n = GMP_NUMB_BITS, ret;
606 1.1.1.4 mrg
607 1.1.1.4 mrg mpfr_init2 (r, 2*n - 1);
608 1.1.1.4 mrg mpfr_init2 (u, 2 * n);
609 1.1.1.4 mrg mpfr_set_ui_2exp (u, 1, 2*n-2, MPFR_RNDN); /* u=2^(2n-2) with exp(u)=2n-1 */
610 1.1.1.4 mrg mpfr_nextabove (u);
611 1.1.1.4 mrg /* now u = 2^(2n-2) + 1/2 */
612 1.1.1.4 mrg ret = mpfr_sqrt (r, u, MPFR_RNDZ);
613 1.1.1.4 mrg MPFR_ASSERTN(ret == -1 && mpfr_cmp_ui_2exp (r, 1, n-1) == 0);
614 1.1.1.4 mrg mpfr_clear (r);
615 1.1.1.4 mrg mpfr_clear (u);
616 1.1.1.4 mrg }
617 1.1.1.4 mrg
618 1.1.1.4 mrg static void
619 1.1.1.4 mrg testall_rndf (mpfr_prec_t pmax)
620 1.1.1.4 mrg {
621 1.1.1.4 mrg mpfr_t a, b, d;
622 1.1.1.4 mrg mpfr_prec_t pa, pb;
623 1.1.1.4 mrg
624 1.1.1.4 mrg for (pa = MPFR_PREC_MIN; pa <= pmax; pa++)
625 1.1.1.4 mrg {
626 1.1.1.4 mrg mpfr_init2 (a, pa);
627 1.1.1.4 mrg mpfr_init2 (d, pa);
628 1.1.1.4 mrg for (pb = MPFR_PREC_MIN; pb <= pmax; pb++)
629 1.1.1.4 mrg {
630 1.1.1.4 mrg mpfr_init2 (b, pb);
631 1.1.1.4 mrg mpfr_set_ui (b, 1, MPFR_RNDN);
632 1.1.1.4 mrg while (mpfr_cmp_ui (b, 4) < 0)
633 1.1.1.4 mrg {
634 1.1.1.4 mrg mpfr_sqrt (a, b, MPFR_RNDF);
635 1.1.1.4 mrg mpfr_sqrt (d, b, MPFR_RNDD);
636 1.1.1.4 mrg if (!mpfr_equal_p (a, d))
637 1.1.1.4 mrg {
638 1.1.1.4 mrg mpfr_sqrt (d, b, MPFR_RNDU);
639 1.1.1.4 mrg if (!mpfr_equal_p (a, d))
640 1.1.1.4 mrg {
641 1.1.1.4 mrg printf ("Error: mpfr_sqrt(a,b,RNDF) does not "
642 1.1.1.4 mrg "match RNDD/RNDU\n");
643 1.1.1.4 mrg printf ("b="); mpfr_dump (b);
644 1.1.1.4 mrg printf ("a="); mpfr_dump (a);
645 1.1.1.4 mrg exit (1);
646 1.1.1.4 mrg }
647 1.1.1.4 mrg }
648 1.1.1.4 mrg mpfr_nextabove (b);
649 1.1.1.4 mrg }
650 1.1.1.4 mrg mpfr_clear (b);
651 1.1.1.4 mrg }
652 1.1.1.4 mrg mpfr_clear (a);
653 1.1.1.4 mrg mpfr_clear (d);
654 1.1.1.4 mrg }
655 1.1.1.4 mrg }
656 1.1.1.4 mrg
657 1.1.1.4 mrg /* test the case prec = GMP_NUMB_BITS */
658 1.1.1.4 mrg static void
659 1.1.1.4 mrg test_sqrt1n (void)
660 1.1.1.4 mrg {
661 1.1.1.4 mrg mpfr_t r, u;
662 1.1.1.4 mrg int inex;
663 1.1.1.4 mrg
664 1.1.1.4 mrg mpfr_init2 (r, GMP_NUMB_BITS);
665 1.1.1.4 mrg mpfr_init2 (u, GMP_NUMB_BITS);
666 1.1.1.4 mrg
667 1.1.1.4 mrg inex = mpfr_set_ui_2exp (u, 17 * 17, 2 * GMP_NUMB_BITS - 10, MPFR_RNDN);
668 1.1.1.4 mrg MPFR_ASSERTN(inex == 0);
669 1.1.1.4 mrg inex = mpfr_sqrt (r, u, MPFR_RNDN);
670 1.1.1.4 mrg MPFR_ASSERTN(inex == 0);
671 1.1.1.4 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (r, 17, GMP_NUMB_BITS - 5) == 0);
672 1.1.1.4 mrg
673 1.1.1.4 mrg inex = mpfr_set_ui_2exp (u, 1, GMP_NUMB_BITS - 2, MPFR_RNDN);
674 1.1.1.4 mrg MPFR_ASSERTN(inex == 0);
675 1.1.1.4 mrg inex = mpfr_add_ui (u, u, 1, MPFR_RNDN);
676 1.1.1.4 mrg MPFR_ASSERTN(inex == 0);
677 1.1.1.4 mrg inex = mpfr_mul_2exp (u, u, GMP_NUMB_BITS, MPFR_RNDN);
678 1.1.1.4 mrg MPFR_ASSERTN(inex == 0);
679 1.1.1.4 mrg /* u = 2^(2*GMP_NUMB_BITS-2) + 2^GMP_NUMB_BITS, thus
680 1.1.1.4 mrg u = r^2 + 2^GMP_NUMB_BITS with r = 2^(GMP_NUMB_BITS-1).
681 1.1.1.4 mrg Should round to r+1 to nearest. */
682 1.1.1.4 mrg inex = mpfr_sqrt (r, u, MPFR_RNDN);
683 1.1.1.4 mrg MPFR_ASSERTN(inex > 0);
684 1.1.1.4 mrg inex = mpfr_sub_ui (r, r, 1, MPFR_RNDN);
685 1.1.1.4 mrg MPFR_ASSERTN(inex == 0);
686 1.1.1.4 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (r, 1, GMP_NUMB_BITS - 1) == 0);
687 1.1.1.4 mrg
688 1.1.1.4 mrg mpfr_clear (r);
689 1.1.1.4 mrg mpfr_clear (u);
690 1.1.1.4 mrg }
691 1.1.1.4 mrg
692 1.1 mrg #define TEST_FUNCTION test_sqrt
693 1.1 mrg #define TEST_RANDOM_POS 8
694 1.1 mrg #include "tgeneric.c"
695 1.1 mrg
696 1.1 mrg int
697 1.1 mrg main (void)
698 1.1 mrg {
699 1.1 mrg mpfr_prec_t p;
700 1.1 mrg int k;
701 1.1 mrg
702 1.1 mrg tests_start_mpfr ();
703 1.1 mrg
704 1.1.1.4 mrg testall_rndf (16);
705 1.1 mrg for (p = MPFR_PREC_MIN; p <= 128; p++)
706 1.1 mrg {
707 1.1 mrg test_property1 (p, MPFR_RNDN, 0);
708 1.1 mrg test_property1 (p, MPFR_RNDU, 0);
709 1.1 mrg test_property1 (p, MPFR_RNDA, 0);
710 1.1 mrg test_property1 (p, MPFR_RNDN, 1);
711 1.1 mrg test_property1 (p, MPFR_RNDU, 1);
712 1.1 mrg test_property1 (p, MPFR_RNDA, 1);
713 1.1 mrg test_property2 (p, MPFR_RNDN);
714 1.1 mrg }
715 1.1 mrg
716 1.1 mrg check_diverse ("635030154261163106768013773815762607450069292760790610550915652722277604820131530404842415587328", 160, "796887792767063979679855997149887366668464780637");
717 1.1 mrg special ();
718 1.1.1.2 mrg check_singular ();
719 1.1 mrg
720 1.1 mrg for (p=2; p<200; p++)
721 1.1 mrg for (k=0; k<200; k++)
722 1.1 mrg check_inexact (p);
723 1.1 mrg check_float();
724 1.1 mrg
725 1.1 mrg check3 ("-0.0", MPFR_RNDN, "0.0");
726 1.1 mrg check4 ("6.37983013646045901440e+32", MPFR_RNDN, "5.9bc5036d09e0c@13");
727 1.1 mrg check4 ("1.0", MPFR_RNDN, "1");
728 1.1 mrg check4 ("1.0", MPFR_RNDZ, "1");
729 1.1 mrg check4 ("3.725290298461914062500000e-9", MPFR_RNDN, "4@-4");
730 1.1 mrg check4 ("3.725290298461914062500000e-9", MPFR_RNDZ, "4@-4");
731 1.1 mrg check4 ("1190456976439861.0", MPFR_RNDZ, "2.0e7957873529a@6");
732 1.1 mrg check4 ("1219027943874417664.0", MPFR_RNDZ, "4.1cf2af0e6a534@7");
733 1.1 mrg /* the following examples are bugs in Cygnus compiler/system, found by
734 1.1 mrg Fabrice Rouillier while porting mpfr to Windows */
735 1.1 mrg check4 ("9.89438396044940256501e-134", MPFR_RNDU, "8.7af7bf0ebbee@-56");
736 1.1 mrg check4 ("7.86528588050363751914e+31", MPFR_RNDZ, "1.f81fc40f32062@13");
737 1.1 mrg check4 ("0.99999999999999988897", MPFR_RNDN, "f.ffffffffffff8@-1");
738 1.1 mrg check4 ("1.00000000000000022204", MPFR_RNDN, "1");
739 1.1 mrg /* the following examples come from the paper "Number-theoretic Test
740 1.1 mrg Generation for Directed Rounding" from Michael Parks, Table 4 */
741 1.1 mrg
742 1.1 mrg check4 ("78652858805036375191418371571712.0", MPFR_RNDN,
743 1.1 mrg "1.f81fc40f32063@13");
744 1.1 mrg check4 ("38510074998589467860312736661504.0", MPFR_RNDN,
745 1.1 mrg "1.60c012a92fc65@13");
746 1.1 mrg check4 ("35318779685413012908190921129984.0", MPFR_RNDN,
747 1.1 mrg "1.51d17526c7161@13");
748 1.1 mrg check4 ("26729022595358440976973142425600.0", MPFR_RNDN,
749 1.1 mrg "1.25e19302f7e51@13");
750 1.1 mrg check4 ("22696567866564242819241453027328.0", MPFR_RNDN,
751 1.1 mrg "1.0ecea7dd2ec3d@13");
752 1.1 mrg check4 ("22696888073761729132924856434688.0", MPFR_RNDN,
753 1.1 mrg "1.0ecf250e8e921@13");
754 1.1 mrg check4 ("36055652513981905145251657416704.0", MPFR_RNDN,
755 1.1 mrg "1.5552f3eedcf33@13");
756 1.1 mrg check4 ("30189856268896404997497182748672.0", MPFR_RNDN,
757 1.1 mrg "1.3853ee10c9c99@13");
758 1.1 mrg check4 ("36075288240584711210898775080960.0", MPFR_RNDN,
759 1.1 mrg "1.556abe212b56f@13");
760 1.1 mrg check4 ("72154663483843080704304789585920.0", MPFR_RNDN,
761 1.1 mrg "1.e2d9a51977e6e@13");
762 1.1 mrg
763 1.1 mrg check4 ("78652858805036375191418371571712.0", MPFR_RNDZ,
764 1.1 mrg "1.f81fc40f32062@13");
765 1.1 mrg check4 ("38510074998589467860312736661504.0", MPFR_RNDZ,
766 1.1 mrg "1.60c012a92fc64@13");
767 1.1 mrg check4 ("35318779685413012908190921129984.0", MPFR_RNDZ, "1.51d17526c716@13");
768 1.1 mrg check4 ("26729022595358440976973142425600.0", MPFR_RNDZ, "1.25e19302f7e5@13");
769 1.1 mrg check4 ("22696567866564242819241453027328.0", MPFR_RNDZ,
770 1.1 mrg "1.0ecea7dd2ec3c@13");
771 1.1 mrg check4 ("22696888073761729132924856434688.0", MPFR_RNDZ, "1.0ecf250e8e92@13");
772 1.1 mrg check4 ("36055652513981905145251657416704.0", MPFR_RNDZ,
773 1.1 mrg "1.5552f3eedcf32@13");
774 1.1 mrg check4 ("30189856268896404997497182748672.0", MPFR_RNDZ,
775 1.1 mrg "1.3853ee10c9c98@13");
776 1.1 mrg check4 ("36075288240584711210898775080960.0", MPFR_RNDZ,
777 1.1 mrg "1.556abe212b56e@13");
778 1.1 mrg check4 ("72154663483843080704304789585920.0", MPFR_RNDZ,
779 1.1 mrg "1.e2d9a51977e6d@13");
780 1.1 mrg
781 1.1 mrg check4 ("78652858805036375191418371571712.0", MPFR_RNDU,
782 1.1 mrg "1.f81fc40f32063@13");
783 1.1 mrg check4 ("38510074998589467860312736661504.0", MPFR_RNDU,
784 1.1 mrg "1.60c012a92fc65@13");
785 1.1 mrg check4 ("35318779685413012908190921129984.0", MPFR_RNDU,
786 1.1 mrg "1.51d17526c7161@13");
787 1.1 mrg check4 ("26729022595358440976973142425600.0", MPFR_RNDU,
788 1.1 mrg "1.25e19302f7e51@13");
789 1.1 mrg check4 ("22696567866564242819241453027328.0", MPFR_RNDU,
790 1.1 mrg "1.0ecea7dd2ec3d@13");
791 1.1 mrg check4 ("22696888073761729132924856434688.0", MPFR_RNDU,
792 1.1 mrg "1.0ecf250e8e921@13");
793 1.1 mrg check4 ("36055652513981905145251657416704.0", MPFR_RNDU,
794 1.1 mrg "1.5552f3eedcf33@13");
795 1.1 mrg check4 ("30189856268896404997497182748672.0", MPFR_RNDU,
796 1.1 mrg "1.3853ee10c9c99@13");
797 1.1 mrg check4 ("36075288240584711210898775080960.0", MPFR_RNDU,
798 1.1 mrg "1.556abe212b56f@13");
799 1.1 mrg check4 ("72154663483843080704304789585920.0", MPFR_RNDU,
800 1.1 mrg "1.e2d9a51977e6e@13");
801 1.1 mrg
802 1.1 mrg check4 ("78652858805036375191418371571712.0", MPFR_RNDD,
803 1.1 mrg "1.f81fc40f32062@13");
804 1.1 mrg check4 ("38510074998589467860312736661504.0", MPFR_RNDD,
805 1.1 mrg "1.60c012a92fc64@13");
806 1.1 mrg check4 ("35318779685413012908190921129984.0", MPFR_RNDD, "1.51d17526c716@13");
807 1.1 mrg check4 ("26729022595358440976973142425600.0", MPFR_RNDD, "1.25e19302f7e5@13");
808 1.1 mrg check4 ("22696567866564242819241453027328.0", MPFR_RNDD,
809 1.1 mrg "1.0ecea7dd2ec3c@13");
810 1.1 mrg check4 ("22696888073761729132924856434688.0", MPFR_RNDD, "1.0ecf250e8e92@13");
811 1.1 mrg check4 ("36055652513981905145251657416704.0", MPFR_RNDD,
812 1.1 mrg "1.5552f3eedcf32@13");
813 1.1 mrg check4 ("30189856268896404997497182748672.0", MPFR_RNDD,
814 1.1 mrg "1.3853ee10c9c98@13");
815 1.1 mrg check4 ("36075288240584711210898775080960.0", MPFR_RNDD,
816 1.1 mrg "1.556abe212b56e@13");
817 1.1 mrg check4 ("72154663483843080704304789585920.0", MPFR_RNDD,
818 1.1 mrg "1.e2d9a51977e6d@13");
819 1.1 mrg
820 1.1 mrg /* check that rounding away is just rounding toward plus infinity */
821 1.1 mrg check4 ("72154663483843080704304789585920.0", MPFR_RNDA,
822 1.1 mrg "1.e2d9a51977e6e@13");
823 1.1 mrg
824 1.1.1.4 mrg test_generic (MPFR_PREC_MIN, 300, 15);
825 1.1 mrg data_check ("data/sqrt", mpfr_sqrt, "mpfr_sqrt");
826 1.1 mrg bad_cases (mpfr_sqrt, mpfr_sqr, "mpfr_sqrt", 8, -256, 255, 4, 128, 800, 50);
827 1.1 mrg
828 1.1.1.3 mrg bug20160120 ();
829 1.1.1.4 mrg bug20160908 ();
830 1.1.1.4 mrg test_sqrt1n ();
831 1.1.1.3 mrg
832 1.1 mrg tests_end_mpfr ();
833 1.1 mrg return 0;
834 1.1 mrg }
835