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