tdiv.c revision 1.1.1.6 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.6 mrg Copyright 1999, 2001-2023 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.1.6 mrg get_inexact (mpfr_ptr y, mpfr_ptr x, mpfr_ptr 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.1.6 mrg set_emax (256);
1086 1.1 mrg
1087 1.1 mrg mpfr_inits2 (53, x, y, (mpfr_ptr) 0);
1088 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
1089 1.1 mrg mpfr_set_si_2exp (y, 1, -256, MPFR_RNDN);
1090 1.1 mrg mpfr_clear_flags ();
1091 1.1 mrg inex = mpfr_div (x, x, y, MPFR_RNDD);
1092 1.1.1.4 mrg if (MPFR_IS_POS (x) || ! mpfr_inf_p (x))
1093 1.1 mrg {
1094 1.1 mrg printf ("Error in test_20070628: expected -Inf, got\n");
1095 1.1 mrg mpfr_dump (x);
1096 1.1 mrg err++;
1097 1.1 mrg }
1098 1.1 mrg if (inex >= 0)
1099 1.1 mrg {
1100 1.1 mrg printf ("Error in test_20070628: expected inex < 0, got %d\n", inex);
1101 1.1 mrg err++;
1102 1.1 mrg }
1103 1.1 mrg if (! mpfr_overflow_p ())
1104 1.1 mrg {
1105 1.1 mrg printf ("Error in test_20070628: overflow flag is not set\n");
1106 1.1 mrg err++;
1107 1.1 mrg }
1108 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0);
1109 1.1.1.6 mrg set_emax (old_emax);
1110 1.1 mrg }
1111 1.1 mrg
1112 1.1.1.3 mrg /* Bug in mpfr_divhigh_n_basecase when all limbs of q (except the most
1113 1.1.1.3 mrg significant one) are B-1 where B=2^GMP_NUMB_BITS. Since we truncate
1114 1.1.1.3 mrg the divisor at each step, it might happen at some point that
1115 1.1.1.3 mrg (np[n-1],np[n-2]) > (d1,d0), and not only the equality.
1116 1.1.1.3 mrg Reported by Ricky Farr
1117 1.1.1.3 mrg <https://sympa.inria.fr/sympa/arc/mpfr/2015-10/msg00023.html>
1118 1.1.1.3 mrg To get a failure, a MPFR_DIVHIGH_TAB entry below the MPFR_DIV_THRESHOLD
1119 1.1.1.4 mrg limit must have a value 0. With most mparam.h files, this cannot occur. To
1120 1.1.1.4 mrg make the bug appear, one can configure MPFR with -DMPFR_TUNE_COVERAGE. */
1121 1.1.1.3 mrg static void
1122 1.1.1.3 mrg test_20151023 (void)
1123 1.1.1.3 mrg {
1124 1.1.1.3 mrg mpfr_prec_t p;
1125 1.1.1.3 mrg mpfr_t n, d, q, q0;
1126 1.1.1.3 mrg int inex, i;
1127 1.1.1.3 mrg
1128 1.1.1.3 mrg for (p = GMP_NUMB_BITS; p <= 2000; p++)
1129 1.1.1.3 mrg {
1130 1.1.1.3 mrg mpfr_init2 (n, 2*p);
1131 1.1.1.3 mrg mpfr_init2 (d, p);
1132 1.1.1.3 mrg mpfr_init2 (q, p);
1133 1.1.1.3 mrg mpfr_init2 (q0, GMP_NUMB_BITS);
1134 1.1.1.3 mrg
1135 1.1.1.3 mrg /* generate a random divisor of p bits */
1136 1.1.1.5 mrg do
1137 1.1.1.5 mrg mpfr_urandomb (d, RANDS);
1138 1.1.1.5 mrg while (mpfr_zero_p (d));
1139 1.1.1.5 mrg /* generate a random non-zero quotient of GMP_NUMB_BITS bits */
1140 1.1.1.5 mrg do
1141 1.1.1.5 mrg mpfr_urandomb (q0, RANDS);
1142 1.1.1.5 mrg while (mpfr_zero_p (q0));
1143 1.1.1.3 mrg /* zero-pad the quotient to p bits */
1144 1.1.1.3 mrg inex = mpfr_prec_round (q0, p, MPFR_RNDN);
1145 1.1.1.3 mrg MPFR_ASSERTN(inex == 0);
1146 1.1.1.3 mrg
1147 1.1.1.3 mrg for (i = 0; i < 3; i++)
1148 1.1.1.3 mrg {
1149 1.1.1.3 mrg /* i=0: try with the original quotient xxx000...000
1150 1.1.1.3 mrg i=1: try with the original quotient minus one ulp
1151 1.1.1.3 mrg i=2: try with the original quotient plus one ulp */
1152 1.1.1.3 mrg if (i == 1)
1153 1.1.1.3 mrg mpfr_nextbelow (q0);
1154 1.1.1.3 mrg else if (i == 2)
1155 1.1.1.3 mrg {
1156 1.1.1.3 mrg mpfr_nextabove (q0);
1157 1.1.1.3 mrg mpfr_nextabove (q0);
1158 1.1.1.3 mrg }
1159 1.1.1.3 mrg
1160 1.1.1.3 mrg inex = mpfr_mul (n, d, q0, MPFR_RNDN);
1161 1.1.1.3 mrg MPFR_ASSERTN(inex == 0);
1162 1.1.1.3 mrg mpfr_nextabove (n);
1163 1.1.1.3 mrg mpfr_div (q, n, d, MPFR_RNDN);
1164 1.1.1.5 mrg if (! mpfr_equal_p (q, q0))
1165 1.1.1.5 mrg {
1166 1.1.1.5 mrg printf ("Error in test_20151023 for p=%ld, rnd=RNDN, i=%d\n",
1167 1.1.1.5 mrg (long) p, i);
1168 1.1.1.5 mrg printf ("n="); mpfr_dump (n);
1169 1.1.1.5 mrg printf ("d="); mpfr_dump (d);
1170 1.1.1.5 mrg printf ("expected q0="); mpfr_dump (q0);
1171 1.1.1.5 mrg printf ("got q="); mpfr_dump (q);
1172 1.1.1.5 mrg exit (1);
1173 1.1.1.5 mrg }
1174 1.1.1.3 mrg
1175 1.1.1.3 mrg inex = mpfr_mul (n, d, q0, MPFR_RNDN);
1176 1.1.1.3 mrg MPFR_ASSERTN(inex == 0);
1177 1.1.1.3 mrg mpfr_nextbelow (n);
1178 1.1.1.3 mrg mpfr_div (q, n, d, MPFR_RNDN);
1179 1.1.1.3 mrg MPFR_ASSERTN(mpfr_cmp (q, q0) == 0);
1180 1.1.1.3 mrg }
1181 1.1.1.3 mrg
1182 1.1.1.3 mrg mpfr_clear (n);
1183 1.1.1.3 mrg mpfr_clear (d);
1184 1.1.1.3 mrg mpfr_clear (q);
1185 1.1.1.3 mrg mpfr_clear (q0);
1186 1.1.1.3 mrg }
1187 1.1.1.3 mrg }
1188 1.1.1.3 mrg
1189 1.1.1.4 mrg /* test a random division of p+extra bits divided by p+extra bits,
1190 1.1.1.4 mrg with quotient of p bits only, where the p+extra bit approximation
1191 1.1.1.4 mrg of the quotient is very near a rounding frontier. */
1192 1.1.1.4 mrg static void
1193 1.1.1.4 mrg test_bad_aux (mpfr_prec_t p, mpfr_prec_t extra)
1194 1.1.1.4 mrg {
1195 1.1.1.4 mrg mpfr_t u, v, w, q0, q;
1196 1.1.1.4 mrg
1197 1.1.1.4 mrg mpfr_init2 (u, p + extra);
1198 1.1.1.4 mrg mpfr_init2 (v, p + extra);
1199 1.1.1.4 mrg mpfr_init2 (w, p + extra);
1200 1.1.1.4 mrg mpfr_init2 (q0, p);
1201 1.1.1.4 mrg mpfr_init2 (q, p);
1202 1.1.1.4 mrg do mpfr_urandomb (q0, RANDS); while (mpfr_zero_p (q0));
1203 1.1.1.4 mrg do mpfr_urandomb (v, RANDS); while (mpfr_zero_p (v));
1204 1.1.1.4 mrg
1205 1.1.1.4 mrg mpfr_set (w, q0, MPFR_RNDN); /* exact */
1206 1.1.1.4 mrg mpfr_nextabove (w); /* now w > q0 */
1207 1.1.1.4 mrg mpfr_mul (u, v, w, MPFR_RNDU); /* thus u > v*q0 */
1208 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDU); /* should have q > q0 */
1209 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) > 0);
1210 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDZ); /* should have q = q0 */
1211 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) == 0);
1212 1.1.1.4 mrg
1213 1.1.1.4 mrg mpfr_set (w, q0, MPFR_RNDN); /* exact */
1214 1.1.1.4 mrg mpfr_nextbelow (w); /* now w < q0 */
1215 1.1.1.4 mrg mpfr_mul (u, v, w, MPFR_RNDZ); /* thus u < v*q0 */
1216 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDZ); /* should have q < q0 */
1217 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) < 0);
1218 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDU); /* should have q = q0 */
1219 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) == 0);
1220 1.1.1.4 mrg
1221 1.1.1.4 mrg mpfr_clear (u);
1222 1.1.1.4 mrg mpfr_clear (v);
1223 1.1.1.4 mrg mpfr_clear (w);
1224 1.1.1.4 mrg mpfr_clear (q0);
1225 1.1.1.4 mrg mpfr_clear (q);
1226 1.1.1.4 mrg }
1227 1.1.1.4 mrg
1228 1.1.1.4 mrg static void
1229 1.1.1.4 mrg test_bad (void)
1230 1.1.1.4 mrg {
1231 1.1.1.4 mrg mpfr_prec_t p, extra;
1232 1.1.1.4 mrg
1233 1.1.1.4 mrg for (p = MPFR_PREC_MIN; p <= 1024; p += 17)
1234 1.1.1.4 mrg for (extra = 2; extra <= 64; extra++)
1235 1.1.1.4 mrg test_bad_aux (p, extra);
1236 1.1.1.4 mrg }
1237 1.1.1.4 mrg
1238 1.1 mrg #define TEST_FUNCTION test_div
1239 1.1 mrg #define TWO_ARGS
1240 1.1 mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
1241 1.1 mrg #include "tgeneric.c"
1242 1.1 mrg
1243 1.1.1.3 mrg static void
1244 1.1.1.3 mrg test_extreme (void)
1245 1.1.1.3 mrg {
1246 1.1.1.3 mrg mpfr_t x, y, z;
1247 1.1.1.3 mrg mpfr_exp_t emin, emax;
1248 1.1.1.3 mrg mpfr_prec_t p[4] = { 8, 32, 64, 256 };
1249 1.1.1.3 mrg int xi, yi, zi, j, r;
1250 1.1.1.3 mrg unsigned int flags, ex_flags;
1251 1.1.1.3 mrg
1252 1.1.1.3 mrg emin = mpfr_get_emin ();
1253 1.1.1.3 mrg emax = mpfr_get_emax ();
1254 1.1.1.3 mrg
1255 1.1.1.6 mrg set_emin (MPFR_EMIN_MIN);
1256 1.1.1.6 mrg set_emax (MPFR_EMAX_MAX);
1257 1.1.1.3 mrg
1258 1.1.1.3 mrg for (xi = 0; xi < 4; xi++)
1259 1.1.1.3 mrg {
1260 1.1.1.3 mrg mpfr_init2 (x, p[xi]);
1261 1.1.1.3 mrg mpfr_setmax (x, MPFR_EMAX_MAX);
1262 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (x));
1263 1.1.1.3 mrg for (yi = 0; yi < 4; yi++)
1264 1.1.1.3 mrg {
1265 1.1.1.3 mrg mpfr_init2 (y, p[yi]);
1266 1.1.1.3 mrg mpfr_setmin (y, MPFR_EMIN_MIN);
1267 1.1.1.3 mrg for (j = 0; j < 2; j++)
1268 1.1.1.3 mrg {
1269 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (y));
1270 1.1.1.3 mrg for (zi = 0; zi < 4; zi++)
1271 1.1.1.3 mrg {
1272 1.1.1.3 mrg mpfr_init2 (z, p[zi]);
1273 1.1.1.3 mrg RND_LOOP (r)
1274 1.1.1.3 mrg {
1275 1.1.1.3 mrg mpfr_clear_flags ();
1276 1.1.1.3 mrg mpfr_div (z, x, y, (mpfr_rnd_t) r);
1277 1.1.1.3 mrg flags = __gmpfr_flags;
1278 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (z));
1279 1.1.1.3 mrg ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT;
1280 1.1.1.3 mrg if (flags != ex_flags)
1281 1.1.1.3 mrg {
1282 1.1.1.3 mrg printf ("Bad flags in test_extreme on z = a/b"
1283 1.1.1.3 mrg " with %s and\n",
1284 1.1.1.3 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
1285 1.1.1.3 mrg printf ("a = ");
1286 1.1.1.3 mrg mpfr_dump (x);
1287 1.1.1.3 mrg printf ("b = ");
1288 1.1.1.3 mrg mpfr_dump (y);
1289 1.1.1.3 mrg printf ("Expected flags:");
1290 1.1.1.3 mrg flags_out (ex_flags);
1291 1.1.1.3 mrg printf ("Got flags: ");
1292 1.1.1.3 mrg flags_out (flags);
1293 1.1.1.3 mrg printf ("z = ");
1294 1.1.1.3 mrg mpfr_dump (z);
1295 1.1.1.3 mrg exit (1);
1296 1.1.1.3 mrg }
1297 1.1.1.3 mrg mpfr_clear_flags ();
1298 1.1.1.3 mrg mpfr_div (z, y, x, (mpfr_rnd_t) r);
1299 1.1.1.3 mrg flags = __gmpfr_flags;
1300 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (z));
1301 1.1.1.3 mrg ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT;
1302 1.1.1.3 mrg if (flags != ex_flags)
1303 1.1.1.3 mrg {
1304 1.1.1.3 mrg printf ("Bad flags in test_extreme on z = a/b"
1305 1.1.1.3 mrg " with %s and\n",
1306 1.1.1.3 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
1307 1.1.1.3 mrg printf ("a = ");
1308 1.1.1.3 mrg mpfr_dump (y);
1309 1.1.1.3 mrg printf ("b = ");
1310 1.1.1.3 mrg mpfr_dump (x);
1311 1.1.1.3 mrg printf ("Expected flags:");
1312 1.1.1.3 mrg flags_out (ex_flags);
1313 1.1.1.3 mrg printf ("Got flags: ");
1314 1.1.1.3 mrg flags_out (flags);
1315 1.1.1.3 mrg printf ("z = ");
1316 1.1.1.3 mrg mpfr_dump (z);
1317 1.1.1.3 mrg exit (1);
1318 1.1.1.3 mrg }
1319 1.1.1.3 mrg }
1320 1.1.1.3 mrg mpfr_clear (z);
1321 1.1.1.3 mrg } /* zi */
1322 1.1.1.3 mrg mpfr_nextabove (y);
1323 1.1.1.3 mrg } /* j */
1324 1.1.1.3 mrg mpfr_clear (y);
1325 1.1.1.3 mrg } /* yi */
1326 1.1.1.3 mrg mpfr_clear (x);
1327 1.1.1.3 mrg } /* xi */
1328 1.1.1.3 mrg
1329 1.1.1.3 mrg set_emin (emin);
1330 1.1.1.3 mrg set_emax (emax);
1331 1.1.1.3 mrg }
1332 1.1.1.3 mrg
1333 1.1.1.4 mrg static void
1334 1.1.1.4 mrg testall_rndf (mpfr_prec_t pmax)
1335 1.1.1.4 mrg {
1336 1.1.1.4 mrg mpfr_t a, b, c, d;
1337 1.1.1.4 mrg mpfr_prec_t pa, pb, pc;
1338 1.1.1.4 mrg
1339 1.1.1.4 mrg for (pa = MPFR_PREC_MIN; pa <= pmax; pa++)
1340 1.1.1.4 mrg {
1341 1.1.1.4 mrg mpfr_init2 (a, pa);
1342 1.1.1.4 mrg mpfr_init2 (d, pa);
1343 1.1.1.4 mrg for (pb = MPFR_PREC_MIN; pb <= pmax; pb++)
1344 1.1.1.4 mrg {
1345 1.1.1.4 mrg mpfr_init2 (b, pb);
1346 1.1.1.4 mrg mpfr_set_ui (b, 1, MPFR_RNDN);
1347 1.1.1.4 mrg while (mpfr_cmp_ui (b, 2) < 0)
1348 1.1.1.4 mrg {
1349 1.1.1.4 mrg for (pc = MPFR_PREC_MIN; pc <= pmax; pc++)
1350 1.1.1.4 mrg {
1351 1.1.1.4 mrg mpfr_init2 (c, pc);
1352 1.1.1.4 mrg mpfr_set_ui (c, 1, MPFR_RNDN);
1353 1.1.1.4 mrg while (mpfr_cmp_ui (c, 2) < 0)
1354 1.1.1.4 mrg {
1355 1.1.1.4 mrg mpfr_div (a, b, c, MPFR_RNDF);
1356 1.1.1.4 mrg mpfr_div (d, b, c, MPFR_RNDD);
1357 1.1.1.4 mrg if (!mpfr_equal_p (a, d))
1358 1.1.1.4 mrg {
1359 1.1.1.4 mrg mpfr_div (d, b, c, MPFR_RNDU);
1360 1.1.1.4 mrg if (!mpfr_equal_p (a, d))
1361 1.1.1.4 mrg {
1362 1.1.1.4 mrg printf ("Error: mpfr_div(a,b,c,RNDF) does not "
1363 1.1.1.4 mrg "match RNDD/RNDU\n");
1364 1.1.1.4 mrg printf ("b="); mpfr_dump (b);
1365 1.1.1.4 mrg printf ("c="); mpfr_dump (c);
1366 1.1.1.4 mrg printf ("a="); mpfr_dump (a);
1367 1.1.1.4 mrg exit (1);
1368 1.1.1.4 mrg }
1369 1.1.1.4 mrg }
1370 1.1.1.4 mrg mpfr_nextabove (c);
1371 1.1.1.4 mrg }
1372 1.1.1.4 mrg mpfr_clear (c);
1373 1.1.1.4 mrg }
1374 1.1.1.4 mrg mpfr_nextabove (b);
1375 1.1.1.4 mrg }
1376 1.1.1.4 mrg mpfr_clear (b);
1377 1.1.1.4 mrg }
1378 1.1.1.4 mrg mpfr_clear (a);
1379 1.1.1.4 mrg mpfr_clear (d);
1380 1.1.1.4 mrg }
1381 1.1.1.4 mrg }
1382 1.1.1.4 mrg
1383 1.1.1.4 mrg static void
1384 1.1.1.4 mrg test_mpfr_divsp2 (void)
1385 1.1.1.4 mrg {
1386 1.1.1.4 mrg mpfr_t u, v, q;
1387 1.1.1.4 mrg
1388 1.1.1.4 mrg /* test to exercise r2 = v1 in mpfr_divsp2 */
1389 1.1.1.4 mrg mpfr_init2 (u, 128);
1390 1.1.1.4 mrg mpfr_init2 (v, 128);
1391 1.1.1.4 mrg mpfr_init2 (q, 83);
1392 1.1.1.4 mrg
1393 1.1.1.4 mrg mpfr_set_str (u, "286677858044426991425771529092412636160", 10, MPFR_RNDN);
1394 1.1.1.4 mrg mpfr_set_str (v, "241810647971575979588130185988987264768", 10, MPFR_RNDN);
1395 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN);
1396 1.1.1.4 mrg mpfr_set_str (u, "5732952910203749289426944", 10, MPFR_RNDN);
1397 1.1.1.5 mrg mpfr_div_2ui (u, u, 82, MPFR_RNDN);
1398 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (q, u));
1399 1.1.1.4 mrg
1400 1.1.1.4 mrg mpfr_clear (u);
1401 1.1.1.4 mrg mpfr_clear (v);
1402 1.1.1.4 mrg mpfr_clear (q);
1403 1.1.1.4 mrg }
1404 1.1.1.4 mrg
1405 1.1.1.4 mrg /* Assertion failure in r10769 with --enable-assert --enable-gmp-internals
1406 1.1.1.4 mrg (same failure in tatan on a similar example). */
1407 1.1.1.4 mrg static void
1408 1.1.1.4 mrg test_20160831 (void)
1409 1.1.1.4 mrg {
1410 1.1.1.4 mrg mpfr_t u, v, q;
1411 1.1.1.4 mrg
1412 1.1.1.4 mrg mpfr_inits2 (124, u, v, q, (mpfr_ptr) 0);
1413 1.1.1.4 mrg
1414 1.1.1.4 mrg mpfr_set_ui (u, 1, MPFR_RNDN);
1415 1.1.1.4 mrg mpfr_set_str (v, "0x40000000000000005", 16, MPFR_RNDN);
1416 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN);
1417 1.1.1.4 mrg mpfr_set_str (u, "0xfffffffffffffffecp-134", 16, MPFR_RNDN);
1418 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (q, u));
1419 1.1.1.4 mrg
1420 1.1.1.4 mrg mpfr_set_prec (u, 128);
1421 1.1.1.4 mrg mpfr_set_prec (v, 128);
1422 1.1.1.4 mrg mpfr_set_str (u, "186127091671619245460026015088243485690", 10, MPFR_RNDN);
1423 1.1.1.4 mrg mpfr_set_str (v, "205987256581218236405412302590110119580", 10, MPFR_RNDN);
1424 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN);
1425 1.1.1.4 mrg mpfr_set_str (u, "19217137613667309953639458782352244736", 10, MPFR_RNDN);
1426 1.1.1.5 mrg mpfr_div_2ui (u, u, 124, MPFR_RNDN);
1427 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (q, u));
1428 1.1.1.4 mrg
1429 1.1.1.4 mrg mpfr_clears (u, v, q, (mpfr_ptr) 0);
1430 1.1.1.4 mrg }
1431 1.1.1.4 mrg
1432 1.1.1.4 mrg /* With r11138, on a 64-bit machine:
1433 1.1.1.4 mrg div.c:128: MPFR assertion failed: qx >= __gmpfr_emin
1434 1.1.1.4 mrg */
1435 1.1.1.4 mrg static void
1436 1.1.1.4 mrg test_20170104 (void)
1437 1.1.1.4 mrg {
1438 1.1.1.4 mrg mpfr_t u, v, q;
1439 1.1.1.4 mrg mpfr_exp_t emin;
1440 1.1.1.4 mrg
1441 1.1.1.4 mrg emin = mpfr_get_emin ();
1442 1.1.1.4 mrg set_emin (-42);
1443 1.1.1.4 mrg
1444 1.1.1.4 mrg mpfr_init2 (u, 12);
1445 1.1.1.4 mrg mpfr_init2 (v, 12);
1446 1.1.1.4 mrg mpfr_init2 (q, 11);
1447 1.1.1.4 mrg mpfr_set_str_binary (u, "0.111111111110E-29");
1448 1.1.1.4 mrg mpfr_set_str_binary (v, "0.111111111111E14");
1449 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN);
1450 1.1.1.4 mrg mpfr_clears (u, v, q, (mpfr_ptr) 0);
1451 1.1.1.4 mrg
1452 1.1.1.4 mrg set_emin (emin);
1453 1.1.1.4 mrg }
1454 1.1.1.4 mrg
1455 1.1.1.4 mrg /* With r11140, on a 64-bit machine with GMP_CHECK_RANDOMIZE=1484406128:
1456 1.1.1.4 mrg Consistency error for i = 2577
1457 1.1.1.4 mrg */
1458 1.1.1.4 mrg static void
1459 1.1.1.4 mrg test_20170105 (void)
1460 1.1.1.4 mrg {
1461 1.1.1.4 mrg mpfr_t x, y, z, t;
1462 1.1.1.4 mrg
1463 1.1.1.4 mrg mpfr_init2 (x, 138);
1464 1.1.1.4 mrg mpfr_init2 (y, 6);
1465 1.1.1.4 mrg mpfr_init2 (z, 128);
1466 1.1.1.4 mrg mpfr_init2 (t, 128);
1467 1.1.1.4 mrg mpfr_set_str_binary (x, "0.100110111001001000101111010010011101111110111111110001110100000001110111010100111010100011101010110000010100000011100100110101101011000000E-6");
1468 1.1.1.4 mrg mpfr_set_str_binary (y, "0.100100E-2");
1469 1.1.1.4 mrg /* up to exponents, x/y is exactly 367625553447399614694201910705139062483,
1470 1.1.1.4 mrg which has 129 bits, thus we are in the round-to-nearest-even case, and since
1471 1.1.1.4 mrg the penultimate bit of x/y is 1, we should round upwards */
1472 1.1.1.4 mrg mpfr_set_str_binary (t, "0.10001010010010010000110110010110111111111100011011101010000000000110101000010001011110011011010000111010000000001100101101101010E-3");
1473 1.1.1.4 mrg mpfr_div (z, x, y, MPFR_RNDN);
1474 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (z, t));
1475 1.1.1.4 mrg mpfr_clears (x, y, z, t, (mpfr_ptr) 0);
1476 1.1.1.4 mrg }
1477 1.1.1.4 mrg
1478 1.1.1.4 mrg /* The real cause of the mpfr_ttanh failure from the non-regression test
1479 1.1.1.4 mrg added in tests/ttanh.c@11993 was actually due to a bug in mpfr_div, as
1480 1.1.1.4 mrg this can be seen by comparing the logs of the 3.1 branch and the trunk
1481 1.1.1.4 mrg r11992 with MPFR_LOG_ALL=1 MPFR_LOG_PREC=50 on this particular test
1482 1.1.1.4 mrg (this was noticed because adding this test to the 3.1 branch did not
1483 1.1.1.4 mrg yield a failure like in the trunk, though the mpfr_ttanh code did not
1484 1.1.1.4 mrg change until r11993). This was the bug actually fixed in r12002.
1485 1.1.1.4 mrg */
1486 1.1.1.4 mrg static void
1487 1.1.1.4 mrg test_20171219 (void)
1488 1.1.1.4 mrg {
1489 1.1.1.4 mrg mpfr_t x, y, z, t;
1490 1.1.1.4 mrg
1491 1.1.1.4 mrg mpfr_inits2 (126, x, y, z, t, (mpfr_ptr) 0);
1492 1.1.1.4 mrg mpfr_set_str_binary (x, "0.111000000000000111100000000000011110000000000001111000000000000111100000000000011110000000000001111000000000000111100000000000E1");
1493 1.1.1.4 mrg /* x = 36347266450315671364380109803814927 / 2^114 */
1494 1.1.1.4 mrg mpfr_add_ui (y, x, 2, MPFR_RNDN);
1495 1.1.1.4 mrg /* y = 77885641318594292392624080437575695 / 2^114 */
1496 1.1.1.4 mrg mpfr_div (z, x, y, MPFR_RNDN);
1497 1.1.1.4 mrg mpfr_set_ui_2exp (t, 3823, -13, MPFR_RNDN);
1498 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (z, t));
1499 1.1.1.4 mrg mpfr_clears (x, y, z, t, (mpfr_ptr) 0);
1500 1.1.1.4 mrg }
1501 1.1.1.4 mrg
1502 1.1.1.4 mrg #if !defined(MPFR_GENERIC_ABI) && GMP_NUMB_BITS == 64
1503 1.1.1.4 mrg /* exercise mpfr_div2_approx */
1504 1.1.1.4 mrg static void
1505 1.1.1.4 mrg test_mpfr_div2_approx (unsigned long n)
1506 1.1.1.4 mrg {
1507 1.1.1.4 mrg mpfr_t x, y, z;
1508 1.1.1.4 mrg
1509 1.1.1.4 mrg mpfr_init2 (x, 113);
1510 1.1.1.4 mrg mpfr_init2 (y, 113);
1511 1.1.1.4 mrg mpfr_init2 (z, 113);
1512 1.1.1.4 mrg while (n--)
1513 1.1.1.4 mrg {
1514 1.1.1.4 mrg mpfr_urandomb (x, RANDS);
1515 1.1.1.4 mrg mpfr_urandomb (y, RANDS);
1516 1.1.1.4 mrg mpfr_div (z, x, y, MPFR_RNDN);
1517 1.1.1.4 mrg }
1518 1.1.1.4 mrg mpfr_clear (x);
1519 1.1.1.4 mrg mpfr_clear (y);
1520 1.1.1.4 mrg mpfr_clear (z);
1521 1.1.1.4 mrg }
1522 1.1.1.4 mrg #endif
1523 1.1.1.4 mrg
1524 1.1.1.4 mrg /* bug found in ttan with GMP_CHECK_RANDOMIZE=1514257254 */
1525 1.1.1.4 mrg static void
1526 1.1.1.4 mrg bug20171218 (void)
1527 1.1.1.4 mrg {
1528 1.1.1.4 mrg mpfr_t s, c;
1529 1.1.1.4 mrg mpfr_init2 (s, 124);
1530 1.1.1.4 mrg mpfr_init2 (c, 124);
1531 1.1.1.4 mrg mpfr_set_str_binary (s, "-0.1110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110E0");
1532 1.1.1.4 mrg mpfr_set_str_binary (c, "0.1111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111E-1");
1533 1.1.1.4 mrg mpfr_div (c, s, c, MPFR_RNDN);
1534 1.1.1.4 mrg mpfr_set_str_binary (s, "-1.111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
1535 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (c, s));
1536 1.1.1.4 mrg mpfr_clear (s);
1537 1.1.1.4 mrg mpfr_clear (c);
1538 1.1.1.4 mrg }
1539 1.1.1.4 mrg
1540 1.1.1.4 mrg /* Extended test based on a bug found with flint-arb test suite with a
1541 1.1.1.4 mrg 32-bit ABI: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=888459
1542 1.1.1.4 mrg Division of the form: (1 - 2^(-pa)) / (1 - 2^(-pb)).
1543 1.1.1.4 mrg The result is compared to the one obtained by increasing the precision of
1544 1.1.1.4 mrg the divisor (without changing its value, so that both results should be
1545 1.1.1.4 mrg equal). For all of these tests, a failure may occur in r12126 only with
1546 1.1.1.4 mrg pb=GMP_NUMB_BITS and MPFR_RNDN (and some particular values of pa and pc).
1547 1.1.1.4 mrg This bug was introduced by r9086, where mpfr_div uses mpfr_div_ui when
1548 1.1.1.4 mrg the divisor has only one limb.
1549 1.1.1.4 mrg */
1550 1.1.1.4 mrg static void
1551 1.1.1.4 mrg bug20180126 (void)
1552 1.1.1.4 mrg {
1553 1.1.1.4 mrg mpfr_t a, b1, b2, c1, c2;
1554 1.1.1.4 mrg int pa, i, j, pc, sa, sb, r, inex1, inex2;
1555 1.1.1.4 mrg
1556 1.1.1.4 mrg for (pa = 100; pa < 800; pa += 11)
1557 1.1.1.4 mrg for (i = 1; i <= 4; i++)
1558 1.1.1.4 mrg for (j = -2; j <= 2; j++)
1559 1.1.1.4 mrg {
1560 1.1.1.4 mrg int pb = GMP_NUMB_BITS * i + j;
1561 1.1.1.4 mrg
1562 1.1.1.4 mrg if (pb > pa)
1563 1.1.1.4 mrg continue;
1564 1.1.1.4 mrg
1565 1.1.1.4 mrg mpfr_inits2 (pa, a, b1, (mpfr_ptr) 0);
1566 1.1.1.4 mrg mpfr_inits2 (pb, b2, (mpfr_ptr) 0);
1567 1.1.1.4 mrg
1568 1.1.1.4 mrg mpfr_set_ui (a, 1, MPFR_RNDN);
1569 1.1.1.4 mrg mpfr_nextbelow (a); /* 1 - 2^(-pa) */
1570 1.1.1.4 mrg mpfr_set_ui (b2, 1, MPFR_RNDN);
1571 1.1.1.4 mrg mpfr_nextbelow (b2); /* 1 - 2^(-pb) */
1572 1.1.1.4 mrg inex1 = mpfr_set (b1, b2, MPFR_RNDN);
1573 1.1.1.4 mrg MPFR_ASSERTN (inex1 == 0);
1574 1.1.1.4 mrg
1575 1.1.1.4 mrg for (pc = 32; pc <= 320; pc += 32)
1576 1.1.1.4 mrg {
1577 1.1.1.4 mrg mpfr_inits2 (pc, c1, c2, (mpfr_ptr) 0);
1578 1.1.1.4 mrg
1579 1.1.1.4 mrg for (sa = 0; sa < 2; sa++)
1580 1.1.1.4 mrg {
1581 1.1.1.4 mrg for (sb = 0; sb < 2; sb++)
1582 1.1.1.4 mrg {
1583 1.1.1.4 mrg RND_LOOP_NO_RNDF (r)
1584 1.1.1.4 mrg {
1585 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (b1, b2));
1586 1.1.1.4 mrg inex1 = mpfr_div (c1, a, b1, (mpfr_rnd_t) r);
1587 1.1.1.4 mrg inex2 = mpfr_div (c2, a, b2, (mpfr_rnd_t) r);
1588 1.1.1.4 mrg
1589 1.1.1.4 mrg if (! mpfr_equal_p (c1, c2) ||
1590 1.1.1.4 mrg ! SAME_SIGN (inex1, inex2))
1591 1.1.1.4 mrg {
1592 1.1.1.4 mrg printf ("Error in bug20180126 for "
1593 1.1.1.4 mrg "pa=%d pb=%d pc=%d sa=%d sb=%d %s\n",
1594 1.1.1.4 mrg pa, pb, pc, sa, sb,
1595 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r));
1596 1.1.1.4 mrg printf ("inex1 = %d, c1 = ", inex1);
1597 1.1.1.4 mrg mpfr_dump (c1);
1598 1.1.1.4 mrg printf ("inex2 = %d, c2 = ", inex2);
1599 1.1.1.4 mrg mpfr_dump (c2);
1600 1.1.1.4 mrg exit (1);
1601 1.1.1.4 mrg }
1602 1.1.1.4 mrg }
1603 1.1.1.4 mrg
1604 1.1.1.4 mrg mpfr_neg (b1, b1, MPFR_RNDN);
1605 1.1.1.4 mrg mpfr_neg (b2, b2, MPFR_RNDN);
1606 1.1.1.4 mrg } /* sb */
1607 1.1.1.4 mrg
1608 1.1.1.4 mrg mpfr_neg (a, a, MPFR_RNDN);
1609 1.1.1.4 mrg } /* sa */
1610 1.1.1.4 mrg
1611 1.1.1.4 mrg mpfr_clears (c1, c2, (mpfr_ptr) 0);
1612 1.1.1.4 mrg } /* pc */
1613 1.1.1.4 mrg
1614 1.1.1.4 mrg mpfr_clears (a, b1, b2, (mpfr_ptr) 0);
1615 1.1.1.4 mrg } /* j */
1616 1.1.1.4 mrg }
1617 1.1.1.4 mrg
1618 1.1.1.5 mrg static void
1619 1.1.1.5 mrg coverage (mpfr_prec_t pmax)
1620 1.1.1.5 mrg {
1621 1.1.1.5 mrg mpfr_prec_t p;
1622 1.1.1.5 mrg
1623 1.1.1.5 mrg for (p = MPFR_PREC_MIN; p <= pmax; p++)
1624 1.1.1.5 mrg {
1625 1.1.1.5 mrg int inex;
1626 1.1.1.5 mrg mpfr_t q, u, v;
1627 1.1.1.5 mrg
1628 1.1.1.5 mrg mpfr_init2 (q, p);
1629 1.1.1.5 mrg mpfr_init2 (u, p);
1630 1.1.1.5 mrg mpfr_init2 (v, p);
1631 1.1.1.5 mrg
1632 1.1.1.5 mrg /* exercise case qx < emin */
1633 1.1.1.5 mrg mpfr_set_ui_2exp (u, 1, mpfr_get_emin (), MPFR_RNDN);
1634 1.1.1.5 mrg mpfr_set_ui (v, 4, MPFR_RNDN);
1635 1.1.1.5 mrg
1636 1.1.1.5 mrg mpfr_clear_flags ();
1637 1.1.1.5 mrg /* u/v = 2^(emin-2), should be rounded to +0 for RNDN */
1638 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDN);
1639 1.1.1.5 mrg MPFR_ASSERTN(inex < 0);
1640 1.1.1.5 mrg MPFR_ASSERTN(mpfr_zero_p (q) && mpfr_signbit (q) == 0);
1641 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1642 1.1.1.5 mrg
1643 1.1.1.5 mrg mpfr_clear_flags ();
1644 1.1.1.5 mrg /* u/v = 2^(emin-2), should be rounded to 2^(emin-1) for RNDU */
1645 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDU);
1646 1.1.1.5 mrg MPFR_ASSERTN(inex > 0);
1647 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (q, 1, mpfr_get_emin () - 1) == 0);
1648 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1649 1.1.1.5 mrg
1650 1.1.1.5 mrg mpfr_clear_flags ();
1651 1.1.1.5 mrg /* u/v = 2^(emin-2), should be rounded to +0 for RNDZ */
1652 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDZ);
1653 1.1.1.5 mrg MPFR_ASSERTN(inex < 0);
1654 1.1.1.5 mrg MPFR_ASSERTN(mpfr_zero_p (q) && mpfr_signbit (q) == 0);
1655 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1656 1.1.1.5 mrg
1657 1.1.1.5 mrg if (p == 1)
1658 1.1.1.5 mrg goto end_of_loop;
1659 1.1.1.5 mrg
1660 1.1.1.5 mrg mpfr_set_ui_2exp (u, 1, mpfr_get_emin (), MPFR_RNDN);
1661 1.1.1.5 mrg mpfr_nextbelow (u); /* u = (1-2^(-p))*2^emin */
1662 1.1.1.5 mrg mpfr_set_ui (v, 2, MPFR_RNDN);
1663 1.1.1.5 mrg
1664 1.1.1.5 mrg mpfr_clear_flags ();
1665 1.1.1.5 mrg /* u/v = (1-2^(-p))*2^(emin-1), will round to 2^(emin-1) for RNDN */
1666 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDN);
1667 1.1.1.5 mrg MPFR_ASSERTN(inex > 0);
1668 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (q, 1, mpfr_get_emin () - 1) == 0);
1669 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1670 1.1.1.5 mrg
1671 1.1.1.5 mrg mpfr_clear_flags ();
1672 1.1.1.5 mrg /* u/v should round to 2^(emin-1) for RNDU */
1673 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDU);
1674 1.1.1.5 mrg MPFR_ASSERTN(inex > 0);
1675 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (q, 1, mpfr_get_emin () - 1) == 0);
1676 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1677 1.1.1.5 mrg
1678 1.1.1.5 mrg mpfr_clear_flags ();
1679 1.1.1.5 mrg /* u/v should round to +0 for RNDZ */
1680 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDZ);
1681 1.1.1.5 mrg MPFR_ASSERTN(inex < 0);
1682 1.1.1.5 mrg MPFR_ASSERTN(mpfr_zero_p (q) && mpfr_signbit (q) == 0);
1683 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ());
1684 1.1.1.5 mrg
1685 1.1.1.5 mrg end_of_loop:
1686 1.1.1.5 mrg mpfr_clear (q);
1687 1.1.1.5 mrg mpfr_clear (u);
1688 1.1.1.5 mrg mpfr_clear (v);
1689 1.1.1.5 mrg }
1690 1.1.1.5 mrg }
1691 1.1.1.5 mrg
1692 1.1.1.5 mrg /* coverage for case usize >= n + n in Mulders' algorithm */
1693 1.1.1.5 mrg static void
1694 1.1.1.5 mrg coverage2 (void)
1695 1.1.1.5 mrg {
1696 1.1.1.5 mrg mpfr_prec_t p;
1697 1.1.1.5 mrg mpfr_t q, u, v, t, w;
1698 1.1.1.5 mrg int inex, inex2;
1699 1.1.1.5 mrg
1700 1.1.1.5 mrg p = MPFR_DIV_THRESHOLD * GMP_NUMB_BITS;
1701 1.1.1.5 mrg mpfr_init2 (q, p);
1702 1.1.1.5 mrg mpfr_init2 (u, 2 * p + 3 * GMP_NUMB_BITS);
1703 1.1.1.5 mrg mpfr_init2 (v, p);
1704 1.1.1.5 mrg do mpfr_urandomb (u, RANDS); while (mpfr_zero_p (u));
1705 1.1.1.5 mrg do mpfr_urandomb (v, RANDS); while (mpfr_zero_p (v));
1706 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDN);
1707 1.1.1.5 mrg mpfr_init2 (t, mpfr_get_prec (u));
1708 1.1.1.5 mrg mpfr_init2 (w, mpfr_get_prec (u));
1709 1.1.1.5 mrg inex2 = mpfr_mul (t, q, v, MPFR_RNDN);
1710 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0);
1711 1.1.1.5 mrg if (inex == 0) /* check q*v = u */
1712 1.1.1.5 mrg MPFR_ASSERTN(mpfr_equal_p (u, t));
1713 1.1.1.5 mrg else
1714 1.1.1.5 mrg {
1715 1.1.1.5 mrg if (inex > 0)
1716 1.1.1.5 mrg mpfr_nextbelow (q);
1717 1.1.1.5 mrg else
1718 1.1.1.5 mrg mpfr_nextabove (q);
1719 1.1.1.5 mrg inex2 = mpfr_mul (w, q, v, MPFR_RNDN);
1720 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0);
1721 1.1.1.5 mrg inex2 = mpfr_sub (t, t, u, MPFR_RNDN);
1722 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0);
1723 1.1.1.5 mrg inex2 = mpfr_sub (w, w, u, MPFR_RNDN);
1724 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0);
1725 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmpabs (t, w) <= 0);
1726 1.1.1.5 mrg if (mpfr_cmpabs (t, w) == 0) /* even rule: significand of q should now
1727 1.1.1.5 mrg be odd */
1728 1.1.1.5 mrg MPFR_ASSERTN(mpfr_min_prec (q) == mpfr_get_prec (q));
1729 1.1.1.5 mrg }
1730 1.1.1.5 mrg
1731 1.1.1.5 mrg mpfr_clear (q);
1732 1.1.1.5 mrg mpfr_clear (u);
1733 1.1.1.5 mrg mpfr_clear (v);
1734 1.1.1.5 mrg mpfr_clear (t);
1735 1.1.1.5 mrg mpfr_clear (w);
1736 1.1.1.5 mrg }
1737 1.1.1.5 mrg
1738 1.1 mrg int
1739 1.1 mrg main (int argc, char *argv[])
1740 1.1 mrg {
1741 1.1 mrg tests_start_mpfr ();
1742 1.1 mrg
1743 1.1.1.5 mrg coverage (1024);
1744 1.1.1.5 mrg coverage2 ();
1745 1.1.1.4 mrg bug20180126 ();
1746 1.1.1.4 mrg bug20171218 ();
1747 1.1.1.4 mrg testall_rndf (9);
1748 1.1.1.4 mrg test_20170105 ();
1749 1.1 mrg check_inexact ();
1750 1.1 mrg check_hard ();
1751 1.1.1.2 mrg check_special ();
1752 1.1 mrg check_lowr ();
1753 1.1 mrg check_float (); /* checks single precision */
1754 1.1 mrg check_double ();
1755 1.1 mrg check_convergence ();
1756 1.1 mrg check_64 ();
1757 1.1 mrg
1758 1.1 mrg check4("4.0","4.503599627370496e15", MPFR_RNDZ, 62,
1759 1.1 mrg "0.10000000000000000000000000000000000000000000000000000000000000E-49");
1760 1.1 mrg check4("1.0","2.10263340267725788209e+187", MPFR_RNDU, 65,
1761 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-622");
1762 1.1 mrg check4("2.44394909079968374564e-150", "2.10263340267725788209e+187",MPFR_RNDU,
1763 1.1 mrg 65,
1764 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-1119");
1765 1.1 mrg
1766 1.1 mrg consistency ();
1767 1.1 mrg test_20070603 ();
1768 1.1 mrg test_20070628 ();
1769 1.1.1.3 mrg test_20151023 ();
1770 1.1.1.4 mrg test_20160831 ();
1771 1.1.1.4 mrg test_20170104 ();
1772 1.1.1.4 mrg test_20171219 ();
1773 1.1.1.4 mrg test_generic (MPFR_PREC_MIN, 800, 50);
1774 1.1.1.4 mrg test_bad ();
1775 1.1.1.3 mrg test_extreme ();
1776 1.1.1.4 mrg test_mpfr_divsp2 ();
1777 1.1.1.4 mrg #if !defined(MPFR_GENERIC_ABI) && GMP_NUMB_BITS == 64
1778 1.1.1.4 mrg test_mpfr_div2_approx (1000000);
1779 1.1.1.4 mrg #endif
1780 1.1 mrg
1781 1.1 mrg tests_end_mpfr ();
1782 1.1 mrg return 0;
1783 1.1 mrg }
1784