tdiv.c revision 1.1.1.5 1 1.1.1.2 mrg /* Test file for mpfr_div (and some mpfr_div_ui, etc. tests).
2 1.1 mrg
3 1.1.1.5 mrg Copyright 1999, 2001-2020 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.1.5 mrg https://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.1.2 mrg static void
26 1.1.1.5 mrg check_equal (mpfr_srcptr a, mpfr_srcptr a2, const char *s,
27 1.1.1.2 mrg mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r)
28 1.1.1.2 mrg {
29 1.1.1.4 mrg if (SAME_VAL (a, a2))
30 1.1.1.4 mrg return;
31 1.1.1.4 mrg if (r == MPFR_RNDF) /* RNDF might return different values */
32 1.1.1.2 mrg return;
33 1.1.1.2 mrg printf ("Error in %s\n", mpfr_print_rnd_mode (r));
34 1.1.1.2 mrg printf ("b = ");
35 1.1.1.2 mrg mpfr_dump (b);
36 1.1.1.2 mrg printf ("c = ");
37 1.1.1.2 mrg mpfr_dump (c);
38 1.1.1.2 mrg printf ("mpfr_div result: ");
39 1.1.1.2 mrg mpfr_dump (a);
40 1.1.1.2 mrg printf ("%s result: ", s);
41 1.1.1.2 mrg mpfr_dump (a2);
42 1.1.1.2 mrg exit (1);
43 1.1.1.2 mrg }
44 1.1.1.2 mrg
45 1.1.1.2 mrg static int
46 1.1.1.2 mrg mpfr_all_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r)
47 1.1.1.2 mrg {
48 1.1.1.2 mrg mpfr_t a2;
49 1.1.1.2 mrg unsigned int oldflags, newflags;
50 1.1.1.2 mrg int inex, inex2;
51 1.1.1.2 mrg
52 1.1.1.2 mrg oldflags = __gmpfr_flags;
53 1.1.1.2 mrg inex = mpfr_div (a, b, c, r);
54 1.1.1.2 mrg
55 1.1.1.4 mrg /* this test makes no sense for RNDF, since it compares the ternary value
56 1.1.1.4 mrg and the flags */
57 1.1.1.4 mrg if (a == b || a == c || r == MPFR_RNDF)
58 1.1.1.2 mrg return inex;
59 1.1.1.2 mrg
60 1.1.1.2 mrg newflags = __gmpfr_flags;
61 1.1.1.2 mrg
62 1.1.1.2 mrg mpfr_init2 (a2, MPFR_PREC (a));
63 1.1.1.2 mrg
64 1.1.1.2 mrg if (mpfr_integer_p (b) && ! (MPFR_IS_ZERO (b) && MPFR_IS_NEG (b)))
65 1.1.1.2 mrg {
66 1.1.1.2 mrg /* b is an integer, but not -0 (-0 is rejected as
67 1.1.1.2 mrg it becomes +0 when converted to an integer). */
68 1.1.1.2 mrg if (mpfr_fits_ulong_p (b, MPFR_RNDA))
69 1.1.1.2 mrg {
70 1.1.1.2 mrg __gmpfr_flags = oldflags;
71 1.1.1.2 mrg inex2 = mpfr_ui_div (a2, mpfr_get_ui (b, MPFR_RNDN), c, r);
72 1.1.1.5 mrg if (!SAME_SIGN (inex2, inex))
73 1.1.1.5 mrg {
74 1.1.1.5 mrg printf ("Error for ternary value (rnd=%s), mpfr_div %d, mpfr_ui_div %d\n",
75 1.1.1.5 mrg mpfr_print_rnd_mode (r), inex, inex2);
76 1.1.1.5 mrg exit (1);
77 1.1.1.5 mrg }
78 1.1.1.5 mrg if (__gmpfr_flags != newflags)
79 1.1.1.5 mrg {
80 1.1.1.5 mrg printf ("Error for flags, mpfr_div %d, mpfr_ui_div %d\n",
81 1.1.1.5 mrg newflags, __gmpfr_flags);
82 1.1.1.5 mrg exit (1);
83 1.1.1.5 mrg }
84 1.1.1.2 mrg check_equal (a, a2, "mpfr_ui_div", b, c, r);
85 1.1.1.2 mrg }
86 1.1.1.2 mrg if (mpfr_fits_slong_p (b, MPFR_RNDA))
87 1.1.1.2 mrg {
88 1.1.1.2 mrg __gmpfr_flags = oldflags;
89 1.1.1.2 mrg inex2 = mpfr_si_div (a2, mpfr_get_si (b, MPFR_RNDN), c, r);
90 1.1.1.2 mrg MPFR_ASSERTN (SAME_SIGN (inex2, inex));
91 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == newflags);
92 1.1.1.2 mrg check_equal (a, a2, "mpfr_si_div", b, c, r);
93 1.1.1.2 mrg }
94 1.1.1.2 mrg }
95 1.1.1.2 mrg
96 1.1.1.2 mrg if (mpfr_integer_p (c) && ! (MPFR_IS_ZERO (c) && MPFR_IS_NEG (c)))
97 1.1.1.2 mrg {
98 1.1.1.2 mrg /* c is an integer, but not -0 (-0 is rejected as
99 1.1.1.2 mrg it becomes +0 when converted to an integer). */
100 1.1.1.2 mrg if (mpfr_fits_ulong_p (c, MPFR_RNDA))
101 1.1.1.2 mrg {
102 1.1.1.2 mrg __gmpfr_flags = oldflags;
103 1.1.1.2 mrg inex2 = mpfr_div_ui (a2, b, mpfr_get_ui (c, MPFR_RNDN), r);
104 1.1.1.2 mrg MPFR_ASSERTN (SAME_SIGN (inex2, inex));
105 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == newflags);
106 1.1.1.2 mrg check_equal (a, a2, "mpfr_div_ui", b, c, r);
107 1.1.1.2 mrg }
108 1.1.1.2 mrg if (mpfr_fits_slong_p (c, MPFR_RNDA))
109 1.1.1.2 mrg {
110 1.1.1.2 mrg __gmpfr_flags = oldflags;
111 1.1.1.2 mrg inex2 = mpfr_div_si (a2, b, mpfr_get_si (c, MPFR_RNDN), r);
112 1.1.1.2 mrg MPFR_ASSERTN (SAME_SIGN (inex2, inex));
113 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == newflags);
114 1.1.1.2 mrg check_equal (a, a2, "mpfr_div_si", b, c, r);
115 1.1.1.2 mrg }
116 1.1.1.2 mrg }
117 1.1.1.2 mrg
118 1.1.1.2 mrg mpfr_clear (a2);
119 1.1.1.2 mrg
120 1.1.1.2 mrg return inex;
121 1.1.1.2 mrg }
122 1.1.1.2 mrg
123 1.1 mrg #ifdef CHECK_EXTERNAL
124 1.1 mrg static int
125 1.1 mrg test_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode)
126 1.1 mrg {
127 1.1 mrg int res;
128 1.1 mrg int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b) && mpfr_number_p (c);
129 1.1 mrg if (ok)
130 1.1 mrg {
131 1.1 mrg mpfr_print_raw (b);
132 1.1 mrg printf (" ");
133 1.1 mrg mpfr_print_raw (c);
134 1.1 mrg }
135 1.1.1.2 mrg res = mpfr_all_div (a, b, c, rnd_mode);
136 1.1 mrg if (ok)
137 1.1 mrg {
138 1.1 mrg printf (" ");
139 1.1 mrg mpfr_print_raw (a);
140 1.1 mrg printf ("\n");
141 1.1 mrg }
142 1.1 mrg return res;
143 1.1 mrg }
144 1.1 mrg #else
145 1.1.1.2 mrg #define test_div mpfr_all_div
146 1.1 mrg #endif
147 1.1 mrg
148 1.1 mrg #define check53(n, d, rnd, res) check4(n, d, rnd, 53, res)
149 1.1 mrg
150 1.1 mrg /* return 0 iff a and b are of the same sign */
151 1.1 mrg static int
152 1.1 mrg inex_cmp (int a, int b)
153 1.1 mrg {
154 1.1 mrg if (a > 0)
155 1.1 mrg return (b > 0) ? 0 : 1;
156 1.1 mrg else if (a == 0)
157 1.1 mrg return (b == 0) ? 0 : 1;
158 1.1 mrg else
159 1.1 mrg return (b < 0) ? 0 : 1;
160 1.1 mrg }
161 1.1 mrg
162 1.1 mrg static void
163 1.1 mrg check4 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, int p,
164 1.1 mrg const char *Qs)
165 1.1 mrg {
166 1.1 mrg mpfr_t q, n, d;
167 1.1 mrg
168 1.1 mrg mpfr_inits2 (p, q, n, d, (mpfr_ptr) 0);
169 1.1 mrg mpfr_set_str1 (n, Ns);
170 1.1 mrg mpfr_set_str1 (d, Ds);
171 1.1 mrg test_div(q, n, d, rnd_mode);
172 1.1 mrg if (mpfr_cmp_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN) )
173 1.1 mrg {
174 1.1 mrg printf ("mpfr_div failed for n=%s, d=%s, p=%d, rnd_mode=%s\n",
175 1.1 mrg Ns, Ds, p, mpfr_print_rnd_mode (rnd_mode));
176 1.1.1.4 mrg printf ("got ");
177 1.1.1.4 mrg mpfr_dump (q);
178 1.1 mrg mpfr_set_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN);
179 1.1.1.4 mrg printf ("expected ");
180 1.1.1.4 mrg mpfr_dump (q);
181 1.1 mrg exit (1);
182 1.1 mrg }
183 1.1 mrg mpfr_clears (q, n, d, (mpfr_ptr) 0);
184 1.1 mrg }
185 1.1 mrg
186 1.1 mrg static void
187 1.1 mrg check24 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, const char *Qs)
188 1.1 mrg {
189 1.1 mrg mpfr_t q, n, d;
190 1.1 mrg
191 1.1 mrg mpfr_inits2 (24, q, n, d, (mpfr_ptr) 0);
192 1.1 mrg
193 1.1 mrg mpfr_set_str1 (n, Ns);
194 1.1 mrg mpfr_set_str1 (d, Ds);
195 1.1 mrg test_div(q, n, d, rnd_mode);
196 1.1 mrg if (mpfr_cmp_str1 (q, Qs) )
197 1.1 mrg {
198 1.1 mrg printf ("mpfr_div failed for n=%s, d=%s, prec=24, rnd_mode=%s\n",
199 1.1 mrg Ns, Ds, mpfr_print_rnd_mode(rnd_mode));
200 1.1 mrg printf ("expected quotient is %s, got ", Qs);
201 1.1 mrg mpfr_out_str(stdout,10,0,q, MPFR_RNDN); putchar('\n');
202 1.1 mrg exit (1);
203 1.1 mrg }
204 1.1 mrg mpfr_clears (q, n, d, (mpfr_ptr) 0);
205 1.1 mrg }
206 1.1 mrg
207 1.1 mrg /* the following examples come from the paper "Number-theoretic Test
208 1.1 mrg Generation for Directed Rounding" from Michael Parks, Table 2 */
209 1.1 mrg static void
210 1.1 mrg check_float(void)
211 1.1 mrg {
212 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDN, "8.388609e6");
213 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDN, "8.388609e6");
214 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDN, "8.388609e6");
215 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDN, "8.38861e6");
216 1.1 mrg /* the exponent for the following example was forgotten in
217 1.1 mrg the Arith'14 version of Parks' paper */
218 1.1 mrg check24 ("12582913.0", "12582910.0", MPFR_RNDN, "1.000000238");
219 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDN, "8388610.0");
220 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDN, "1.6777213e7");
221 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDN, "8.388611e6");
222 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDN, "1.2582911e7");
223 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDN, "1.258291e7");
224 1.1 mrg
225 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDZ, "8.388608e6");
226 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDZ, "8.388609e6");
227 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDZ, "8.388608e6");
228 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDZ, "8.38861e6");
229 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDZ, "1.000000238");
230 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDZ, "8388610.0");
231 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDZ, "1.6777213e7");
232 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDZ, "8.38861e6");
233 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDZ, "1.2582911e7");
234 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDZ, "1.258291e7");
235 1.1 mrg
236 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDU, "8.388609e6");
237 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDU, "8.38861e6");
238 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDU, "8.388609e6");
239 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDU, "8.388611e6");
240 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDU, "1.000000357");
241 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDU, "8388611.0");
242 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDU, "1.6777214e7");
243 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDU, "8.388611e6");
244 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDU, "1.2582912e7");
245 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDU, "1.2582911e7");
246 1.1 mrg
247 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDD, "8.388608e6");
248 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDD, "8.388609e6");
249 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDD, "8.388608e6");
250 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDD, "8.38861e6");
251 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDD, "1.000000238");
252 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDD, "8388610.0");
253 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDD, "1.6777213e7");
254 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDD, "8.38861e6");
255 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDD, "1.2582911e7");
256 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDD, "1.258291e7");
257 1.1 mrg
258 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDA, "8.388609e6");
259 1.1 mrg }
260 1.1 mrg
261 1.1 mrg static void
262 1.1 mrg check_double(void)
263 1.1 mrg {
264 1.1 mrg check53("0.0", "1.0", MPFR_RNDZ, "0.0");
265 1.1 mrg check53("-7.4988969224688591e63", "4.8816866450288732e306", MPFR_RNDD,
266 1.1 mrg "-1.5361282826510687291e-243");
267 1.1 mrg check53("-1.33225773037748601769e+199", "3.63449540676937123913e+79",
268 1.1 mrg MPFR_RNDZ, "-3.6655920045905428978e119");
269 1.1 mrg check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDU,
270 1.1 mrg "1.6672003992376663654e-67");
271 1.1 mrg check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDA,
272 1.1 mrg "1.6672003992376663654e-67");
273 1.1 mrg check53("9.89438396044940256501e-134", "-5.93472984109987421717e-67",
274 1.1 mrg MPFR_RNDU, "-1.6672003992376663654e-67");
275 1.1 mrg check53("-4.53063926135729747564e-308", "7.02293374921793516813e-84",
276 1.1 mrg MPFR_RNDD, "-6.4512060388748850857e-225");
277 1.1 mrg check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
278 1.1 mrg MPFR_RNDD, "-2.6540006635008291192e229");
279 1.1 mrg check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
280 1.1 mrg MPFR_RNDA, "-2.6540006635008291192e229");
281 1.1 mrg check53("6.52308934689126e15", "-1.62063546601505417497e273", MPFR_RNDN,
282 1.1 mrg "-4.0250194961676020848e-258");
283 1.1 mrg check53("1.04636807108079349236e-189", "3.72295730823253012954e-292",
284 1.1 mrg MPFR_RNDZ, "2.810583051186143125e102");
285 1.1 mrg /* problems found by Kevin under HP-PA */
286 1.1 mrg check53 ("2.861044553323177e-136", "-1.1120354257068143e+45", MPFR_RNDZ,
287 1.1 mrg "-2.5727998292003016e-181");
288 1.1 mrg check53 ("-4.0559157245809205e-127", "-1.1237723844524865e+77", MPFR_RNDN,
289 1.1 mrg "3.6091968273068081e-204");
290 1.1 mrg check53 ("-1.8177943561493235e-93", "-8.51233984260364e-104", MPFR_RNDU,
291 1.1 mrg "2.1354814184595821e+10");
292 1.1 mrg }
293 1.1 mrg
294 1.1 mrg static void
295 1.1 mrg check_64(void)
296 1.1 mrg {
297 1.1 mrg mpfr_t x,y,z;
298 1.1 mrg
299 1.1 mrg mpfr_inits2 (64, x, y, z, (mpfr_ptr) 0);
300 1.1 mrg
301 1.1 mrg mpfr_set_str_binary(x, "1.00100100110110101001010010101111000001011100100101010000000000E54");
302 1.1 mrg mpfr_set_str_binary(y, "1.00000000000000000000000000000000000000000000000000000000000000E584");
303 1.1 mrg test_div(z, x, y, MPFR_RNDU);
304 1.1 mrg if (mpfr_cmp_str (z, "0.1001001001101101010010100101011110000010111001001010100000000000E-529", 2, MPFR_RNDN))
305 1.1 mrg {
306 1.1.1.4 mrg printf ("Error for tdiv for MPFR_RNDU and p=64\nx=");
307 1.1.1.4 mrg mpfr_dump (x);
308 1.1.1.4 mrg printf ("y=");
309 1.1.1.4 mrg mpfr_dump (y);
310 1.1.1.4 mrg printf ("got ");
311 1.1.1.4 mrg mpfr_dump (z);
312 1.1.1.4 mrg printf ("expected 0.1001001001101101010010100101011110000010111001001010100000000000E-529\n");
313 1.1.1.4 mrg exit (1);
314 1.1 mrg }
315 1.1 mrg
316 1.1 mrg mpfr_clears (x, y, z, (mpfr_ptr) 0);
317 1.1 mrg }
318 1.1 mrg
319 1.1 mrg static void
320 1.1 mrg check_convergence (void)
321 1.1 mrg {
322 1.1 mrg mpfr_t x, y; int i, j;
323 1.1 mrg
324 1.1 mrg mpfr_init2(x, 130);
325 1.1 mrg mpfr_set_str_binary(x, "0.1011111101011010101000001010011111101000011100011101010011111011000011001010000000111100100111110011001010110100100001001000111001E6944");
326 1.1 mrg mpfr_init2(y, 130);
327 1.1 mrg mpfr_set_ui(y, 5, MPFR_RNDN);
328 1.1 mrg test_div(x, x, y, MPFR_RNDD); /* exact division */
329 1.1 mrg
330 1.1 mrg mpfr_set_prec(x, 64);
331 1.1 mrg mpfr_set_prec(y, 64);
332 1.1 mrg mpfr_set_str_binary(x, "0.10010010011011010100101001010111100000101110010010101E55");
333 1.1 mrg mpfr_set_str_binary(y, "0.1E585");
334 1.1 mrg test_div(x, x, y, MPFR_RNDN);
335 1.1 mrg mpfr_set_str_binary(y, "0.10010010011011010100101001010111100000101110010010101E-529");
336 1.1 mrg if (mpfr_cmp (x, y))
337 1.1 mrg {
338 1.1 mrg printf ("Error in mpfr_div for prec=64, rnd=MPFR_RNDN\n");
339 1.1.1.4 mrg printf ("got "); mpfr_dump (x);
340 1.1.1.4 mrg printf ("instead of "); mpfr_dump (y);
341 1.1 mrg exit(1);
342 1.1 mrg }
343 1.1 mrg
344 1.1 mrg for (i=32; i<=64; i+=32)
345 1.1 mrg {
346 1.1 mrg mpfr_set_prec(x, i);
347 1.1 mrg mpfr_set_prec(y, i);
348 1.1 mrg mpfr_set_ui(x, 1, MPFR_RNDN);
349 1.1 mrg RND_LOOP(j)
350 1.1 mrg {
351 1.1 mrg mpfr_set_ui (y, 1, MPFR_RNDN);
352 1.1 mrg test_div (y, x, y, (mpfr_rnd_t) j);
353 1.1 mrg if (mpfr_cmp_ui (y, 1))
354 1.1 mrg {
355 1.1 mrg printf ("mpfr_div failed for x=1.0, y=1.0, prec=%d rnd=%s\n",
356 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) j));
357 1.1.1.4 mrg printf ("got "); mpfr_dump (y);
358 1.1 mrg exit (1);
359 1.1 mrg }
360 1.1 mrg }
361 1.1 mrg }
362 1.1 mrg
363 1.1 mrg mpfr_clear (x);
364 1.1 mrg mpfr_clear (y);
365 1.1 mrg }
366 1.1 mrg
367 1.1 mrg #define KMAX 10000
368 1.1 mrg
369 1.1 mrg /* given y = o(x/u), x, u, find the inexact flag by
370 1.1 mrg multiplying y by u */
371 1.1 mrg static int
372 1.1 mrg get_inexact (mpfr_t y, mpfr_t x, mpfr_t u)
373 1.1 mrg {
374 1.1 mrg mpfr_t xx;
375 1.1 mrg int inex;
376 1.1 mrg mpfr_init2 (xx, mpfr_get_prec (y) + mpfr_get_prec (u));
377 1.1 mrg mpfr_mul (xx, y, u, MPFR_RNDN); /* exact */
378 1.1 mrg inex = mpfr_cmp (xx, x);
379 1.1 mrg mpfr_clear (xx);
380 1.1 mrg return inex;
381 1.1 mrg }
382 1.1 mrg
383 1.1 mrg static void
384 1.1 mrg check_hard (void)
385 1.1 mrg {
386 1.1 mrg mpfr_t u, v, q, q2;
387 1.1 mrg mpfr_prec_t precu, precv, precq;
388 1.1 mrg int rnd;
389 1.1 mrg int inex, inex2, i, j;
390 1.1 mrg
391 1.1 mrg mpfr_init (q);
392 1.1 mrg mpfr_init (q2);
393 1.1 mrg mpfr_init (u);
394 1.1 mrg mpfr_init (v);
395 1.1 mrg
396 1.1 mrg for (precq = MPFR_PREC_MIN; precq <= 64; precq ++)
397 1.1 mrg {
398 1.1 mrg mpfr_set_prec (q, precq);
399 1.1 mrg mpfr_set_prec (q2, precq + 1);
400 1.1 mrg for (j = 0; j < 2; j++)
401 1.1 mrg {
402 1.1 mrg if (j == 0)
403 1.1 mrg {
404 1.1 mrg do
405 1.1 mrg {
406 1.1 mrg mpfr_urandomb (q2, RANDS);
407 1.1 mrg }
408 1.1 mrg while (mpfr_cmp_ui (q2, 0) == 0);
409 1.1 mrg }
410 1.1 mrg else /* use q2=1 */
411 1.1 mrg mpfr_set_ui (q2, 1, MPFR_RNDN);
412 1.1 mrg for (precv = precq; precv <= 10 * precq; precv += precq)
413 1.1 mrg {
414 1.1 mrg mpfr_set_prec (v, precv);
415 1.1 mrg do
416 1.1 mrg {
417 1.1 mrg mpfr_urandomb (v, RANDS);
418 1.1 mrg }
419 1.1 mrg while (mpfr_cmp_ui (v, 0) == 0);
420 1.1 mrg for (precu = precq; precu <= 10 * precq; precu += precq)
421 1.1 mrg {
422 1.1 mrg mpfr_set_prec (u, precu);
423 1.1 mrg mpfr_mul (u, v, q2, MPFR_RNDN);
424 1.1 mrg mpfr_nextbelow (u);
425 1.1 mrg for (i = 0; i <= 2; i++)
426 1.1 mrg {
427 1.1.1.4 mrg RND_LOOP_NO_RNDF (rnd)
428 1.1 mrg {
429 1.1 mrg inex = test_div (q, u, v, (mpfr_rnd_t) rnd);
430 1.1 mrg inex2 = get_inexact (q, u, v);
431 1.1 mrg if (inex_cmp (inex, inex2))
432 1.1 mrg {
433 1.1 mrg printf ("Wrong inexact flag for rnd=%s: expected %d, got %d\n",
434 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), inex2, inex);
435 1.1 mrg printf ("u= "); mpfr_dump (u);
436 1.1 mrg printf ("v= "); mpfr_dump (v);
437 1.1 mrg printf ("q= "); mpfr_dump (q);
438 1.1 mrg mpfr_set_prec (q2, precq + precv);
439 1.1 mrg mpfr_mul (q2, q, v, MPFR_RNDN);
440 1.1 mrg printf ("q*v="); mpfr_dump (q2);
441 1.1 mrg exit (1);
442 1.1 mrg }
443 1.1 mrg }
444 1.1 mrg mpfr_nextabove (u);
445 1.1 mrg }
446 1.1 mrg }
447 1.1 mrg }
448 1.1 mrg }
449 1.1 mrg }
450 1.1 mrg
451 1.1 mrg mpfr_clear (q);
452 1.1 mrg mpfr_clear (q2);
453 1.1 mrg mpfr_clear (u);
454 1.1 mrg mpfr_clear (v);
455 1.1 mrg }
456 1.1 mrg
457 1.1 mrg static void
458 1.1 mrg check_lowr (void)
459 1.1 mrg {
460 1.1 mrg mpfr_t x, y, z, z2, z3, tmp;
461 1.1 mrg int k, c, c2;
462 1.1 mrg
463 1.1 mrg
464 1.1 mrg mpfr_init2 (x, 1000);
465 1.1 mrg mpfr_init2 (y, 100);
466 1.1 mrg mpfr_init2 (tmp, 850);
467 1.1 mrg mpfr_init2 (z, 10);
468 1.1 mrg mpfr_init2 (z2, 10);
469 1.1 mrg mpfr_init2 (z3, 50);
470 1.1 mrg
471 1.1 mrg for (k = 1; k < KMAX; k++)
472 1.1 mrg {
473 1.1 mrg do
474 1.1 mrg {
475 1.1 mrg mpfr_urandomb (z, RANDS);
476 1.1 mrg }
477 1.1 mrg while (mpfr_cmp_ui (z, 0) == 0);
478 1.1 mrg do
479 1.1 mrg {
480 1.1 mrg mpfr_urandomb (tmp, RANDS);
481 1.1 mrg }
482 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0);
483 1.1 mrg mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
484 1.1 mrg c = test_div (z2, x, tmp, MPFR_RNDN);
485 1.1 mrg
486 1.1 mrg if (c || mpfr_cmp (z2, z))
487 1.1 mrg {
488 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
489 1.1.1.4 mrg printf ("got "); mpfr_dump (z2);
490 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z);
491 1.1 mrg printf ("inex flag = %d, expected 0\n", c);
492 1.1 mrg exit (1);
493 1.1 mrg }
494 1.1 mrg }
495 1.1 mrg
496 1.1 mrg /* x has still precision 1000, z precision 10, and tmp prec 850 */
497 1.1 mrg mpfr_set_prec (z2, 9);
498 1.1 mrg for (k = 1; k < KMAX; k++)
499 1.1 mrg {
500 1.1 mrg mpfr_urandomb (z, RANDS);
501 1.1 mrg do
502 1.1 mrg {
503 1.1 mrg mpfr_urandomb (tmp, RANDS);
504 1.1 mrg }
505 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0);
506 1.1 mrg mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
507 1.1 mrg c = test_div (z2, x, tmp, MPFR_RNDN);
508 1.1 mrg /* since z2 has one less bit that z, either the division is exact
509 1.1 mrg if z is representable on 9 bits, or we have an even round case */
510 1.1 mrg
511 1.1 mrg c2 = get_inexact (z2, x, tmp);
512 1.1 mrg if ((mpfr_cmp (z2, z) == 0 && c) || inex_cmp (c, c2))
513 1.1 mrg {
514 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
515 1.1.1.4 mrg printf ("got "); mpfr_dump (z2);
516 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z);
517 1.1 mrg printf ("inex flag = %d, expected %d\n", c, c2);
518 1.1 mrg exit (1);
519 1.1 mrg }
520 1.1 mrg else if (c == 2)
521 1.1 mrg {
522 1.1 mrg mpfr_nexttoinf (z);
523 1.1 mrg if (mpfr_cmp(z2, z))
524 1.1 mrg {
525 1.1 mrg printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
526 1.1 mrg printf ("Dividing ");
527 1.1.1.4 mrg printf ("got "); mpfr_dump (z2);
528 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z);
529 1.1 mrg printf ("inex flag = %d\n", 1);
530 1.1 mrg exit (1);
531 1.1 mrg }
532 1.1 mrg }
533 1.1 mrg else if (c == -2)
534 1.1 mrg {
535 1.1 mrg mpfr_nexttozero (z);
536 1.1 mrg if (mpfr_cmp(z2, z))
537 1.1 mrg {
538 1.1 mrg printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
539 1.1 mrg printf ("Dividing ");
540 1.1.1.4 mrg printf ("got "); mpfr_dump (z2);
541 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z);
542 1.1 mrg printf ("inex flag = %d\n", 1);
543 1.1 mrg exit (1);
544 1.1 mrg }
545 1.1 mrg }
546 1.1 mrg }
547 1.1 mrg
548 1.1 mrg mpfr_set_prec(x, 1000);
549 1.1 mrg mpfr_set_prec(y, 100);
550 1.1 mrg mpfr_set_prec(tmp, 850);
551 1.1 mrg mpfr_set_prec(z, 10);
552 1.1 mrg mpfr_set_prec(z2, 10);
553 1.1 mrg
554 1.1 mrg /* almost exact divisions */
555 1.1 mrg for (k = 1; k < KMAX; k++)
556 1.1 mrg {
557 1.1 mrg do
558 1.1 mrg {
559 1.1 mrg mpfr_urandomb (z, RANDS);
560 1.1 mrg }
561 1.1 mrg while (mpfr_cmp_ui (z, 0) == 0);
562 1.1 mrg do
563 1.1 mrg {
564 1.1 mrg mpfr_urandomb (tmp, RANDS);
565 1.1 mrg }
566 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0);
567 1.1 mrg mpfr_mul(x, z, tmp, MPFR_RNDN);
568 1.1 mrg mpfr_set(y, tmp, MPFR_RNDD);
569 1.1 mrg mpfr_nexttoinf (x);
570 1.1 mrg
571 1.1 mrg c = test_div(z2, x, y, MPFR_RNDD);
572 1.1 mrg test_div(z3, x, y, MPFR_RNDD);
573 1.1 mrg mpfr_set(z, z3, MPFR_RNDD);
574 1.1 mrg
575 1.1 mrg if (c != -1 || mpfr_cmp(z2, z))
576 1.1 mrg {
577 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDD\n");
578 1.1.1.4 mrg printf ("got "); mpfr_dump (z2);
579 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z);
580 1.1 mrg printf ("inex flag = %d\n", c);
581 1.1 mrg exit (1);
582 1.1 mrg }
583 1.1 mrg
584 1.1 mrg mpfr_set (y, tmp, MPFR_RNDU);
585 1.1 mrg test_div (z3, x, y, MPFR_RNDU);
586 1.1 mrg mpfr_set (z, z3, MPFR_RNDU);
587 1.1 mrg c = test_div (z2, x, y, MPFR_RNDU);
588 1.1 mrg if (c != 1 || mpfr_cmp (z2, z))
589 1.1 mrg {
590 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDU\n");
591 1.1 mrg printf ("u="); mpfr_dump (x);
592 1.1 mrg printf ("v="); mpfr_dump (y);
593 1.1.1.4 mrg printf ("got "); mpfr_dump (z2);
594 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z);
595 1.1 mrg printf ("inex flag = %d\n", c);
596 1.1 mrg exit (1);
597 1.1 mrg }
598 1.1 mrg }
599 1.1 mrg
600 1.1 mrg mpfr_clear (x);
601 1.1 mrg mpfr_clear (y);
602 1.1 mrg mpfr_clear (z);
603 1.1 mrg mpfr_clear (z2);
604 1.1 mrg mpfr_clear (z3);
605 1.1 mrg mpfr_clear (tmp);
606 1.1 mrg }
607 1.1 mrg
608 1.1 mrg #define MAX_PREC 128
609 1.1 mrg
610 1.1 mrg static void
611 1.1 mrg check_inexact (void)
612 1.1 mrg {
613 1.1 mrg mpfr_t x, y, z, u;
614 1.1 mrg mpfr_prec_t px, py, pu;
615 1.1 mrg int inexact, cmp;
616 1.1 mrg mpfr_rnd_t rnd;
617 1.1 mrg
618 1.1 mrg mpfr_init (x);
619 1.1 mrg mpfr_init (y);
620 1.1 mrg mpfr_init (z);
621 1.1 mrg mpfr_init (u);
622 1.1 mrg
623 1.1 mrg mpfr_set_prec (x, 28);
624 1.1 mrg mpfr_set_prec (y, 28);
625 1.1 mrg mpfr_set_prec (z, 1023);
626 1.1 mrg mpfr_set_str_binary (x, "0.1000001001101101111100010011E0");
627 1.1 mrg mpfr_set_str (z, "48284762641021308813686974720835219181653367326353400027913400579340343320519877153813133510034402932651132854764198688352364361009429039801248971901380781746767119334993621199563870113045276395603170432175354501451429471578325545278975153148347684600400321033502982713296919861760382863826626093689036010394", 10, MPFR_RNDN);
628 1.1 mrg mpfr_div (x, x, z, MPFR_RNDN);
629 1.1 mrg mpfr_set_str_binary (y, "0.1111001011001101001001111100E-1023");
630 1.1 mrg if (mpfr_cmp (x, y))
631 1.1 mrg {
632 1.1 mrg printf ("Error in mpfr_div for prec=28, RNDN\n");
633 1.1 mrg printf ("Expected "); mpfr_dump (y);
634 1.1 mrg printf ("Got "); mpfr_dump (x);
635 1.1 mrg exit (1);
636 1.1 mrg }
637 1.1 mrg
638 1.1 mrg mpfr_set_prec (x, 53);
639 1.1 mrg mpfr_set_str_binary (x, "0.11101100110010100011011000000100001111011111110010101E0");
640 1.1 mrg mpfr_set_prec (u, 127);
641 1.1 mrg mpfr_set_str_binary (u, "0.1000001100110110110101110110101101111000110000001111111110000000011111001010110100110010111111111101000001011011101011101101000E-2");
642 1.1 mrg mpfr_set_prec (y, 95);
643 1.1 mrg inexact = test_div (y, x, u, MPFR_RNDN);
644 1.1 mrg if (inexact != (cmp = get_inexact (y, x, u)))
645 1.1 mrg {
646 1.1 mrg printf ("Wrong inexact flag (0): expected %d, got %d\n", cmp, inexact);
647 1.1 mrg printf ("x="); mpfr_out_str (stdout, 10, 99, x, MPFR_RNDN); printf ("\n");
648 1.1 mrg printf ("u="); mpfr_out_str (stdout, 10, 99, u, MPFR_RNDN); printf ("\n");
649 1.1 mrg printf ("y="); mpfr_out_str (stdout, 10, 99, y, MPFR_RNDN); printf ("\n");
650 1.1 mrg exit (1);
651 1.1 mrg }
652 1.1 mrg
653 1.1 mrg mpfr_set_prec (x, 33);
654 1.1 mrg mpfr_set_str_binary (x, "0.101111100011011101010011101100001E0");
655 1.1 mrg mpfr_set_prec (u, 2);
656 1.1 mrg mpfr_set_str_binary (u, "0.1E0");
657 1.1 mrg mpfr_set_prec (y, 28);
658 1.1.1.3 mrg inexact = test_div (y, x, u, MPFR_RNDN);
659 1.1.1.3 mrg if (inexact >= 0)
660 1.1 mrg {
661 1.1 mrg printf ("Wrong inexact flag (1): expected -1, got %d\n",
662 1.1 mrg inexact);
663 1.1 mrg exit (1);
664 1.1 mrg }
665 1.1 mrg
666 1.1 mrg mpfr_set_prec (x, 129);
667 1.1 mrg mpfr_set_str_binary (x, "0.111110101111001100000101011100101100110011011101010001000110110101100101000010000001110110100001101010001010100010001111001101010E-2");
668 1.1 mrg mpfr_set_prec (u, 15);
669 1.1 mrg mpfr_set_str_binary (u, "0.101101000001100E-1");
670 1.1 mrg mpfr_set_prec (y, 92);
671 1.1.1.3 mrg inexact = test_div (y, x, u, MPFR_RNDN);
672 1.1.1.3 mrg if (inexact <= 0)
673 1.1 mrg {
674 1.1 mrg printf ("Wrong inexact flag for rnd=MPFR_RNDN(1): expected 1, got %d\n",
675 1.1 mrg inexact);
676 1.1 mrg mpfr_dump (x);
677 1.1 mrg mpfr_dump (u);
678 1.1 mrg mpfr_dump (y);
679 1.1 mrg exit (1);
680 1.1 mrg }
681 1.1 mrg
682 1.1 mrg for (px=2; px<MAX_PREC; px++)
683 1.1 mrg {
684 1.1 mrg mpfr_set_prec (x, px);
685 1.1 mrg mpfr_urandomb (x, RANDS);
686 1.1 mrg for (pu=2; pu<=MAX_PREC; pu++)
687 1.1 mrg {
688 1.1 mrg mpfr_set_prec (u, pu);
689 1.1 mrg do { mpfr_urandomb (u, RANDS); } while (mpfr_cmp_ui (u, 0) == 0);
690 1.1 mrg {
691 1.1 mrg py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - MPFR_PREC_MIN));
692 1.1 mrg mpfr_set_prec (y, py);
693 1.1 mrg mpfr_set_prec (z, py + pu);
694 1.1 mrg {
695 1.1.1.4 mrg /* inexact is undefined for RNDF */
696 1.1.1.4 mrg rnd = RND_RAND_NO_RNDF ();
697 1.1 mrg inexact = test_div (y, x, u, rnd);
698 1.1 mrg if (mpfr_mul (z, y, u, rnd))
699 1.1 mrg {
700 1.1 mrg printf ("z <- y * u should be exact\n");
701 1.1 mrg exit (1);
702 1.1 mrg }
703 1.1 mrg cmp = mpfr_cmp (z, x);
704 1.1 mrg if (((inexact == 0) && (cmp != 0)) ||
705 1.1 mrg ((inexact > 0) && (cmp <= 0)) ||
706 1.1 mrg ((inexact < 0) && (cmp >= 0)))
707 1.1 mrg {
708 1.1 mrg printf ("Wrong inexact flag for rnd=%s\n",
709 1.1 mrg mpfr_print_rnd_mode(rnd));
710 1.1 mrg printf ("expected %d, got %d\n", cmp, inexact);
711 1.1.1.4 mrg printf ("x="); mpfr_dump (x);
712 1.1.1.4 mrg printf ("u="); mpfr_dump (u);
713 1.1.1.4 mrg printf ("y="); mpfr_dump (y);
714 1.1.1.4 mrg printf ("y*u="); mpfr_dump (z);
715 1.1 mrg exit (1);
716 1.1 mrg }
717 1.1 mrg }
718 1.1 mrg }
719 1.1 mrg }
720 1.1 mrg }
721 1.1 mrg
722 1.1 mrg mpfr_clear (x);
723 1.1 mrg mpfr_clear (y);
724 1.1 mrg mpfr_clear (z);
725 1.1 mrg mpfr_clear (u);
726 1.1 mrg }
727 1.1 mrg
728 1.1 mrg static void
729 1.1.1.2 mrg check_special (void)
730 1.1 mrg {
731 1.1 mrg mpfr_t a, d, q;
732 1.1 mrg mpfr_exp_t emax, emin;
733 1.1 mrg int i;
734 1.1 mrg
735 1.1 mrg mpfr_init2 (a, 100L);
736 1.1 mrg mpfr_init2 (d, 100L);
737 1.1 mrg mpfr_init2 (q, 100L);
738 1.1 mrg
739 1.1 mrg /* 1/nan == nan */
740 1.1 mrg mpfr_set_ui (a, 1L, MPFR_RNDN);
741 1.1 mrg MPFR_SET_NAN (d);
742 1.1.1.2 mrg mpfr_clear_flags ();
743 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
744 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
745 1.1 mrg
746 1.1 mrg /* nan/1 == nan */
747 1.1 mrg MPFR_SET_NAN (a);
748 1.1 mrg mpfr_set_ui (d, 1L, MPFR_RNDN);
749 1.1.1.2 mrg mpfr_clear_flags ();
750 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
751 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
752 1.1 mrg
753 1.1 mrg /* +inf/1 == +inf */
754 1.1 mrg MPFR_SET_INF (a);
755 1.1 mrg MPFR_SET_POS (a);
756 1.1 mrg mpfr_set_ui (d, 1L, MPFR_RNDN);
757 1.1.1.2 mrg mpfr_clear_flags ();
758 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
759 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q));
760 1.1.1.2 mrg MPFR_ASSERTN (mpfr_sgn (q) > 0);
761 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
762 1.1.1.2 mrg
763 1.1.1.2 mrg /* +inf/-1 == -inf */
764 1.1.1.2 mrg MPFR_SET_INF (a);
765 1.1.1.2 mrg MPFR_SET_POS (a);
766 1.1.1.2 mrg mpfr_set_si (d, -1, MPFR_RNDN);
767 1.1.1.2 mrg mpfr_clear_flags ();
768 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
769 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q));
770 1.1.1.2 mrg MPFR_ASSERTN (mpfr_sgn (q) < 0);
771 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
772 1.1.1.2 mrg
773 1.1.1.2 mrg /* -inf/1 == -inf */
774 1.1.1.2 mrg MPFR_SET_INF (a);
775 1.1.1.2 mrg MPFR_SET_NEG (a);
776 1.1.1.2 mrg mpfr_set_ui (d, 1L, MPFR_RNDN);
777 1.1.1.2 mrg mpfr_clear_flags ();
778 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
779 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q));
780 1.1.1.2 mrg MPFR_ASSERTN (mpfr_sgn (q) < 0);
781 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
782 1.1.1.2 mrg
783 1.1.1.2 mrg /* -inf/-1 == +inf */
784 1.1.1.2 mrg MPFR_SET_INF (a);
785 1.1.1.2 mrg MPFR_SET_NEG (a);
786 1.1.1.2 mrg mpfr_set_si (d, -1, MPFR_RNDN);
787 1.1.1.2 mrg mpfr_clear_flags ();
788 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
789 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q));
790 1.1 mrg MPFR_ASSERTN (mpfr_sgn (q) > 0);
791 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
792 1.1.1.2 mrg
793 1.1.1.2 mrg /* 1/+inf == +0 */
794 1.1.1.2 mrg mpfr_set_ui (a, 1L, MPFR_RNDN);
795 1.1.1.2 mrg MPFR_SET_INF (d);
796 1.1.1.2 mrg MPFR_SET_POS (d);
797 1.1.1.2 mrg mpfr_clear_flags ();
798 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
799 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q));
800 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_POS (q));
801 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
802 1.1 mrg
803 1.1.1.2 mrg /* 1/-inf == -0 */
804 1.1 mrg mpfr_set_ui (a, 1L, MPFR_RNDN);
805 1.1 mrg MPFR_SET_INF (d);
806 1.1.1.2 mrg MPFR_SET_NEG (d);
807 1.1.1.2 mrg mpfr_clear_flags ();
808 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
809 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q));
810 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_NEG (q));
811 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
812 1.1.1.2 mrg
813 1.1.1.2 mrg /* -1/+inf == -0 */
814 1.1.1.2 mrg mpfr_set_si (a, -1, MPFR_RNDN);
815 1.1.1.2 mrg MPFR_SET_INF (d);
816 1.1 mrg MPFR_SET_POS (d);
817 1.1.1.2 mrg mpfr_clear_flags ();
818 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
819 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q));
820 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_NEG (q));
821 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
822 1.1.1.2 mrg
823 1.1.1.2 mrg /* -1/-inf == +0 */
824 1.1.1.2 mrg mpfr_set_si (a, -1, MPFR_RNDN);
825 1.1.1.2 mrg MPFR_SET_INF (d);
826 1.1.1.2 mrg MPFR_SET_NEG (d);
827 1.1.1.2 mrg mpfr_clear_flags ();
828 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
829 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q));
830 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_POS (q));
831 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
832 1.1 mrg
833 1.1 mrg /* 0/0 == nan */
834 1.1 mrg mpfr_set_ui (a, 0L, MPFR_RNDN);
835 1.1 mrg mpfr_set_ui (d, 0L, MPFR_RNDN);
836 1.1.1.2 mrg mpfr_clear_flags ();
837 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
838 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
839 1.1 mrg
840 1.1 mrg /* +inf/+inf == nan */
841 1.1 mrg MPFR_SET_INF (a);
842 1.1 mrg MPFR_SET_POS (a);
843 1.1 mrg MPFR_SET_INF (d);
844 1.1 mrg MPFR_SET_POS (d);
845 1.1.1.2 mrg mpfr_clear_flags ();
846 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
847 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
848 1.1 mrg
849 1.1.1.2 mrg /* 1/+0 = +inf */
850 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ);
851 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
852 1.1.1.2 mrg mpfr_clear_flags ();
853 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
854 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
855 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
856 1.1 mrg
857 1.1.1.2 mrg /* 1/-0 = -inf */
858 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ);
859 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
860 1.1 mrg mpfr_neg (d, d, MPFR_RNDZ);
861 1.1.1.2 mrg mpfr_clear_flags ();
862 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
863 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
864 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
865 1.1 mrg
866 1.1.1.2 mrg /* -1/+0 = -inf */
867 1.1 mrg mpfr_set_si (a, -1, MPFR_RNDZ);
868 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
869 1.1.1.2 mrg mpfr_clear_flags ();
870 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
871 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
872 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
873 1.1 mrg
874 1.1.1.2 mrg /* -1/-0 = +inf */
875 1.1 mrg mpfr_set_si (a, -1, MPFR_RNDZ);
876 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
877 1.1 mrg mpfr_neg (d, d, MPFR_RNDZ);
878 1.1.1.2 mrg mpfr_clear_flags ();
879 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
880 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
881 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
882 1.1.1.2 mrg
883 1.1.1.2 mrg /* +inf/+0 = +inf */
884 1.1.1.2 mrg MPFR_SET_INF (a);
885 1.1.1.2 mrg MPFR_SET_POS (a);
886 1.1.1.2 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
887 1.1.1.2 mrg mpfr_clear_flags ();
888 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
889 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
890 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
891 1.1.1.2 mrg
892 1.1.1.2 mrg /* +inf/-0 = -inf */
893 1.1.1.2 mrg MPFR_SET_INF (a);
894 1.1.1.2 mrg MPFR_SET_POS (a);
895 1.1.1.2 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
896 1.1.1.2 mrg mpfr_neg (d, d, MPFR_RNDZ);
897 1.1.1.2 mrg mpfr_clear_flags ();
898 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
899 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
900 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
901 1.1.1.2 mrg
902 1.1.1.2 mrg /* -inf/+0 = -inf */
903 1.1.1.2 mrg MPFR_SET_INF (a);
904 1.1.1.2 mrg MPFR_SET_NEG (a);
905 1.1.1.2 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
906 1.1.1.2 mrg mpfr_clear_flags ();
907 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
908 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
909 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
910 1.1.1.2 mrg
911 1.1.1.2 mrg /* -inf/-0 = +inf */
912 1.1.1.2 mrg MPFR_SET_INF (a);
913 1.1.1.2 mrg MPFR_SET_NEG (a);
914 1.1.1.2 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
915 1.1.1.2 mrg mpfr_neg (d, d, MPFR_RNDZ);
916 1.1.1.2 mrg mpfr_clear_flags ();
917 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
918 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
919 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0);
920 1.1 mrg
921 1.1 mrg /* check overflow */
922 1.1 mrg emax = mpfr_get_emax ();
923 1.1 mrg set_emax (1);
924 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ);
925 1.1 mrg mpfr_set_ui (d, 1, MPFR_RNDZ);
926 1.1.1.5 mrg mpfr_div_2ui (d, d, 1, MPFR_RNDZ);
927 1.1.1.2 mrg mpfr_clear_flags ();
928 1.1 mrg test_div (q, a, d, MPFR_RNDU); /* 1 / 0.5 = 2 -> overflow */
929 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
930 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == (MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT));
931 1.1 mrg set_emax (emax);
932 1.1 mrg
933 1.1 mrg /* check underflow */
934 1.1 mrg emin = mpfr_get_emin ();
935 1.1 mrg set_emin (-1);
936 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ);
937 1.1.1.5 mrg mpfr_div_2ui (a, a, 2, MPFR_RNDZ);
938 1.1 mrg mpfr_set_prec (d, mpfr_get_prec (q) + 8);
939 1.1 mrg for (i = -1; i <= 1; i++)
940 1.1 mrg {
941 1.1 mrg int sign;
942 1.1 mrg
943 1.1 mrg /* Test 2^(-2) / (+/- (2 + eps)), with eps < 0, eps = 0, eps > 0.
944 1.1 mrg -> underflow.
945 1.1 mrg With div.c r5513, this test fails for eps > 0 in MPFR_RNDN. */
946 1.1 mrg mpfr_set_ui (d, 2, MPFR_RNDZ);
947 1.1 mrg if (i < 0)
948 1.1 mrg mpfr_nextbelow (d);
949 1.1 mrg if (i > 0)
950 1.1 mrg mpfr_nextabove (d);
951 1.1 mrg for (sign = 0; sign <= 1; sign++)
952 1.1 mrg {
953 1.1 mrg mpfr_clear_flags ();
954 1.1 mrg test_div (q, a, d, MPFR_RNDZ); /* result = 0 */
955 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags ==
956 1.1.1.2 mrg (MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT));
957 1.1 mrg MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
958 1.1 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q));
959 1.1 mrg mpfr_clear_flags ();
960 1.1 mrg test_div (q, a, d, MPFR_RNDN); /* result = 0 iff eps >= 0 */
961 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags ==
962 1.1.1.2 mrg (MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT));
963 1.1 mrg MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
964 1.1 mrg if (i < 0)
965 1.1 mrg mpfr_nexttozero (q);
966 1.1 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q));
967 1.1 mrg mpfr_neg (d, d, MPFR_RNDN);
968 1.1 mrg }
969 1.1 mrg }
970 1.1 mrg set_emin (emin);
971 1.1 mrg
972 1.1 mrg mpfr_clear (a);
973 1.1 mrg mpfr_clear (d);
974 1.1 mrg mpfr_clear (q);
975 1.1 mrg }
976 1.1 mrg
977 1.1 mrg static void
978 1.1 mrg consistency (void)
979 1.1 mrg {
980 1.1 mrg mpfr_t x, y, z1, z2;
981 1.1 mrg int i;
982 1.1 mrg
983 1.1 mrg mpfr_inits (x, y, z1, z2, (mpfr_ptr) 0);
984 1.1 mrg
985 1.1 mrg for (i = 0; i < 10000; i++)
986 1.1 mrg {
987 1.1 mrg mpfr_rnd_t rnd;
988 1.1 mrg mpfr_prec_t px, py, pz, p;
989 1.1 mrg int inex1, inex2;
990 1.1 mrg
991 1.1.1.4 mrg /* inex is undefined for RNDF */
992 1.1.1.4 mrg rnd = RND_RAND_NO_RNDF ();
993 1.1 mrg px = (randlimb () % 256) + 2;
994 1.1 mrg py = (randlimb () % 128) + 2;
995 1.1 mrg pz = (randlimb () % 256) + 2;
996 1.1 mrg mpfr_set_prec (x, px);
997 1.1 mrg mpfr_set_prec (y, py);
998 1.1 mrg mpfr_set_prec (z1, pz);
999 1.1 mrg mpfr_set_prec (z2, pz);
1000 1.1 mrg mpfr_urandomb (x, RANDS);
1001 1.1 mrg do
1002 1.1 mrg mpfr_urandomb (y, RANDS);
1003 1.1 mrg while (mpfr_zero_p (y));
1004 1.1 mrg inex1 = mpfr_div (z1, x, y, rnd);
1005 1.1 mrg MPFR_ASSERTN (!MPFR_IS_NAN (z1));
1006 1.1 mrg p = MAX (MAX (px, py), pz);
1007 1.1 mrg if (mpfr_prec_round (x, p, MPFR_RNDN) != 0 ||
1008 1.1 mrg mpfr_prec_round (y, p, MPFR_RNDN) != 0)
1009 1.1 mrg {
1010 1.1 mrg printf ("mpfr_prec_round error for i = %d\n", i);
1011 1.1 mrg exit (1);
1012 1.1 mrg }
1013 1.1 mrg inex2 = mpfr_div (z2, x, y, rnd);
1014 1.1 mrg MPFR_ASSERTN (!MPFR_IS_NAN (z2));
1015 1.1 mrg if (inex1 != inex2 || mpfr_cmp (z1, z2) != 0)
1016 1.1 mrg {
1017 1.1.1.4 mrg printf ("Consistency error for i = %d, rnd = %s\n", i,
1018 1.1.1.4 mrg mpfr_print_rnd_mode (rnd));
1019 1.1.1.4 mrg printf ("inex1=%d inex2=%d\n", inex1, inex2);
1020 1.1.1.4 mrg printf ("z1="); mpfr_dump (z1);
1021 1.1.1.4 mrg printf ("z2="); mpfr_dump (z2);
1022 1.1 mrg exit (1);
1023 1.1 mrg }
1024 1.1 mrg }
1025 1.1 mrg
1026 1.1 mrg mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0);
1027 1.1 mrg }
1028 1.1 mrg
1029 1.1 mrg /* Reported by Carl Witty on 2007-06-03 */
1030 1.1 mrg static void
1031 1.1 mrg test_20070603 (void)
1032 1.1 mrg {
1033 1.1 mrg mpfr_t n, d, q, c;
1034 1.1 mrg
1035 1.1 mrg mpfr_init2 (n, 128);
1036 1.1 mrg mpfr_init2 (d, 128);
1037 1.1 mrg mpfr_init2 (q, 31);
1038 1.1 mrg mpfr_init2 (c, 31);
1039 1.1 mrg
1040 1.1 mrg mpfr_set_str (n, "10384593717069655257060992206846485", 10, MPFR_RNDN);
1041 1.1 mrg mpfr_set_str (d, "10384593717069655257060992206847132", 10, MPFR_RNDN);
1042 1.1 mrg mpfr_div (q, n, d, MPFR_RNDU);
1043 1.1 mrg
1044 1.1 mrg mpfr_set_ui (c, 1, MPFR_RNDN);
1045 1.1 mrg if (mpfr_cmp (q, c) != 0)
1046 1.1 mrg {
1047 1.1 mrg printf ("Error in test_20070603\nGot ");
1048 1.1 mrg mpfr_dump (q);
1049 1.1 mrg printf ("instead of ");
1050 1.1 mrg mpfr_dump (c);
1051 1.1 mrg exit (1);
1052 1.1 mrg }
1053 1.1 mrg
1054 1.1 mrg /* same for 64-bit machines */
1055 1.1 mrg mpfr_set_prec (n, 256);
1056 1.1 mrg mpfr_set_prec (d, 256);
1057 1.1 mrg mpfr_set_prec (q, 63);
1058 1.1 mrg mpfr_set_str (n, "822752278660603021077484591278675252491367930877209729029898240", 10, MPFR_RNDN);
1059 1.1 mrg mpfr_set_str (d, "822752278660603021077484591278675252491367930877212507873738752", 10, MPFR_RNDN);
1060 1.1 mrg mpfr_div (q, n, d, MPFR_RNDU);
1061 1.1 mrg if (mpfr_cmp (q, c) != 0)
1062 1.1 mrg {
1063 1.1 mrg printf ("Error in test_20070603\nGot ");
1064 1.1 mrg mpfr_dump (q);
1065 1.1 mrg printf ("instead of ");
1066 1.1 mrg mpfr_dump (c);
1067 1.1 mrg exit (1);
1068 1.1 mrg }
1069 1.1 mrg
1070 1.1 mrg mpfr_clear (n);
1071 1.1 mrg mpfr_clear (d);
1072 1.1 mrg mpfr_clear (q);
1073 1.1 mrg mpfr_clear (c);
1074 1.1 mrg }
1075 1.1 mrg
1076 1.1 mrg /* Bug found while adding tests for mpfr_cot */
1077 1.1 mrg static void
1078 1.1 mrg test_20070628 (void)
1079 1.1 mrg {
1080 1.1 mrg mpfr_exp_t old_emax;
1081 1.1 mrg mpfr_t x, y;
1082 1.1 mrg int inex, err = 0;
1083 1.1 mrg
1084 1.1 mrg old_emax = mpfr_get_emax ();
1085 1.1 mrg
1086 1.1 mrg if (mpfr_set_emax (256))
1087 1.1 mrg {
1088 1.1 mrg printf ("Can't change exponent range\n");
1089 1.1 mrg exit (1);
1090 1.1 mrg }
1091 1.1 mrg
1092 1.1 mrg mpfr_inits2 (53, x, y, (mpfr_ptr) 0);
1093 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
1094 1.1 mrg mpfr_set_si_2exp (y, 1, -256, MPFR_RNDN);
1095 1.1 mrg mpfr_clear_flags ();
1096 1.1 mrg inex = mpfr_div (x, x, y, MPFR_RNDD);
1097 1.1.1.4 mrg if (MPFR_IS_POS (x) || ! mpfr_inf_p (x))
1098 1.1 mrg {
1099 1.1 mrg printf ("Error in test_20070628: expected -Inf, got\n");
1100 1.1 mrg mpfr_dump (x);
1101 1.1 mrg err++;
1102 1.1 mrg }
1103 1.1 mrg if (inex >= 0)
1104 1.1 mrg {
1105 1.1 mrg printf ("Error in test_20070628: expected inex < 0, got %d\n", inex);
1106 1.1 mrg err++;
1107 1.1 mrg }
1108 1.1 mrg if (! mpfr_overflow_p ())
1109 1.1 mrg {
1110 1.1 mrg printf ("Error in test_20070628: overflow flag is not set\n");
1111 1.1 mrg err++;
1112 1.1 mrg }
1113 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0);
1114 1.1 mrg mpfr_set_emax (old_emax);
1115 1.1 mrg }
1116 1.1 mrg
1117 1.1.1.3 mrg /* Bug in mpfr_divhigh_n_basecase when all limbs of q (except the most
1118 1.1.1.3 mrg significant one) are B-1 where B=2^GMP_NUMB_BITS. Since we truncate
1119 1.1.1.3 mrg the divisor at each step, it might happen at some point that
1120 1.1.1.3 mrg (np[n-1],np[n-2]) > (d1,d0), and not only the equality.
1121 1.1.1.3 mrg Reported by Ricky Farr
1122 1.1.1.3 mrg <https://sympa.inria.fr/sympa/arc/mpfr/2015-10/msg00023.html>
1123 1.1.1.3 mrg To get a failure, a MPFR_DIVHIGH_TAB entry below the MPFR_DIV_THRESHOLD
1124 1.1.1.4 mrg limit must have a value 0. With most mparam.h files, this cannot occur. To
1125 1.1.1.4 mrg make the bug appear, one can configure MPFR with -DMPFR_TUNE_COVERAGE. */
1126 1.1.1.3 mrg static void
1127 1.1.1.3 mrg test_20151023 (void)
1128 1.1.1.3 mrg {
1129 1.1.1.3 mrg mpfr_prec_t p;
1130 1.1.1.3 mrg mpfr_t n, d, q, q0;
1131 1.1.1.3 mrg int inex, i;
1132 1.1.1.3 mrg
1133 1.1.1.3 mrg for (p = GMP_NUMB_BITS; p <= 2000; p++)
1134 1.1.1.3 mrg {
1135 1.1.1.3 mrg mpfr_init2 (n, 2*p);
1136 1.1.1.3 mrg mpfr_init2 (d, p);
1137 1.1.1.3 mrg mpfr_init2 (q, p);
1138 1.1.1.3 mrg mpfr_init2 (q0, GMP_NUMB_BITS);
1139 1.1.1.3 mrg
1140 1.1.1.3 mrg /* generate a random divisor of p bits */
1141 1.1.1.5 mrg do
1142 1.1.1.5 mrg mpfr_urandomb (d, RANDS);
1143 1.1.1.5 mrg while (mpfr_zero_p (d));
1144 1.1.1.5 mrg /* generate a random non-zero quotient of GMP_NUMB_BITS bits */
1145 1.1.1.5 mrg do
1146 1.1.1.5 mrg mpfr_urandomb (q0, RANDS);
1147 1.1.1.5 mrg while (mpfr_zero_p (q0));
1148 1.1.1.3 mrg /* zero-pad the quotient to p bits */
1149 1.1.1.3 mrg inex = mpfr_prec_round (q0, p, MPFR_RNDN);
1150 1.1.1.3 mrg MPFR_ASSERTN(inex == 0);
1151 1.1.1.3 mrg
1152 1.1.1.3 mrg for (i = 0; i < 3; i++)
1153 1.1.1.3 mrg {
1154 1.1.1.3 mrg /* i=0: try with the original quotient xxx000...000
1155 1.1.1.3 mrg i=1: try with the original quotient minus one ulp
1156 1.1.1.3 mrg i=2: try with the original quotient plus one ulp */
1157 1.1.1.3 mrg if (i == 1)
1158 1.1.1.3 mrg mpfr_nextbelow (q0);
1159 1.1.1.3 mrg else if (i == 2)
1160 1.1.1.3 mrg {
1161 1.1.1.3 mrg mpfr_nextabove (q0);
1162 1.1.1.3 mrg mpfr_nextabove (q0);
1163 1.1.1.3 mrg }
1164 1.1.1.3 mrg
1165 1.1.1.3 mrg inex = mpfr_mul (n, d, q0, MPFR_RNDN);
1166 1.1.1.3 mrg MPFR_ASSERTN(inex == 0);
1167 1.1.1.3 mrg mpfr_nextabove (n);
1168 1.1.1.3 mrg mpfr_div (q, n, d, MPFR_RNDN);
1169 1.1.1.5 mrg if (! mpfr_equal_p (q, q0))
1170 1.1.1.5 mrg {
1171 1.1.1.5 mrg printf ("Error in test_20151023 for p=%ld, rnd=RNDN, i=%d\n",
1172 1.1.1.5 mrg (long) p, i);
1173 1.1.1.5 mrg printf ("n="); mpfr_dump (n);
1174 1.1.1.5 mrg printf ("d="); mpfr_dump (d);
1175 1.1.1.5 mrg printf ("expected q0="); mpfr_dump (q0);
1176 1.1.1.5 mrg printf ("got q="); mpfr_dump (q);
1177 1.1.1.5 mrg exit (1);
1178 1.1.1.5 mrg }
1179 1.1.1.3 mrg
1180 1.1.1.3 mrg inex = mpfr_mul (n, d, q0, MPFR_RNDN);
1181 1.1.1.3 mrg MPFR_ASSERTN(inex == 0);
1182 1.1.1.3 mrg mpfr_nextbelow (n);
1183 1.1.1.3 mrg mpfr_div (q, n, d, MPFR_RNDN);
1184 1.1.1.3 mrg MPFR_ASSERTN(mpfr_cmp (q, q0) == 0);
1185 1.1.1.3 mrg }
1186 1.1.1.3 mrg
1187 1.1.1.3 mrg mpfr_clear (n);
1188 1.1.1.3 mrg mpfr_clear (d);
1189 1.1.1.3 mrg mpfr_clear (q);
1190 1.1.1.3 mrg mpfr_clear (q0);
1191 1.1.1.3 mrg }
1192 1.1.1.3 mrg }
1193 1.1.1.3 mrg
1194 1.1.1.4 mrg /* test a random division of p+extra bits divided by p+extra bits,
1195 1.1.1.4 mrg with quotient of p bits only, where the p+extra bit approximation
1196 1.1.1.4 mrg of the quotient is very near a rounding frontier. */
1197 1.1.1.4 mrg static void
1198 1.1.1.4 mrg test_bad_aux (mpfr_prec_t p, mpfr_prec_t extra)
1199 1.1.1.4 mrg {
1200 1.1.1.4 mrg mpfr_t u, v, w, q0, q;
1201 1.1.1.4 mrg
1202 1.1.1.4 mrg mpfr_init2 (u, p + extra);
1203 1.1.1.4 mrg mpfr_init2 (v, p + extra);
1204 1.1.1.4 mrg mpfr_init2 (w, p + extra);
1205 1.1.1.4 mrg mpfr_init2 (q0, p);
1206 1.1.1.4 mrg mpfr_init2 (q, p);
1207 1.1.1.4 mrg do mpfr_urandomb (q0, RANDS); while (mpfr_zero_p (q0));
1208 1.1.1.4 mrg do mpfr_urandomb (v, RANDS); while (mpfr_zero_p (v));
1209 1.1.1.4 mrg
1210 1.1.1.4 mrg mpfr_set (w, q0, MPFR_RNDN); /* exact */
1211 1.1.1.4 mrg mpfr_nextabove (w); /* now w > q0 */
1212 1.1.1.4 mrg mpfr_mul (u, v, w, MPFR_RNDU); /* thus u > v*q0 */
1213 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDU); /* should have q > q0 */
1214 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) > 0);
1215 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDZ); /* should have q = q0 */
1216 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) == 0);
1217 1.1.1.4 mrg
1218 1.1.1.4 mrg mpfr_set (w, q0, MPFR_RNDN); /* exact */
1219 1.1.1.4 mrg mpfr_nextbelow (w); /* now w < q0 */
1220 1.1.1.4 mrg mpfr_mul (u, v, w, MPFR_RNDZ); /* thus u < v*q0 */
1221 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDZ); /* should have q < q0 */
1222 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) < 0);
1223 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDU); /* should have q = q0 */
1224 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) == 0);
1225 1.1.1.4 mrg
1226 1.1.1.4 mrg mpfr_clear (u);
1227 1.1.1.4 mrg mpfr_clear (v);
1228 1.1.1.4 mrg mpfr_clear (w);
1229 1.1.1.4 mrg mpfr_clear (q0);
1230 1.1.1.4 mrg mpfr_clear (q);
1231 1.1.1.4 mrg }
1232 1.1.1.4 mrg
1233 1.1.1.4 mrg static void
1234 1.1.1.4 mrg test_bad (void)
1235 1.1.1.4 mrg {
1236 1.1.1.4 mrg mpfr_prec_t p, extra;
1237 1.1.1.4 mrg
1238 1.1.1.4 mrg for (p = MPFR_PREC_MIN; p <= 1024; p += 17)
1239 1.1.1.4 mrg for (extra = 2; extra <= 64; extra++)
1240 1.1.1.4 mrg test_bad_aux (p, extra);
1241 1.1.1.4 mrg }
1242 1.1.1.4 mrg
1243 1.1 mrg #define TEST_FUNCTION test_div
1244 1.1 mrg #define TWO_ARGS
1245 1.1 mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
1246 1.1 mrg #include "tgeneric.c"
1247 1.1 mrg
1248 1.1.1.3 mrg static void
1249 1.1.1.3 mrg test_extreme (void)
1250 1.1.1.3 mrg {
1251 1.1.1.3 mrg mpfr_t x, y, z;
1252 1.1.1.3 mrg mpfr_exp_t emin, emax;
1253 1.1.1.3 mrg mpfr_prec_t p[4] = { 8, 32, 64, 256 };
1254 1.1.1.3 mrg int xi, yi, zi, j, r;
1255 1.1.1.3 mrg unsigned int flags, ex_flags;
1256 1.1.1.3 mrg
1257 1.1.1.3 mrg emin = mpfr_get_emin ();
1258 1.1.1.3 mrg emax = mpfr_get_emax ();
1259 1.1.1.3 mrg
1260 1.1.1.3 mrg mpfr_set_emin (MPFR_EMIN_MIN);
1261 1.1.1.3 mrg mpfr_set_emax (MPFR_EMAX_MAX);
1262 1.1.1.3 mrg
1263 1.1.1.3 mrg for (xi = 0; xi < 4; xi++)
1264 1.1.1.3 mrg {
1265 1.1.1.3 mrg mpfr_init2 (x, p[xi]);
1266 1.1.1.3 mrg mpfr_setmax (x, MPFR_EMAX_MAX);
1267 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (x));
1268 1.1.1.3 mrg for (yi = 0; yi < 4; yi++)
1269 1.1.1.3 mrg {
1270 1.1.1.3 mrg mpfr_init2 (y, p[yi]);
1271 1.1.1.3 mrg mpfr_setmin (y, MPFR_EMIN_MIN);
1272 1.1.1.3 mrg for (j = 0; j < 2; j++)
1273 1.1.1.3 mrg {
1274 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (y));
1275 1.1.1.3 mrg for (zi = 0; zi < 4; zi++)
1276 1.1.1.3 mrg {
1277 1.1.1.3 mrg mpfr_init2 (z, p[zi]);
1278 1.1.1.3 mrg RND_LOOP (r)
1279 1.1.1.3 mrg {
1280 1.1.1.3 mrg mpfr_clear_flags ();
1281 1.1.1.3 mrg mpfr_div (z, x, y, (mpfr_rnd_t) r);
1282 1.1.1.3 mrg flags = __gmpfr_flags;
1283 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (z));
1284 1.1.1.3 mrg ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT;
1285 1.1.1.3 mrg if (flags != ex_flags)
1286 1.1.1.3 mrg {
1287 1.1.1.3 mrg printf ("Bad flags in test_extreme on z = a/b"
1288 1.1.1.3 mrg " with %s and\n",
1289 1.1.1.3 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
1290 1.1.1.3 mrg printf ("a = ");
1291 1.1.1.3 mrg mpfr_dump (x);
1292 1.1.1.3 mrg printf ("b = ");
1293 1.1.1.3 mrg mpfr_dump (y);
1294 1.1.1.3 mrg printf ("Expected flags:");
1295 1.1.1.3 mrg flags_out (ex_flags);
1296 1.1.1.3 mrg printf ("Got flags: ");
1297 1.1.1.3 mrg flags_out (flags);
1298 1.1.1.3 mrg printf ("z = ");
1299 1.1.1.3 mrg mpfr_dump (z);
1300 1.1.1.3 mrg exit (1);
1301 1.1.1.3 mrg }
1302 1.1.1.3 mrg mpfr_clear_flags ();
1303 1.1.1.3 mrg mpfr_div (z, y, x, (mpfr_rnd_t) r);
1304 1.1.1.3 mrg flags = __gmpfr_flags;
1305 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (z));
1306 1.1.1.3 mrg ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT;
1307 1.1.1.3 mrg if (flags != ex_flags)
1308 1.1.1.3 mrg {
1309 1.1.1.3 mrg printf ("Bad flags in test_extreme on z = a/b"
1310 1.1.1.3 mrg " with %s and\n",
1311 1.1.1.3 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
1312 1.1.1.3 mrg printf ("a = ");
1313 1.1.1.3 mrg mpfr_dump (y);
1314 1.1.1.3 mrg printf ("b = ");
1315 1.1.1.3 mrg mpfr_dump (x);
1316 1.1.1.3 mrg printf ("Expected flags:");
1317 1.1.1.3 mrg flags_out (ex_flags);
1318 1.1.1.3 mrg printf ("Got flags: ");
1319 1.1.1.3 mrg flags_out (flags);
1320 1.1.1.3 mrg printf ("z = ");
1321 1.1.1.3 mrg mpfr_dump (z);
1322 1.1.1.3 mrg exit (1);
1323 1.1.1.3 mrg }
1324 1.1.1.3 mrg }
1325 1.1.1.3 mrg mpfr_clear (z);
1326 1.1.1.3 mrg } /* zi */
1327 1.1.1.3 mrg mpfr_nextabove (y);
1328 1.1.1.3 mrg } /* j */
1329 1.1.1.3 mrg mpfr_clear (y);
1330 1.1.1.3 mrg } /* yi */
1331 1.1.1.3 mrg mpfr_clear (x);
1332 1.1.1.3 mrg } /* xi */
1333 1.1.1.3 mrg
1334 1.1.1.3 mrg set_emin (emin);
1335 1.1.1.3 mrg set_emax (emax);
1336 1.1.1.3 mrg }
1337 1.1.1.3 mrg
1338 1.1.1.4 mrg static void
1339 1.1.1.4 mrg testall_rndf (mpfr_prec_t pmax)
1340 1.1.1.4 mrg {
1341 1.1.1.4 mrg mpfr_t a, b, c, d;
1342 1.1.1.4 mrg mpfr_prec_t pa, pb, pc;
1343 1.1.1.4 mrg
1344 1.1.1.4 mrg for (pa = MPFR_PREC_MIN; pa <= pmax; pa++)
1345 1.1.1.4 mrg {
1346 1.1.1.4 mrg mpfr_init2 (a, pa);
1347 1.1.1.4 mrg mpfr_init2 (d, pa);
1348 1.1.1.4 mrg for (pb = MPFR_PREC_MIN; pb <= pmax; pb++)
1349 1.1.1.4 mrg {
1350 1.1.1.4 mrg mpfr_init2 (b, pb);
1351 1.1.1.4 mrg mpfr_set_ui (b, 1, MPFR_RNDN);
1352 1.1.1.4 mrg while (mpfr_cmp_ui (b, 2) < 0)
1353 1.1.1.4 mrg {
1354 1.1.1.4 mrg for (pc = MPFR_PREC_MIN; pc <= pmax; pc++)
1355 1.1.1.4 mrg {
1356 1.1.1.4 mrg mpfr_init2 (c, pc);
1357 1.1.1.4 mrg mpfr_set_ui (c, 1, MPFR_RNDN);
1358 1.1.1.4 mrg while (mpfr_cmp_ui (c, 2) < 0)
1359 1.1.1.4 mrg {
1360 1.1.1.4 mrg mpfr_div (a, b, c, MPFR_RNDF);
1361 1.1.1.4 mrg mpfr_div (d, b, c, MPFR_RNDD);
1362 1.1.1.4 mrg if (!mpfr_equal_p (a, d))
1363 1.1.1.4 mrg {
1364 1.1.1.4 mrg mpfr_div (d, b, c, MPFR_RNDU);
1365 1.1.1.4 mrg if (!mpfr_equal_p (a, d))
1366 1.1.1.4 mrg {
1367 1.1.1.4 mrg printf ("Error: mpfr_div(a,b,c,RNDF) does not "
1368 1.1.1.4 mrg "match RNDD/RNDU\n");
1369 1.1.1.4 mrg printf ("b="); mpfr_dump (b);
1370 1.1.1.4 mrg printf ("c="); mpfr_dump (c);
1371 1.1.1.4 mrg printf ("a="); mpfr_dump (a);
1372 1.1.1.4 mrg exit (1);
1373 1.1.1.4 mrg }
1374 1.1.1.4 mrg }
1375 1.1.1.4 mrg mpfr_nextabove (c);
1376 1.1.1.4 mrg }
1377 1.1.1.4 mrg mpfr_clear (c);
1378 1.1.1.4 mrg }
1379 1.1.1.4 mrg mpfr_nextabove (b);
1380 1.1.1.4 mrg }
1381 1.1.1.4 mrg mpfr_clear (b);
1382 1.1.1.4 mrg }
1383 1.1.1.4 mrg mpfr_clear (a);
1384 1.1.1.4 mrg mpfr_clear (d);
1385 1.1.1.4 mrg }
1386 1.1.1.4 mrg }
1387 1.1.1.4 mrg
1388 1.1.1.4 mrg static void
1389 1.1.1.4 mrg test_mpfr_divsp2 (void)
1390 1.1.1.4 mrg {
1391 1.1.1.4 mrg mpfr_t u, v, q;
1392 1.1.1.4 mrg
1393 1.1.1.4 mrg /* test to exercise r2 = v1 in mpfr_divsp2 */
1394 1.1.1.4 mrg mpfr_init2 (u, 128);
1395 1.1.1.4 mrg mpfr_init2 (v, 128);
1396 1.1.1.4 mrg mpfr_init2 (q, 83);
1397 1.1.1.4 mrg
1398 1.1.1.4 mrg mpfr_set_str (u, "286677858044426991425771529092412636160", 10, MPFR_RNDN);
1399 1.1.1.4 mrg mpfr_set_str (v, "241810647971575979588130185988987264768", 10, MPFR_RNDN);
1400 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN);
1401 1.1.1.4 mrg mpfr_set_str (u, "5732952910203749289426944", 10, MPFR_RNDN);
1402 1.1.1.5 mrg mpfr_div_2ui (u, u, 82, MPFR_RNDN);
1403 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (q, u));
1404 1.1.1.4 mrg
1405 1.1.1.4 mrg mpfr_clear (u);
1406 1.1.1.4 mrg mpfr_clear (v);
1407 1.1.1.4 mrg mpfr_clear (q);
1408 1.1.1.4 mrg }
1409 1.1.1.4 mrg
1410 1.1.1.4 mrg /* Assertion failure in r10769 with --enable-assert --enable-gmp-internals
1411 1.1.1.4 mrg (same failure in tatan on a similar example). */
1412 1.1.1.4 mrg static void
1413 1.1.1.4 mrg test_20160831 (void)
1414 1.1.1.4 mrg {
1415 1.1.1.4 mrg mpfr_t u, v, q;
1416 1.1.1.4 mrg
1417 1.1.1.4 mrg mpfr_inits2 (124, u, v, q, (mpfr_ptr) 0);
1418 1.1.1.4 mrg
1419 1.1.1.4 mrg mpfr_set_ui (u, 1, MPFR_RNDN);
1420 1.1.1.4 mrg mpfr_set_str (v, "0x40000000000000005", 16, MPFR_RNDN);
1421 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN);
1422 1.1.1.4 mrg mpfr_set_str (u, "0xfffffffffffffffecp-134", 16, MPFR_RNDN);
1423 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (q, u));
1424 1.1.1.4 mrg
1425 1.1.1.4 mrg mpfr_set_prec (u, 128);
1426 1.1.1.4 mrg mpfr_set_prec (v, 128);
1427 1.1.1.4 mrg mpfr_set_str (u, "186127091671619245460026015088243485690", 10, MPFR_RNDN);
1428 1.1.1.4 mrg mpfr_set_str (v, "205987256581218236405412302590110119580", 10, MPFR_RNDN);
1429 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN);
1430 1.1.1.4 mrg mpfr_set_str (u, "19217137613667309953639458782352244736", 10, MPFR_RNDN);
1431 1.1.1.5 mrg mpfr_div_2ui (u, u, 124, MPFR_RNDN);
1432 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (q, u));
1433 1.1.1.4 mrg
1434 1.1.1.4 mrg mpfr_clears (u, v, q, (mpfr_ptr) 0);
1435 1.1.1.4 mrg }
1436 1.1.1.4 mrg
1437 1.1.1.4 mrg /* With r11138, on a 64-bit machine:
1438 1.1.1.4 mrg div.c:128: MPFR assertion failed: qx >= __gmpfr_emin
1439 1.1.1.4 mrg */
1440 1.1.1.4 mrg static void
1441 1.1.1.4 mrg test_20170104 (void)
1442 1.1.1.4 mrg {
1443 1.1.1.4 mrg mpfr_t u, v, q;
1444 1.1.1.4 mrg mpfr_exp_t emin;
1445 1.1.1.4 mrg
1446 1.1.1.4 mrg emin = mpfr_get_emin ();
1447 1.1.1.4 mrg set_emin (-42);
1448 1.1.1.4 mrg
1449 1.1.1.4 mrg mpfr_init2 (u, 12);
1450 1.1.1.4 mrg mpfr_init2 (v, 12);
1451 1.1.1.4 mrg mpfr_init2 (q, 11);
1452 1.1.1.4 mrg mpfr_set_str_binary (u, "0.111111111110E-29");
1453 1.1.1.4 mrg mpfr_set_str_binary (v, "0.111111111111E14");
1454 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN);
1455 1.1.1.4 mrg mpfr_clears (u, v, q, (mpfr_ptr) 0);
1456 1.1.1.4 mrg
1457 1.1.1.4 mrg set_emin (emin);
1458 1.1.1.4 mrg }
1459 1.1.1.4 mrg
1460 1.1.1.4 mrg /* With r11140, on a 64-bit machine with GMP_CHECK_RANDOMIZE=1484406128:
1461 1.1.1.4 mrg Consistency error for i = 2577
1462 1.1.1.4 mrg */
1463 1.1.1.4 mrg static void
1464 1.1.1.4 mrg test_20170105 (void)
1465 1.1.1.4 mrg {
1466 1.1.1.4 mrg mpfr_t x, y, z, t;
1467 1.1.1.4 mrg
1468 1.1.1.4 mrg mpfr_init2 (x, 138);
1469 1.1.1.4 mrg mpfr_init2 (y, 6);
1470 1.1.1.4 mrg mpfr_init2 (z, 128);
1471 1.1.1.4 mrg mpfr_init2 (t, 128);
1472 1.1.1.4 mrg mpfr_set_str_binary (x, "0.100110111001001000101111010010011101111110111111110001110100000001110111010100111010100011101010110000010100000011100100110101101011000000E-6");
1473 1.1.1.4 mrg mpfr_set_str_binary (y, "0.100100E-2");
1474 1.1.1.4 mrg /* up to exponents, x/y is exactly 367625553447399614694201910705139062483,
1475 1.1.1.4 mrg which has 129 bits, thus we are in the round-to-nearest-even case, and since
1476 1.1.1.4 mrg the penultimate bit of x/y is 1, we should round upwards */
1477 1.1.1.4 mrg mpfr_set_str_binary (t, "0.10001010010010010000110110010110111111111100011011101010000000000110101000010001011110011011010000111010000000001100101101101010E-3");
1478 1.1.1.4 mrg mpfr_div (z, x, y, MPFR_RNDN);
1479 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (z, t));
1480 1.1.1.4 mrg mpfr_clears (x, y, z, t, (mpfr_ptr) 0);
1481 1.1.1.4 mrg }
1482 1.1.1.4 mrg
1483 1.1.1.4 mrg /* The real cause of the mpfr_ttanh failure from the non-regression test
1484 1.1.1.4 mrg added in tests/ttanh.c@11993 was actually due to a bug in mpfr_div, as
1485 1.1.1.4 mrg this can be seen by comparing the logs of the 3.1 branch and the trunk
1486 1.1.1.4 mrg r11992 with MPFR_LOG_ALL=1 MPFR_LOG_PREC=50 on this particular test
1487 1.1.1.4 mrg (this was noticed because adding this test to the 3.1 branch did not
1488 1.1.1.4 mrg yield a failure like in the trunk, though the mpfr_ttanh code did not
1489 1.1.1.4 mrg change until r11993). This was the bug actually fixed in r12002.
1490 1.1.1.4 mrg */
1491 1.1.1.4 mrg static void
1492 1.1.1.4 mrg test_20171219 (void)
1493 1.1.1.4 mrg {
1494 1.1.1.4 mrg mpfr_t x, y, z, t;
1495 1.1.1.4 mrg
1496 1.1.1.4 mrg mpfr_inits2 (126, x, y, z, t, (mpfr_ptr) 0);
1497 1.1.1.4 mrg mpfr_set_str_binary (x, "0.111000000000000111100000000000011110000000000001111000000000000111100000000000011110000000000001111000000000000111100000000000E1");
1498 1.1.1.4 mrg /* x = 36347266450315671364380109803814927 / 2^114 */
1499 1.1.1.4 mrg mpfr_add_ui (y, x, 2, MPFR_RNDN);
1500 1.1.1.4 mrg /* y = 77885641318594292392624080437575695 / 2^114 */
1501 1.1.1.4 mrg mpfr_div (z, x, y, MPFR_RNDN);
1502 1.1.1.4 mrg mpfr_set_ui_2exp (t, 3823, -13, MPFR_RNDN);
1503 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (z, t));
1504 1.1.1.4 mrg mpfr_clears (x, y, z, t, (mpfr_ptr) 0);
1505 1.1.1.4 mrg }
1506 1.1.1.4 mrg
1507 1.1.1.4 mrg #if !defined(MPFR_GENERIC_ABI) && GMP_NUMB_BITS == 64
1508 1.1.1.4 mrg /* exercise mpfr_div2_approx */
1509 1.1.1.4 mrg static void
1510 1.1.1.4 mrg test_mpfr_div2_approx (unsigned long n)
1511 1.1.1.4 mrg {
1512 1.1.1.4 mrg mpfr_t x, y, z;
1513 1.1.1.4 mrg
1514 1.1.1.4 mrg mpfr_init2 (x, 113);
1515 1.1.1.4 mrg mpfr_init2 (y, 113);
1516 1.1.1.4 mrg mpfr_init2 (z, 113);
1517 1.1.1.4 mrg while (n--)
1518 1.1.1.4 mrg {
1519 1.1.1.4 mrg mpfr_urandomb (x, RANDS);
1520 1.1.1.4 mrg mpfr_urandomb (y, RANDS);
1521 1.1.1.4 mrg mpfr_div (z, x, y, MPFR_RNDN);
1522 1.1.1.4 mrg }
1523 1.1.1.4 mrg mpfr_clear (x);
1524 1.1.1.4 mrg mpfr_clear (y);
1525 1.1.1.4 mrg mpfr_clear (z);
1526 1.1.1.4 mrg }
1527 1.1.1.4 mrg #endif
1528 1.1.1.4 mrg
1529 1.1.1.4 mrg /* bug found in ttan with GMP_CHECK_RANDOMIZE=1514257254 */
1530 1.1.1.4 mrg static void
1531 1.1.1.4 mrg bug20171218 (void)
1532 1.1.1.4 mrg {
1533 1.1.1.4 mrg mpfr_t s, c;
1534 1.1.1.4 mrg mpfr_init2 (s, 124);
1535 1.1.1.4 mrg mpfr_init2 (c, 124);
1536 1.1.1.4 mrg mpfr_set_str_binary (s, "-0.1110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110E0");
1537 1.1.1.4 mrg mpfr_set_str_binary (c, "0.1111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111E-1");
1538 1.1.1.4 mrg mpfr_div (c, s, c, MPFR_RNDN);
1539 1.1.1.4 mrg mpfr_set_str_binary (s, "-1.111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
1540 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (c, s));
1541 1.1.1.4 mrg mpfr_clear (s);
1542 1.1.1.4 mrg mpfr_clear (c);
1543 1.1.1.4 mrg }
1544 1.1.1.4 mrg
1545 1.1.1.4 mrg /* Extended test based on a bug found with flint-arb test suite with a
1546 1.1.1.4 mrg 32-bit ABI: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=888459
1547 1.1.1.4 mrg Division of the form: (1 - 2^(-pa)) / (1 - 2^(-pb)).
1548 1.1.1.4 mrg The result is compared to the one obtained by increasing the precision of
1549 1.1.1.4 mrg the divisor (without changing its value, so that both results should be
1550 1.1.1.4 mrg equal). For all of these tests, a failure may occur in r12126 only with
1551 1.1.1.4 mrg pb=GMP_NUMB_BITS and MPFR_RNDN (and some particular values of pa and pc).
1552 1.1.1.4 mrg This bug was introduced by r9086, where mpfr_div uses mpfr_div_ui when
1553 1.1.1.4 mrg the divisor has only one limb.
1554 1.1.1.4 mrg */
1555 1.1.1.4 mrg static void
1556 1.1.1.4 mrg bug20180126 (void)
1557 1.1.1.4 mrg {
1558 1.1.1.4 mrg mpfr_t a, b1, b2, c1, c2;
1559 1.1.1.4 mrg int pa, i, j, pc, sa, sb, r, inex1, inex2;
1560 1.1.1.4 mrg
1561 1.1.1.4 mrg for (pa = 100; pa < 800; pa += 11)
1562 1.1.1.4 mrg for (i = 1; i <= 4; i++)
1563 1.1.1.4 mrg for (j = -2; j <= 2; j++)
1564 1.1.1.4 mrg {
1565 1.1.1.4 mrg int pb = GMP_NUMB_BITS * i + j;
1566 1.1.1.4 mrg
1567 1.1.1.4 mrg if (pb > pa)
1568 1.1.1.4 mrg continue;
1569 1.1.1.4 mrg
1570 1.1.1.4 mrg mpfr_inits2 (pa, a, b1, (mpfr_ptr) 0);
1571 1.1.1.4 mrg mpfr_inits2 (pb, b2, (mpfr_ptr) 0);
1572 1.1.1.4 mrg
1573 1.1.1.4 mrg mpfr_set_ui (a, 1, MPFR_RNDN);
1574 1.1.1.4 mrg mpfr_nextbelow (a); /* 1 - 2^(-pa) */
1575 1.1.1.4 mrg mpfr_set_ui (b2, 1, MPFR_RNDN);
1576 1.1.1.4 mrg mpfr_nextbelow (b2); /* 1 - 2^(-pb) */
1577 1.1.1.4 mrg inex1 = mpfr_set (b1, b2, MPFR_RNDN);
1578 1.1.1.4 mrg MPFR_ASSERTN (inex1 == 0);
1579 1.1.1.4 mrg
1580 1.1.1.4 mrg for (pc = 32; pc <= 320; pc += 32)
1581 1.1.1.4 mrg {
1582 1.1.1.4 mrg mpfr_inits2 (pc, c1, c2, (mpfr_ptr) 0);
1583 1.1.1.4 mrg
1584 1.1.1.4 mrg for (sa = 0; sa < 2; sa++)
1585 1.1.1.4 mrg {
1586 1.1.1.4 mrg for (sb = 0; sb < 2; sb++)
1587 1.1.1.4 mrg {
1588 1.1.1.4 mrg RND_LOOP_NO_RNDF (r)
1589 1.1.1.4 mrg {
1590 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (b1, b2));
1591 1.1.1.4 mrg inex1 = mpfr_div (c1, a, b1, (mpfr_rnd_t) r);
1592 1.1.1.4 mrg inex2 = mpfr_div (c2, a, b2, (mpfr_rnd_t) r);
1593 1.1.1.4 mrg
1594 1.1.1.4 mrg if (! mpfr_equal_p (c1, c2) ||
1595 1.1.1.4 mrg ! SAME_SIGN (inex1, inex2))
1596 1.1.1.4 mrg {
1597 1.1.1.4 mrg printf ("Error in bug20180126 for "
1598 1.1.1.4 mrg "pa=%d pb=%d pc=%d sa=%d sb=%d %s\n",
1599 1.1.1.4 mrg pa, pb, pc, sa, sb,
1600 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
1601 1.1.1.4 mrg printf ("inex1 = %d, c1 = ", inex1);
1602 1.1.1.4 mrg mpfr_dump (c1);
1603 1.1.1.4 mrg printf ("inex2 = %d, c2 = ", inex2);
1604 1.1.1.4 mrg mpfr_dump (c2);
1605 1.1.1.4 mrg exit (1);
1606 1.1.1.4 mrg }
1607 1.1.1.4 mrg }
1608 1.1.1.4 mrg
1609 1.1.1.4 mrg mpfr_neg (b1, b1, MPFR_RNDN);
1610 1.1.1.4 mrg mpfr_neg (b2, b2, MPFR_RNDN);
1611 1.1.1.4 mrg } /* sb */
1612 1.1.1.4 mrg
1613 1.1.1.4 mrg mpfr_neg (a, a, MPFR_RNDN);
1614 1.1.1.4 mrg } /* sa */
1615 1.1.1.4 mrg
1616 1.1.1.4 mrg mpfr_clears (c1, c2, (mpfr_ptr) 0);
1617 1.1.1.4 mrg } /* pc */
1618 1.1.1.4 mrg
1619 1.1.1.4 mrg mpfr_clears (a, b1, b2, (mpfr_ptr) 0);
1620 1.1.1.4 mrg } /* j */
1621 1.1.1.4 mrg }
1622 1.1.1.4 mrg
1623 1.1.1.5 mrg static void
1624 1.1.1.5 mrg coverage (mpfr_prec_t pmax)
1625 1.1.1.5 mrg {
1626 1.1.1.5 mrg mpfr_prec_t p;
1627 1.1.1.5 mrg
1628 1.1.1.5 mrg for (p = MPFR_PREC_MIN; p <= pmax; p++)
1629 1.1.1.5 mrg {
1630 1.1.1.5 mrg int inex;
1631 1.1.1.5 mrg mpfr_t q, u, v;
1632 1.1.1.5 mrg
1633 1.1.1.5 mrg mpfr_init2 (q, p);
1634 1.1.1.5 mrg mpfr_init2 (u, p);
1635 1.1.1.5 mrg mpfr_init2 (v, p);
1636 1.1.1.5 mrg
1637 1.1.1.5 mrg /* exercise case qx < emin */
1638 1.1.1.5 mrg mpfr_set_ui_2exp (u, 1, mpfr_get_emin (), MPFR_RNDN);
1639 1.1.1.5 mrg mpfr_set_ui (v, 4, MPFR_RNDN);
1640 1.1.1.5 mrg
1641 1.1.1.5 mrg mpfr_clear_flags ();
1642 1.1.1.5 mrg /* u/v = 2^(emin-2), should be rounded to +0 for RNDN */
1643 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDN);
1644 1.1.1.5 mrg MPFR_ASSERTN(inex < 0);
1645 1.1.1.5 mrg MPFR_ASSERTN(mpfr_zero_p (q) && mpfr_signbit (q) == 0);
1646 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1647 1.1.1.5 mrg
1648 1.1.1.5 mrg mpfr_clear_flags ();
1649 1.1.1.5 mrg /* u/v = 2^(emin-2), should be rounded to 2^(emin-1) for RNDU */
1650 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDU);
1651 1.1.1.5 mrg MPFR_ASSERTN(inex > 0);
1652 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (q, 1, mpfr_get_emin () - 1) == 0);
1653 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1654 1.1.1.5 mrg
1655 1.1.1.5 mrg mpfr_clear_flags ();
1656 1.1.1.5 mrg /* u/v = 2^(emin-2), should be rounded to +0 for RNDZ */
1657 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDZ);
1658 1.1.1.5 mrg MPFR_ASSERTN(inex < 0);
1659 1.1.1.5 mrg MPFR_ASSERTN(mpfr_zero_p (q) && mpfr_signbit (q) == 0);
1660 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1661 1.1.1.5 mrg
1662 1.1.1.5 mrg if (p == 1)
1663 1.1.1.5 mrg goto end_of_loop;
1664 1.1.1.5 mrg
1665 1.1.1.5 mrg mpfr_set_ui_2exp (u, 1, mpfr_get_emin (), MPFR_RNDN);
1666 1.1.1.5 mrg mpfr_nextbelow (u); /* u = (1-2^(-p))*2^emin */
1667 1.1.1.5 mrg mpfr_set_ui (v, 2, MPFR_RNDN);
1668 1.1.1.5 mrg
1669 1.1.1.5 mrg mpfr_clear_flags ();
1670 1.1.1.5 mrg /* u/v = (1-2^(-p))*2^(emin-1), will round to 2^(emin-1) for RNDN */
1671 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDN);
1672 1.1.1.5 mrg MPFR_ASSERTN(inex > 0);
1673 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (q, 1, mpfr_get_emin () - 1) == 0);
1674 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1675 1.1.1.5 mrg
1676 1.1.1.5 mrg mpfr_clear_flags ();
1677 1.1.1.5 mrg /* u/v should round to 2^(emin-1) for RNDU */
1678 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDU);
1679 1.1.1.5 mrg MPFR_ASSERTN(inex > 0);
1680 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (q, 1, mpfr_get_emin () - 1) == 0);
1681 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1682 1.1.1.5 mrg
1683 1.1.1.5 mrg mpfr_clear_flags ();
1684 1.1.1.5 mrg /* u/v should round to +0 for RNDZ */
1685 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDZ);
1686 1.1.1.5 mrg MPFR_ASSERTN(inex < 0);
1687 1.1.1.5 mrg MPFR_ASSERTN(mpfr_zero_p (q) && mpfr_signbit (q) == 0);
1688 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1689 1.1.1.5 mrg
1690 1.1.1.5 mrg end_of_loop:
1691 1.1.1.5 mrg mpfr_clear (q);
1692 1.1.1.5 mrg mpfr_clear (u);
1693 1.1.1.5 mrg mpfr_clear (v);
1694 1.1.1.5 mrg }
1695 1.1.1.5 mrg }
1696 1.1.1.5 mrg
1697 1.1.1.5 mrg /* coverage for case usize >= n + n in Mulders' algorithm */
1698 1.1.1.5 mrg static void
1699 1.1.1.5 mrg coverage2 (void)
1700 1.1.1.5 mrg {
1701 1.1.1.5 mrg mpfr_prec_t p;
1702 1.1.1.5 mrg mpfr_t q, u, v, t, w;
1703 1.1.1.5 mrg int inex, inex2;
1704 1.1.1.5 mrg
1705 1.1.1.5 mrg p = MPFR_DIV_THRESHOLD * GMP_NUMB_BITS;
1706 1.1.1.5 mrg mpfr_init2 (q, p);
1707 1.1.1.5 mrg mpfr_init2 (u, 2 * p + 3 * GMP_NUMB_BITS);
1708 1.1.1.5 mrg mpfr_init2 (v, p);
1709 1.1.1.5 mrg do mpfr_urandomb (u, RANDS); while (mpfr_zero_p (u));
1710 1.1.1.5 mrg do mpfr_urandomb (v, RANDS); while (mpfr_zero_p (v));
1711 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDN);
1712 1.1.1.5 mrg mpfr_init2 (t, mpfr_get_prec (u));
1713 1.1.1.5 mrg mpfr_init2 (w, mpfr_get_prec (u));
1714 1.1.1.5 mrg inex2 = mpfr_mul (t, q, v, MPFR_RNDN);
1715 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0);
1716 1.1.1.5 mrg if (inex == 0) /* check q*v = u */
1717 1.1.1.5 mrg MPFR_ASSERTN(mpfr_equal_p (u, t));
1718 1.1.1.5 mrg else
1719 1.1.1.5 mrg {
1720 1.1.1.5 mrg if (inex > 0)
1721 1.1.1.5 mrg mpfr_nextbelow (q);
1722 1.1.1.5 mrg else
1723 1.1.1.5 mrg mpfr_nextabove (q);
1724 1.1.1.5 mrg inex2 = mpfr_mul (w, q, v, MPFR_RNDN);
1725 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0);
1726 1.1.1.5 mrg inex2 = mpfr_sub (t, t, u, MPFR_RNDN);
1727 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0);
1728 1.1.1.5 mrg inex2 = mpfr_sub (w, w, u, MPFR_RNDN);
1729 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0);
1730 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmpabs (t, w) <= 0);
1731 1.1.1.5 mrg if (mpfr_cmpabs (t, w) == 0) /* even rule: significand of q should now
1732 1.1.1.5 mrg be odd */
1733 1.1.1.5 mrg MPFR_ASSERTN(mpfr_min_prec (q) == mpfr_get_prec (q));
1734 1.1.1.5 mrg }
1735 1.1.1.5 mrg
1736 1.1.1.5 mrg mpfr_clear (q);
1737 1.1.1.5 mrg mpfr_clear (u);
1738 1.1.1.5 mrg mpfr_clear (v);
1739 1.1.1.5 mrg mpfr_clear (t);
1740 1.1.1.5 mrg mpfr_clear (w);
1741 1.1.1.5 mrg }
1742 1.1.1.5 mrg
1743 1.1 mrg int
1744 1.1 mrg main (int argc, char *argv[])
1745 1.1 mrg {
1746 1.1 mrg tests_start_mpfr ();
1747 1.1 mrg
1748 1.1.1.5 mrg coverage (1024);
1749 1.1.1.5 mrg coverage2 ();
1750 1.1.1.4 mrg bug20180126 ();
1751 1.1.1.4 mrg bug20171218 ();
1752 1.1.1.4 mrg testall_rndf (9);
1753 1.1.1.4 mrg test_20170105 ();
1754 1.1 mrg check_inexact ();
1755 1.1 mrg check_hard ();
1756 1.1.1.2 mrg check_special ();
1757 1.1 mrg check_lowr ();
1758 1.1 mrg check_float (); /* checks single precision */
1759 1.1 mrg check_double ();
1760 1.1 mrg check_convergence ();
1761 1.1 mrg check_64 ();
1762 1.1 mrg
1763 1.1 mrg check4("4.0","4.503599627370496e15", MPFR_RNDZ, 62,
1764 1.1 mrg "0.10000000000000000000000000000000000000000000000000000000000000E-49");
1765 1.1 mrg check4("1.0","2.10263340267725788209e+187", MPFR_RNDU, 65,
1766 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-622");
1767 1.1 mrg check4("2.44394909079968374564e-150", "2.10263340267725788209e+187",MPFR_RNDU,
1768 1.1 mrg 65,
1769 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-1119");
1770 1.1 mrg
1771 1.1 mrg consistency ();
1772 1.1 mrg test_20070603 ();
1773 1.1 mrg test_20070628 ();
1774 1.1.1.3 mrg test_20151023 ();
1775 1.1.1.4 mrg test_20160831 ();
1776 1.1.1.4 mrg test_20170104 ();
1777 1.1.1.4 mrg test_20171219 ();
1778 1.1.1.4 mrg test_generic (MPFR_PREC_MIN, 800, 50);
1779 1.1.1.4 mrg test_bad ();
1780 1.1.1.3 mrg test_extreme ();
1781 1.1.1.4 mrg test_mpfr_divsp2 ();
1782 1.1.1.4 mrg #if !defined(MPFR_GENERIC_ABI) && GMP_NUMB_BITS == 64
1783 1.1.1.4 mrg test_mpfr_div2_approx (1000000);
1784 1.1.1.4 mrg #endif
1785 1.1 mrg
1786 1.1 mrg tests_end_mpfr ();
1787 1.1 mrg return 0;
1788 1.1 mrg }
1789