tdiv.c revision 1.1.1.1.8.1 1 1.1.1.1.8.1 tls /* Test file for mpfr_div (and some mpfr_div_ui, etc. tests).
2 1.1 mrg
3 1.1.1.1.8.1 tls Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
4 1.1.1.1.8.1 tls Contributed by the AriC and Caramel 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 <stdio.h>
24 1.1 mrg #include <stdlib.h>
25 1.1 mrg
26 1.1 mrg #include "mpfr-test.h"
27 1.1 mrg
28 1.1.1.1.8.1 tls static void
29 1.1.1.1.8.1 tls check_equal (mpfr_srcptr a, mpfr_srcptr a2, char *s,
30 1.1.1.1.8.1 tls mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r)
31 1.1.1.1.8.1 tls {
32 1.1.1.1.8.1 tls if ((MPFR_IS_NAN (a) && MPFR_IS_NAN (a2)) ||
33 1.1.1.1.8.1 tls mpfr_equal_p (a, a2))
34 1.1.1.1.8.1 tls return;
35 1.1.1.1.8.1 tls printf ("Error in %s\n", mpfr_print_rnd_mode (r));
36 1.1.1.1.8.1 tls printf ("b = ");
37 1.1.1.1.8.1 tls mpfr_dump (b);
38 1.1.1.1.8.1 tls printf ("c = ");
39 1.1.1.1.8.1 tls mpfr_dump (c);
40 1.1.1.1.8.1 tls printf ("mpfr_div result: ");
41 1.1.1.1.8.1 tls mpfr_dump (a);
42 1.1.1.1.8.1 tls printf ("%s result: ", s);
43 1.1.1.1.8.1 tls mpfr_dump (a2);
44 1.1.1.1.8.1 tls exit (1);
45 1.1.1.1.8.1 tls }
46 1.1.1.1.8.1 tls
47 1.1.1.1.8.1 tls static int
48 1.1.1.1.8.1 tls mpfr_all_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r)
49 1.1.1.1.8.1 tls {
50 1.1.1.1.8.1 tls mpfr_t a2;
51 1.1.1.1.8.1 tls unsigned int oldflags, newflags;
52 1.1.1.1.8.1 tls int inex, inex2;
53 1.1.1.1.8.1 tls
54 1.1.1.1.8.1 tls oldflags = __gmpfr_flags;
55 1.1.1.1.8.1 tls inex = mpfr_div (a, b, c, r);
56 1.1.1.1.8.1 tls
57 1.1.1.1.8.1 tls if (a == b || a == c)
58 1.1.1.1.8.1 tls return inex;
59 1.1.1.1.8.1 tls
60 1.1.1.1.8.1 tls newflags = __gmpfr_flags;
61 1.1.1.1.8.1 tls
62 1.1.1.1.8.1 tls mpfr_init2 (a2, MPFR_PREC (a));
63 1.1.1.1.8.1 tls
64 1.1.1.1.8.1 tls if (mpfr_integer_p (b) && ! (MPFR_IS_ZERO (b) && MPFR_IS_NEG (b)))
65 1.1.1.1.8.1 tls {
66 1.1.1.1.8.1 tls /* b is an integer, but not -0 (-0 is rejected as
67 1.1.1.1.8.1 tls it becomes +0 when converted to an integer). */
68 1.1.1.1.8.1 tls if (mpfr_fits_ulong_p (b, MPFR_RNDA))
69 1.1.1.1.8.1 tls {
70 1.1.1.1.8.1 tls __gmpfr_flags = oldflags;
71 1.1.1.1.8.1 tls inex2 = mpfr_ui_div (a2, mpfr_get_ui (b, MPFR_RNDN), c, r);
72 1.1.1.1.8.1 tls MPFR_ASSERTN (SAME_SIGN (inex2, inex));
73 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == newflags);
74 1.1.1.1.8.1 tls check_equal (a, a2, "mpfr_ui_div", b, c, r);
75 1.1.1.1.8.1 tls }
76 1.1.1.1.8.1 tls if (mpfr_fits_slong_p (b, MPFR_RNDA))
77 1.1.1.1.8.1 tls {
78 1.1.1.1.8.1 tls __gmpfr_flags = oldflags;
79 1.1.1.1.8.1 tls inex2 = mpfr_si_div (a2, mpfr_get_si (b, MPFR_RNDN), c, r);
80 1.1.1.1.8.1 tls MPFR_ASSERTN (SAME_SIGN (inex2, inex));
81 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == newflags);
82 1.1.1.1.8.1 tls check_equal (a, a2, "mpfr_si_div", b, c, r);
83 1.1.1.1.8.1 tls }
84 1.1.1.1.8.1 tls }
85 1.1.1.1.8.1 tls
86 1.1.1.1.8.1 tls if (mpfr_integer_p (c) && ! (MPFR_IS_ZERO (c) && MPFR_IS_NEG (c)))
87 1.1.1.1.8.1 tls {
88 1.1.1.1.8.1 tls /* c is an integer, but not -0 (-0 is rejected as
89 1.1.1.1.8.1 tls it becomes +0 when converted to an integer). */
90 1.1.1.1.8.1 tls if (mpfr_fits_ulong_p (c, MPFR_RNDA))
91 1.1.1.1.8.1 tls {
92 1.1.1.1.8.1 tls __gmpfr_flags = oldflags;
93 1.1.1.1.8.1 tls inex2 = mpfr_div_ui (a2, b, mpfr_get_ui (c, MPFR_RNDN), r);
94 1.1.1.1.8.1 tls MPFR_ASSERTN (SAME_SIGN (inex2, inex));
95 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == newflags);
96 1.1.1.1.8.1 tls check_equal (a, a2, "mpfr_div_ui", b, c, r);
97 1.1.1.1.8.1 tls }
98 1.1.1.1.8.1 tls if (mpfr_fits_slong_p (c, MPFR_RNDA))
99 1.1.1.1.8.1 tls {
100 1.1.1.1.8.1 tls __gmpfr_flags = oldflags;
101 1.1.1.1.8.1 tls inex2 = mpfr_div_si (a2, b, mpfr_get_si (c, MPFR_RNDN), r);
102 1.1.1.1.8.1 tls MPFR_ASSERTN (SAME_SIGN (inex2, inex));
103 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == newflags);
104 1.1.1.1.8.1 tls check_equal (a, a2, "mpfr_div_si", b, c, r);
105 1.1.1.1.8.1 tls }
106 1.1.1.1.8.1 tls }
107 1.1.1.1.8.1 tls
108 1.1.1.1.8.1 tls mpfr_clear (a2);
109 1.1.1.1.8.1 tls
110 1.1.1.1.8.1 tls return inex;
111 1.1.1.1.8.1 tls }
112 1.1.1.1.8.1 tls
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.1.8.1 tls 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.1.8.1 tls #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 mrg printf ("got ");mpfr_print_binary(q);
167 1.1 mrg mpfr_set_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN);
168 1.1 mrg printf("\nexpected "); mpfr_print_binary(q);
169 1.1 mrg putchar('\n');
170 1.1 mrg exit (1);
171 1.1 mrg }
172 1.1 mrg mpfr_clears (q, n, d, (mpfr_ptr) 0);
173 1.1 mrg }
174 1.1 mrg
175 1.1 mrg static void
176 1.1 mrg check24 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, const char *Qs)
177 1.1 mrg {
178 1.1 mrg mpfr_t q, n, d;
179 1.1 mrg
180 1.1 mrg mpfr_inits2 (24, q, n, d, (mpfr_ptr) 0);
181 1.1 mrg
182 1.1 mrg mpfr_set_str1 (n, Ns);
183 1.1 mrg mpfr_set_str1 (d, Ds);
184 1.1 mrg test_div(q, n, d, rnd_mode);
185 1.1 mrg if (mpfr_cmp_str1 (q, Qs) )
186 1.1 mrg {
187 1.1 mrg printf ("mpfr_div failed for n=%s, d=%s, prec=24, rnd_mode=%s\n",
188 1.1 mrg Ns, Ds, mpfr_print_rnd_mode(rnd_mode));
189 1.1 mrg printf ("expected quotient is %s, got ", Qs);
190 1.1 mrg mpfr_out_str(stdout,10,0,q, MPFR_RNDN); putchar('\n');
191 1.1 mrg exit (1);
192 1.1 mrg }
193 1.1 mrg mpfr_clears (q, n, d, (mpfr_ptr) 0);
194 1.1 mrg }
195 1.1 mrg
196 1.1 mrg /* the following examples come from the paper "Number-theoretic Test
197 1.1 mrg Generation for Directed Rounding" from Michael Parks, Table 2 */
198 1.1 mrg static void
199 1.1 mrg check_float(void)
200 1.1 mrg {
201 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDN, "8.388609e6");
202 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDN, "8.388609e6");
203 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDN, "8.388609e6");
204 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDN, "8.38861e6");
205 1.1 mrg /* the exponent for the following example was forgotten in
206 1.1 mrg the Arith'14 version of Parks' paper */
207 1.1 mrg check24 ("12582913.0", "12582910.0", MPFR_RNDN, "1.000000238");
208 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDN, "8388610.0");
209 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDN, "1.6777213e7");
210 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDN, "8.388611e6");
211 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDN, "1.2582911e7");
212 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDN, "1.258291e7");
213 1.1 mrg
214 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDZ, "8.388608e6");
215 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDZ, "8.388609e6");
216 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDZ, "8.388608e6");
217 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDZ, "8.38861e6");
218 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDZ, "1.000000238");
219 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDZ, "8388610.0");
220 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDZ, "1.6777213e7");
221 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDZ, "8.38861e6");
222 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDZ, "1.2582911e7");
223 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDZ, "1.258291e7");
224 1.1 mrg
225 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDU, "8.388609e6");
226 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDU, "8.38861e6");
227 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDU, "8.388609e6");
228 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDU, "8.388611e6");
229 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDU, "1.000000357");
230 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDU, "8388611.0");
231 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDU, "1.6777214e7");
232 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDU, "8.388611e6");
233 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDU, "1.2582912e7");
234 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDU, "1.2582911e7");
235 1.1 mrg
236 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDD, "8.388608e6");
237 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDD, "8.388609e6");
238 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDD, "8.388608e6");
239 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDD, "8.38861e6");
240 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDD, "1.000000238");
241 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDD, "8388610.0");
242 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDD, "1.6777213e7");
243 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDD, "8.38861e6");
244 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDD, "1.2582911e7");
245 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDD, "1.258291e7");
246 1.1 mrg
247 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDA, "8.388609e6");
248 1.1 mrg }
249 1.1 mrg
250 1.1 mrg static void
251 1.1 mrg check_double(void)
252 1.1 mrg {
253 1.1 mrg check53("0.0", "1.0", MPFR_RNDZ, "0.0");
254 1.1 mrg check53("-7.4988969224688591e63", "4.8816866450288732e306", MPFR_RNDD,
255 1.1 mrg "-1.5361282826510687291e-243");
256 1.1 mrg check53("-1.33225773037748601769e+199", "3.63449540676937123913e+79",
257 1.1 mrg MPFR_RNDZ, "-3.6655920045905428978e119");
258 1.1 mrg check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDU,
259 1.1 mrg "1.6672003992376663654e-67");
260 1.1 mrg check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDA,
261 1.1 mrg "1.6672003992376663654e-67");
262 1.1 mrg check53("9.89438396044940256501e-134", "-5.93472984109987421717e-67",
263 1.1 mrg MPFR_RNDU, "-1.6672003992376663654e-67");
264 1.1 mrg check53("-4.53063926135729747564e-308", "7.02293374921793516813e-84",
265 1.1 mrg MPFR_RNDD, "-6.4512060388748850857e-225");
266 1.1 mrg check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
267 1.1 mrg MPFR_RNDD, "-2.6540006635008291192e229");
268 1.1 mrg check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
269 1.1 mrg MPFR_RNDA, "-2.6540006635008291192e229");
270 1.1 mrg check53("6.52308934689126e15", "-1.62063546601505417497e273", MPFR_RNDN,
271 1.1 mrg "-4.0250194961676020848e-258");
272 1.1 mrg check53("1.04636807108079349236e-189", "3.72295730823253012954e-292",
273 1.1 mrg MPFR_RNDZ, "2.810583051186143125e102");
274 1.1 mrg /* problems found by Kevin under HP-PA */
275 1.1 mrg check53 ("2.861044553323177e-136", "-1.1120354257068143e+45", MPFR_RNDZ,
276 1.1 mrg "-2.5727998292003016e-181");
277 1.1 mrg check53 ("-4.0559157245809205e-127", "-1.1237723844524865e+77", MPFR_RNDN,
278 1.1 mrg "3.6091968273068081e-204");
279 1.1 mrg check53 ("-1.8177943561493235e-93", "-8.51233984260364e-104", MPFR_RNDU,
280 1.1 mrg "2.1354814184595821e+10");
281 1.1 mrg }
282 1.1 mrg
283 1.1 mrg static void
284 1.1 mrg check_64(void)
285 1.1 mrg {
286 1.1 mrg mpfr_t x,y,z;
287 1.1 mrg
288 1.1 mrg mpfr_inits2 (64, x, y, z, (mpfr_ptr) 0);
289 1.1 mrg
290 1.1 mrg mpfr_set_str_binary(x, "1.00100100110110101001010010101111000001011100100101010000000000E54");
291 1.1 mrg mpfr_set_str_binary(y, "1.00000000000000000000000000000000000000000000000000000000000000E584");
292 1.1 mrg test_div(z, x, y, MPFR_RNDU);
293 1.1 mrg if (mpfr_cmp_str (z, "0.1001001001101101010010100101011110000010111001001010100000000000E-529", 2, MPFR_RNDN))
294 1.1 mrg {
295 1.1 mrg printf("Error for tdiv for MPFR_RNDU and p=64\nx=");
296 1.1 mrg mpfr_print_binary(x);
297 1.1 mrg printf("\ny=");
298 1.1 mrg mpfr_print_binary(y);
299 1.1 mrg printf("\ngot ");
300 1.1 mrg mpfr_print_binary(z);
301 1.1 mrg printf("\nexpected 0.1001001001101101010010100101011110000010111001001010100000000000E-529\n");
302 1.1 mrg exit(1);
303 1.1 mrg }
304 1.1 mrg
305 1.1 mrg mpfr_clears (x, y, z, (mpfr_ptr) 0);
306 1.1 mrg }
307 1.1 mrg
308 1.1 mrg static void
309 1.1 mrg check_convergence (void)
310 1.1 mrg {
311 1.1 mrg mpfr_t x, y; int i, j;
312 1.1 mrg
313 1.1 mrg mpfr_init2(x, 130);
314 1.1 mrg mpfr_set_str_binary(x, "0.1011111101011010101000001010011111101000011100011101010011111011000011001010000000111100100111110011001010110100100001001000111001E6944");
315 1.1 mrg mpfr_init2(y, 130);
316 1.1 mrg mpfr_set_ui(y, 5, MPFR_RNDN);
317 1.1 mrg test_div(x, x, y, MPFR_RNDD); /* exact division */
318 1.1 mrg
319 1.1 mrg mpfr_set_prec(x, 64);
320 1.1 mrg mpfr_set_prec(y, 64);
321 1.1 mrg mpfr_set_str_binary(x, "0.10010010011011010100101001010111100000101110010010101E55");
322 1.1 mrg mpfr_set_str_binary(y, "0.1E585");
323 1.1 mrg test_div(x, x, y, MPFR_RNDN);
324 1.1 mrg mpfr_set_str_binary(y, "0.10010010011011010100101001010111100000101110010010101E-529");
325 1.1 mrg if (mpfr_cmp (x, y))
326 1.1 mrg {
327 1.1 mrg printf ("Error in mpfr_div for prec=64, rnd=MPFR_RNDN\n");
328 1.1 mrg printf ("got "); mpfr_print_binary(x); puts ("");
329 1.1 mrg printf ("instead of "); mpfr_print_binary(y); puts ("");
330 1.1 mrg exit(1);
331 1.1 mrg }
332 1.1 mrg
333 1.1 mrg for (i=32; i<=64; i+=32)
334 1.1 mrg {
335 1.1 mrg mpfr_set_prec(x, i);
336 1.1 mrg mpfr_set_prec(y, i);
337 1.1 mrg mpfr_set_ui(x, 1, MPFR_RNDN);
338 1.1 mrg RND_LOOP(j)
339 1.1 mrg {
340 1.1 mrg mpfr_set_ui (y, 1, MPFR_RNDN);
341 1.1 mrg test_div (y, x, y, (mpfr_rnd_t) j);
342 1.1 mrg if (mpfr_cmp_ui (y, 1))
343 1.1 mrg {
344 1.1 mrg printf ("mpfr_div failed for x=1.0, y=1.0, prec=%d rnd=%s\n",
345 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) j));
346 1.1 mrg printf ("got "); mpfr_print_binary(y); puts ("");
347 1.1 mrg exit (1);
348 1.1 mrg }
349 1.1 mrg }
350 1.1 mrg }
351 1.1 mrg
352 1.1 mrg mpfr_clear (x);
353 1.1 mrg mpfr_clear (y);
354 1.1 mrg }
355 1.1 mrg
356 1.1 mrg #define KMAX 10000
357 1.1 mrg
358 1.1 mrg /* given y = o(x/u), x, u, find the inexact flag by
359 1.1 mrg multiplying y by u */
360 1.1 mrg static int
361 1.1 mrg get_inexact (mpfr_t y, mpfr_t x, mpfr_t u)
362 1.1 mrg {
363 1.1 mrg mpfr_t xx;
364 1.1 mrg int inex;
365 1.1 mrg mpfr_init2 (xx, mpfr_get_prec (y) + mpfr_get_prec (u));
366 1.1 mrg mpfr_mul (xx, y, u, MPFR_RNDN); /* exact */
367 1.1 mrg inex = mpfr_cmp (xx, x);
368 1.1 mrg mpfr_clear (xx);
369 1.1 mrg return inex;
370 1.1 mrg }
371 1.1 mrg
372 1.1 mrg static void
373 1.1 mrg check_hard (void)
374 1.1 mrg {
375 1.1 mrg mpfr_t u, v, q, q2;
376 1.1 mrg mpfr_prec_t precu, precv, precq;
377 1.1 mrg int rnd;
378 1.1 mrg int inex, inex2, i, j;
379 1.1 mrg
380 1.1 mrg mpfr_init (q);
381 1.1 mrg mpfr_init (q2);
382 1.1 mrg mpfr_init (u);
383 1.1 mrg mpfr_init (v);
384 1.1 mrg
385 1.1 mrg for (precq = MPFR_PREC_MIN; precq <= 64; precq ++)
386 1.1 mrg {
387 1.1 mrg mpfr_set_prec (q, precq);
388 1.1 mrg mpfr_set_prec (q2, precq + 1);
389 1.1 mrg for (j = 0; j < 2; j++)
390 1.1 mrg {
391 1.1 mrg if (j == 0)
392 1.1 mrg {
393 1.1 mrg do
394 1.1 mrg {
395 1.1 mrg mpfr_urandomb (q2, RANDS);
396 1.1 mrg }
397 1.1 mrg while (mpfr_cmp_ui (q2, 0) == 0);
398 1.1 mrg }
399 1.1 mrg else /* use q2=1 */
400 1.1 mrg mpfr_set_ui (q2, 1, MPFR_RNDN);
401 1.1 mrg for (precv = precq; precv <= 10 * precq; precv += precq)
402 1.1 mrg {
403 1.1 mrg mpfr_set_prec (v, precv);
404 1.1 mrg do
405 1.1 mrg {
406 1.1 mrg mpfr_urandomb (v, RANDS);
407 1.1 mrg }
408 1.1 mrg while (mpfr_cmp_ui (v, 0) == 0);
409 1.1 mrg for (precu = precq; precu <= 10 * precq; precu += precq)
410 1.1 mrg {
411 1.1 mrg mpfr_set_prec (u, precu);
412 1.1 mrg mpfr_mul (u, v, q2, MPFR_RNDN);
413 1.1 mrg mpfr_nextbelow (u);
414 1.1 mrg for (i = 0; i <= 2; i++)
415 1.1 mrg {
416 1.1 mrg RND_LOOP(rnd)
417 1.1 mrg {
418 1.1 mrg inex = test_div (q, u, v, (mpfr_rnd_t) rnd);
419 1.1 mrg inex2 = get_inexact (q, u, v);
420 1.1 mrg if (inex_cmp (inex, inex2))
421 1.1 mrg {
422 1.1 mrg printf ("Wrong inexact flag for rnd=%s: expected %d, got %d\n",
423 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), inex2, inex);
424 1.1 mrg printf ("u= "); mpfr_dump (u);
425 1.1 mrg printf ("v= "); mpfr_dump (v);
426 1.1 mrg printf ("q= "); mpfr_dump (q);
427 1.1 mrg mpfr_set_prec (q2, precq + precv);
428 1.1 mrg mpfr_mul (q2, q, v, MPFR_RNDN);
429 1.1 mrg printf ("q*v="); mpfr_dump (q2);
430 1.1 mrg exit (1);
431 1.1 mrg }
432 1.1 mrg }
433 1.1 mrg mpfr_nextabove (u);
434 1.1 mrg }
435 1.1 mrg }
436 1.1 mrg }
437 1.1 mrg }
438 1.1 mrg }
439 1.1 mrg
440 1.1 mrg mpfr_clear (q);
441 1.1 mrg mpfr_clear (q2);
442 1.1 mrg mpfr_clear (u);
443 1.1 mrg mpfr_clear (v);
444 1.1 mrg }
445 1.1 mrg
446 1.1 mrg static void
447 1.1 mrg check_lowr (void)
448 1.1 mrg {
449 1.1 mrg mpfr_t x, y, z, z2, z3, tmp;
450 1.1 mrg int k, c, c2;
451 1.1 mrg
452 1.1 mrg
453 1.1 mrg mpfr_init2 (x, 1000);
454 1.1 mrg mpfr_init2 (y, 100);
455 1.1 mrg mpfr_init2 (tmp, 850);
456 1.1 mrg mpfr_init2 (z, 10);
457 1.1 mrg mpfr_init2 (z2, 10);
458 1.1 mrg mpfr_init2 (z3, 50);
459 1.1 mrg
460 1.1 mrg for (k = 1; k < KMAX; k++)
461 1.1 mrg {
462 1.1 mrg do
463 1.1 mrg {
464 1.1 mrg mpfr_urandomb (z, RANDS);
465 1.1 mrg }
466 1.1 mrg while (mpfr_cmp_ui (z, 0) == 0);
467 1.1 mrg do
468 1.1 mrg {
469 1.1 mrg mpfr_urandomb (tmp, RANDS);
470 1.1 mrg }
471 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0);
472 1.1 mrg mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
473 1.1 mrg c = test_div (z2, x, tmp, MPFR_RNDN);
474 1.1 mrg
475 1.1 mrg if (c || mpfr_cmp (z2, z))
476 1.1 mrg {
477 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
478 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
479 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
480 1.1 mrg printf ("inex flag = %d, expected 0\n", c);
481 1.1 mrg exit (1);
482 1.1 mrg }
483 1.1 mrg }
484 1.1 mrg
485 1.1 mrg /* x has still precision 1000, z precision 10, and tmp prec 850 */
486 1.1 mrg mpfr_set_prec (z2, 9);
487 1.1 mrg for (k = 1; k < KMAX; k++)
488 1.1 mrg {
489 1.1 mrg mpfr_urandomb (z, RANDS);
490 1.1 mrg do
491 1.1 mrg {
492 1.1 mrg mpfr_urandomb (tmp, RANDS);
493 1.1 mrg }
494 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0);
495 1.1 mrg mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
496 1.1 mrg c = test_div (z2, x, tmp, MPFR_RNDN);
497 1.1 mrg /* since z2 has one less bit that z, either the division is exact
498 1.1 mrg if z is representable on 9 bits, or we have an even round case */
499 1.1 mrg
500 1.1 mrg c2 = get_inexact (z2, x, tmp);
501 1.1 mrg if ((mpfr_cmp (z2, z) == 0 && c) || inex_cmp (c, c2))
502 1.1 mrg {
503 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
504 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
505 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
506 1.1 mrg printf ("inex flag = %d, expected %d\n", c, c2);
507 1.1 mrg exit (1);
508 1.1 mrg }
509 1.1 mrg else if (c == 2)
510 1.1 mrg {
511 1.1 mrg mpfr_nexttoinf (z);
512 1.1 mrg if (mpfr_cmp(z2, z))
513 1.1 mrg {
514 1.1 mrg printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
515 1.1 mrg printf ("Dividing ");
516 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
517 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
518 1.1 mrg printf ("inex flag = %d\n", 1);
519 1.1 mrg exit (1);
520 1.1 mrg }
521 1.1 mrg }
522 1.1 mrg else if (c == -2)
523 1.1 mrg {
524 1.1 mrg mpfr_nexttozero (z);
525 1.1 mrg if (mpfr_cmp(z2, z))
526 1.1 mrg {
527 1.1 mrg printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
528 1.1 mrg printf ("Dividing ");
529 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
530 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
531 1.1 mrg printf ("inex flag = %d\n", 1);
532 1.1 mrg exit (1);
533 1.1 mrg }
534 1.1 mrg }
535 1.1 mrg }
536 1.1 mrg
537 1.1 mrg mpfr_set_prec(x, 1000);
538 1.1 mrg mpfr_set_prec(y, 100);
539 1.1 mrg mpfr_set_prec(tmp, 850);
540 1.1 mrg mpfr_set_prec(z, 10);
541 1.1 mrg mpfr_set_prec(z2, 10);
542 1.1 mrg
543 1.1 mrg /* almost exact divisions */
544 1.1 mrg for (k = 1; k < KMAX; k++)
545 1.1 mrg {
546 1.1 mrg do
547 1.1 mrg {
548 1.1 mrg mpfr_urandomb (z, RANDS);
549 1.1 mrg }
550 1.1 mrg while (mpfr_cmp_ui (z, 0) == 0);
551 1.1 mrg do
552 1.1 mrg {
553 1.1 mrg mpfr_urandomb (tmp, RANDS);
554 1.1 mrg }
555 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0);
556 1.1 mrg mpfr_mul(x, z, tmp, MPFR_RNDN);
557 1.1 mrg mpfr_set(y, tmp, MPFR_RNDD);
558 1.1 mrg mpfr_nexttoinf (x);
559 1.1 mrg
560 1.1 mrg c = test_div(z2, x, y, MPFR_RNDD);
561 1.1 mrg test_div(z3, x, y, MPFR_RNDD);
562 1.1 mrg mpfr_set(z, z3, MPFR_RNDD);
563 1.1 mrg
564 1.1 mrg if (c != -1 || mpfr_cmp(z2, z))
565 1.1 mrg {
566 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDD\n");
567 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
568 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
569 1.1 mrg printf ("inex flag = %d\n", c);
570 1.1 mrg exit (1);
571 1.1 mrg }
572 1.1 mrg
573 1.1 mrg mpfr_set (y, tmp, MPFR_RNDU);
574 1.1 mrg test_div (z3, x, y, MPFR_RNDU);
575 1.1 mrg mpfr_set (z, z3, MPFR_RNDU);
576 1.1 mrg c = test_div (z2, x, y, MPFR_RNDU);
577 1.1 mrg if (c != 1 || mpfr_cmp (z2, z))
578 1.1 mrg {
579 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDU\n");
580 1.1 mrg printf ("u="); mpfr_dump (x);
581 1.1 mrg printf ("v="); mpfr_dump (y);
582 1.1 mrg printf ("got "); mpfr_print_binary (z2); puts ("");
583 1.1 mrg printf ("instead of "); mpfr_print_binary (z); puts ("");
584 1.1 mrg printf ("inex flag = %d\n", c);
585 1.1 mrg exit (1);
586 1.1 mrg }
587 1.1 mrg }
588 1.1 mrg
589 1.1 mrg mpfr_clear (x);
590 1.1 mrg mpfr_clear (y);
591 1.1 mrg mpfr_clear (z);
592 1.1 mrg mpfr_clear (z2);
593 1.1 mrg mpfr_clear (z3);
594 1.1 mrg mpfr_clear (tmp);
595 1.1 mrg }
596 1.1 mrg
597 1.1 mrg #define MAX_PREC 128
598 1.1 mrg
599 1.1 mrg static void
600 1.1 mrg check_inexact (void)
601 1.1 mrg {
602 1.1 mrg mpfr_t x, y, z, u;
603 1.1 mrg mpfr_prec_t px, py, pu;
604 1.1 mrg int inexact, cmp;
605 1.1 mrg mpfr_rnd_t rnd;
606 1.1 mrg
607 1.1 mrg mpfr_init (x);
608 1.1 mrg mpfr_init (y);
609 1.1 mrg mpfr_init (z);
610 1.1 mrg mpfr_init (u);
611 1.1 mrg
612 1.1 mrg mpfr_set_prec (x, 28);
613 1.1 mrg mpfr_set_prec (y, 28);
614 1.1 mrg mpfr_set_prec (z, 1023);
615 1.1 mrg mpfr_set_str_binary (x, "0.1000001001101101111100010011E0");
616 1.1 mrg mpfr_set_str (z, "48284762641021308813686974720835219181653367326353400027913400579340343320519877153813133510034402932651132854764198688352364361009429039801248971901380781746767119334993621199563870113045276395603170432175354501451429471578325545278975153148347684600400321033502982713296919861760382863826626093689036010394", 10, MPFR_RNDN);
617 1.1 mrg mpfr_div (x, x, z, MPFR_RNDN);
618 1.1 mrg mpfr_set_str_binary (y, "0.1111001011001101001001111100E-1023");
619 1.1 mrg if (mpfr_cmp (x, y))
620 1.1 mrg {
621 1.1 mrg printf ("Error in mpfr_div for prec=28, RNDN\n");
622 1.1 mrg printf ("Expected "); mpfr_dump (y);
623 1.1 mrg printf ("Got "); mpfr_dump (x);
624 1.1 mrg exit (1);
625 1.1 mrg }
626 1.1 mrg
627 1.1 mrg mpfr_set_prec (x, 53);
628 1.1 mrg mpfr_set_str_binary (x, "0.11101100110010100011011000000100001111011111110010101E0");
629 1.1 mrg mpfr_set_prec (u, 127);
630 1.1 mrg mpfr_set_str_binary (u, "0.1000001100110110110101110110101101111000110000001111111110000000011111001010110100110010111111111101000001011011101011101101000E-2");
631 1.1 mrg mpfr_set_prec (y, 95);
632 1.1 mrg inexact = test_div (y, x, u, MPFR_RNDN);
633 1.1 mrg if (inexact != (cmp = get_inexact (y, x, u)))
634 1.1 mrg {
635 1.1 mrg printf ("Wrong inexact flag (0): expected %d, got %d\n", cmp, inexact);
636 1.1 mrg printf ("x="); mpfr_out_str (stdout, 10, 99, x, MPFR_RNDN); printf ("\n");
637 1.1 mrg printf ("u="); mpfr_out_str (stdout, 10, 99, u, MPFR_RNDN); printf ("\n");
638 1.1 mrg printf ("y="); mpfr_out_str (stdout, 10, 99, y, MPFR_RNDN); printf ("\n");
639 1.1 mrg exit (1);
640 1.1 mrg }
641 1.1 mrg
642 1.1 mrg mpfr_set_prec (x, 33);
643 1.1 mrg mpfr_set_str_binary (x, "0.101111100011011101010011101100001E0");
644 1.1 mrg mpfr_set_prec (u, 2);
645 1.1 mrg mpfr_set_str_binary (u, "0.1E0");
646 1.1 mrg mpfr_set_prec (y, 28);
647 1.1 mrg if ((inexact = test_div (y, x, u, MPFR_RNDN) >= 0))
648 1.1 mrg {
649 1.1 mrg printf ("Wrong inexact flag (1): expected -1, got %d\n",
650 1.1 mrg inexact);
651 1.1 mrg exit (1);
652 1.1 mrg }
653 1.1 mrg
654 1.1 mrg mpfr_set_prec (x, 129);
655 1.1 mrg mpfr_set_str_binary (x, "0.111110101111001100000101011100101100110011011101010001000110110101100101000010000001110110100001101010001010100010001111001101010E-2");
656 1.1 mrg mpfr_set_prec (u, 15);
657 1.1 mrg mpfr_set_str_binary (u, "0.101101000001100E-1");
658 1.1 mrg mpfr_set_prec (y, 92);
659 1.1 mrg if ((inexact = test_div (y, x, u, MPFR_RNDN)) <= 0)
660 1.1 mrg {
661 1.1 mrg printf ("Wrong inexact flag for rnd=MPFR_RNDN(1): expected 1, got %d\n",
662 1.1 mrg inexact);
663 1.1 mrg mpfr_dump (x);
664 1.1 mrg mpfr_dump (u);
665 1.1 mrg mpfr_dump (y);
666 1.1 mrg exit (1);
667 1.1 mrg }
668 1.1 mrg
669 1.1 mrg for (px=2; px<MAX_PREC; px++)
670 1.1 mrg {
671 1.1 mrg mpfr_set_prec (x, px);
672 1.1 mrg mpfr_urandomb (x, RANDS);
673 1.1 mrg for (pu=2; pu<=MAX_PREC; pu++)
674 1.1 mrg {
675 1.1 mrg mpfr_set_prec (u, pu);
676 1.1 mrg do { mpfr_urandomb (u, RANDS); } while (mpfr_cmp_ui (u, 0) == 0);
677 1.1 mrg {
678 1.1 mrg py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - MPFR_PREC_MIN));
679 1.1 mrg mpfr_set_prec (y, py);
680 1.1 mrg mpfr_set_prec (z, py + pu);
681 1.1 mrg {
682 1.1 mrg rnd = RND_RAND ();
683 1.1 mrg inexact = test_div (y, x, u, rnd);
684 1.1 mrg if (mpfr_mul (z, y, u, rnd))
685 1.1 mrg {
686 1.1 mrg printf ("z <- y * u should be exact\n");
687 1.1 mrg exit (1);
688 1.1 mrg }
689 1.1 mrg cmp = mpfr_cmp (z, x);
690 1.1 mrg if (((inexact == 0) && (cmp != 0)) ||
691 1.1 mrg ((inexact > 0) && (cmp <= 0)) ||
692 1.1 mrg ((inexact < 0) && (cmp >= 0)))
693 1.1 mrg {
694 1.1 mrg printf ("Wrong inexact flag for rnd=%s\n",
695 1.1 mrg mpfr_print_rnd_mode(rnd));
696 1.1 mrg printf ("expected %d, got %d\n", cmp, inexact);
697 1.1 mrg printf ("x="); mpfr_print_binary (x); puts ("");
698 1.1 mrg printf ("u="); mpfr_print_binary (u); puts ("");
699 1.1 mrg printf ("y="); mpfr_print_binary (y); puts ("");
700 1.1 mrg printf ("y*u="); mpfr_print_binary (z); puts ("");
701 1.1 mrg exit (1);
702 1.1 mrg }
703 1.1 mrg }
704 1.1 mrg }
705 1.1 mrg }
706 1.1 mrg }
707 1.1 mrg
708 1.1 mrg mpfr_clear (x);
709 1.1 mrg mpfr_clear (y);
710 1.1 mrg mpfr_clear (z);
711 1.1 mrg mpfr_clear (u);
712 1.1 mrg }
713 1.1 mrg
714 1.1 mrg static void
715 1.1.1.1.8.1 tls check_special (void)
716 1.1 mrg {
717 1.1 mrg mpfr_t a, d, q;
718 1.1 mrg mpfr_exp_t emax, emin;
719 1.1 mrg int i;
720 1.1 mrg
721 1.1 mrg mpfr_init2 (a, 100L);
722 1.1 mrg mpfr_init2 (d, 100L);
723 1.1 mrg mpfr_init2 (q, 100L);
724 1.1 mrg
725 1.1 mrg /* 1/nan == nan */
726 1.1 mrg mpfr_set_ui (a, 1L, MPFR_RNDN);
727 1.1 mrg MPFR_SET_NAN (d);
728 1.1.1.1.8.1 tls mpfr_clear_flags ();
729 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
730 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
731 1.1 mrg
732 1.1 mrg /* nan/1 == nan */
733 1.1 mrg MPFR_SET_NAN (a);
734 1.1 mrg mpfr_set_ui (d, 1L, MPFR_RNDN);
735 1.1.1.1.8.1 tls mpfr_clear_flags ();
736 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
737 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
738 1.1 mrg
739 1.1 mrg /* +inf/1 == +inf */
740 1.1 mrg MPFR_SET_INF (a);
741 1.1 mrg MPFR_SET_POS (a);
742 1.1 mrg mpfr_set_ui (d, 1L, MPFR_RNDN);
743 1.1.1.1.8.1 tls mpfr_clear_flags ();
744 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
745 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_inf_p (q));
746 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_sgn (q) > 0);
747 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
748 1.1.1.1.8.1 tls
749 1.1.1.1.8.1 tls /* +inf/-1 == -inf */
750 1.1.1.1.8.1 tls MPFR_SET_INF (a);
751 1.1.1.1.8.1 tls MPFR_SET_POS (a);
752 1.1.1.1.8.1 tls mpfr_set_si (d, -1, MPFR_RNDN);
753 1.1.1.1.8.1 tls mpfr_clear_flags ();
754 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
755 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_inf_p (q));
756 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_sgn (q) < 0);
757 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
758 1.1.1.1.8.1 tls
759 1.1.1.1.8.1 tls /* -inf/1 == -inf */
760 1.1.1.1.8.1 tls MPFR_SET_INF (a);
761 1.1.1.1.8.1 tls MPFR_SET_NEG (a);
762 1.1.1.1.8.1 tls mpfr_set_ui (d, 1L, MPFR_RNDN);
763 1.1.1.1.8.1 tls mpfr_clear_flags ();
764 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
765 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_inf_p (q));
766 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_sgn (q) < 0);
767 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
768 1.1.1.1.8.1 tls
769 1.1.1.1.8.1 tls /* -inf/-1 == +inf */
770 1.1.1.1.8.1 tls MPFR_SET_INF (a);
771 1.1.1.1.8.1 tls MPFR_SET_NEG (a);
772 1.1.1.1.8.1 tls mpfr_set_si (d, -1, MPFR_RNDN);
773 1.1.1.1.8.1 tls mpfr_clear_flags ();
774 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
775 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q));
776 1.1 mrg MPFR_ASSERTN (mpfr_sgn (q) > 0);
777 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
778 1.1.1.1.8.1 tls
779 1.1.1.1.8.1 tls /* 1/+inf == +0 */
780 1.1.1.1.8.1 tls mpfr_set_ui (a, 1L, MPFR_RNDN);
781 1.1.1.1.8.1 tls MPFR_SET_INF (d);
782 1.1.1.1.8.1 tls MPFR_SET_POS (d);
783 1.1.1.1.8.1 tls mpfr_clear_flags ();
784 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
785 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_number_p (q));
786 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_sgn (q) == 0);
787 1.1.1.1.8.1 tls MPFR_ASSERTN (MPFR_IS_POS (q));
788 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
789 1.1 mrg
790 1.1.1.1.8.1 tls /* 1/-inf == -0 */
791 1.1 mrg mpfr_set_ui (a, 1L, MPFR_RNDN);
792 1.1 mrg MPFR_SET_INF (d);
793 1.1.1.1.8.1 tls MPFR_SET_NEG (d);
794 1.1.1.1.8.1 tls mpfr_clear_flags ();
795 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
796 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_number_p (q));
797 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_sgn (q) == 0);
798 1.1.1.1.8.1 tls MPFR_ASSERTN (MPFR_IS_NEG (q));
799 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
800 1.1.1.1.8.1 tls
801 1.1.1.1.8.1 tls /* -1/+inf == -0 */
802 1.1.1.1.8.1 tls mpfr_set_si (a, -1, MPFR_RNDN);
803 1.1.1.1.8.1 tls MPFR_SET_INF (d);
804 1.1 mrg MPFR_SET_POS (d);
805 1.1.1.1.8.1 tls mpfr_clear_flags ();
806 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
807 1.1 mrg MPFR_ASSERTN (mpfr_number_p (q));
808 1.1 mrg MPFR_ASSERTN (mpfr_sgn (q) == 0);
809 1.1.1.1.8.1 tls MPFR_ASSERTN (MPFR_IS_NEG (q));
810 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
811 1.1.1.1.8.1 tls
812 1.1.1.1.8.1 tls /* -1/-inf == +0 */
813 1.1.1.1.8.1 tls mpfr_set_si (a, -1, MPFR_RNDN);
814 1.1.1.1.8.1 tls MPFR_SET_INF (d);
815 1.1.1.1.8.1 tls MPFR_SET_NEG (d);
816 1.1.1.1.8.1 tls mpfr_clear_flags ();
817 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
818 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_number_p (q));
819 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_sgn (q) == 0);
820 1.1.1.1.8.1 tls MPFR_ASSERTN (MPFR_IS_POS (q));
821 1.1.1.1.8.1 tls 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.1.8.1 tls mpfr_clear_flags ();
827 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
828 1.1.1.1.8.1 tls 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.1.8.1 tls mpfr_clear_flags ();
836 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
837 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
838 1.1 mrg
839 1.1.1.1.8.1 tls /* 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.1.8.1 tls 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.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
846 1.1 mrg
847 1.1.1.1.8.1 tls /* 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.1.8.1 tls 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.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
855 1.1 mrg
856 1.1.1.1.8.1 tls /* -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.1.8.1 tls 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.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
863 1.1 mrg
864 1.1.1.1.8.1 tls /* -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.1.8.1 tls 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.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
872 1.1.1.1.8.1 tls
873 1.1.1.1.8.1 tls /* +inf/+0 = +inf */
874 1.1.1.1.8.1 tls MPFR_SET_INF (a);
875 1.1.1.1.8.1 tls MPFR_SET_POS (a);
876 1.1.1.1.8.1 tls mpfr_set_ui (d, 0, MPFR_RNDZ);
877 1.1.1.1.8.1 tls mpfr_clear_flags ();
878 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
879 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
880 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
881 1.1.1.1.8.1 tls
882 1.1.1.1.8.1 tls /* +inf/-0 = -inf */
883 1.1.1.1.8.1 tls MPFR_SET_INF (a);
884 1.1.1.1.8.1 tls MPFR_SET_POS (a);
885 1.1.1.1.8.1 tls mpfr_set_ui (d, 0, MPFR_RNDZ);
886 1.1.1.1.8.1 tls mpfr_neg (d, d, MPFR_RNDZ);
887 1.1.1.1.8.1 tls mpfr_clear_flags ();
888 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
889 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
890 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
891 1.1.1.1.8.1 tls
892 1.1.1.1.8.1 tls /* -inf/+0 = -inf */
893 1.1.1.1.8.1 tls MPFR_SET_INF (a);
894 1.1.1.1.8.1 tls MPFR_SET_NEG (a);
895 1.1.1.1.8.1 tls mpfr_set_ui (d, 0, MPFR_RNDZ);
896 1.1.1.1.8.1 tls mpfr_clear_flags ();
897 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
898 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
899 1.1.1.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags == 0);
900 1.1.1.1.8.1 tls
901 1.1.1.1.8.1 tls /* -inf/-0 = +inf */
902 1.1.1.1.8.1 tls MPFR_SET_INF (a);
903 1.1.1.1.8.1 tls MPFR_SET_NEG (a);
904 1.1.1.1.8.1 tls mpfr_set_ui (d, 0, MPFR_RNDZ);
905 1.1.1.1.8.1 tls mpfr_neg (d, d, MPFR_RNDZ);
906 1.1.1.1.8.1 tls mpfr_clear_flags ();
907 1.1.1.1.8.1 tls MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
908 1.1.1.1.8.1 tls MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
909 1.1.1.1.8.1 tls 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.1.8.1 tls 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.1.8.1 tls 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.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags ==
946 1.1.1.1.8.1 tls (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.1.8.1 tls MPFR_ASSERTN (__gmpfr_flags ==
952 1.1.1.1.8.1 tls (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 mrg rnd = RND_RAND ();
982 1.1 mrg px = (randlimb () % 256) + 2;
983 1.1 mrg py = (randlimb () % 128) + 2;
984 1.1 mrg pz = (randlimb () % 256) + 2;
985 1.1 mrg mpfr_set_prec (x, px);
986 1.1 mrg mpfr_set_prec (y, py);
987 1.1 mrg mpfr_set_prec (z1, pz);
988 1.1 mrg mpfr_set_prec (z2, pz);
989 1.1 mrg mpfr_urandomb (x, RANDS);
990 1.1 mrg do
991 1.1 mrg mpfr_urandomb (y, RANDS);
992 1.1 mrg while (mpfr_zero_p (y));
993 1.1 mrg inex1 = mpfr_div (z1, x, y, rnd);
994 1.1 mrg MPFR_ASSERTN (!MPFR_IS_NAN (z1));
995 1.1 mrg p = MAX (MAX (px, py), pz);
996 1.1 mrg if (mpfr_prec_round (x, p, MPFR_RNDN) != 0 ||
997 1.1 mrg mpfr_prec_round (y, p, MPFR_RNDN) != 0)
998 1.1 mrg {
999 1.1 mrg printf ("mpfr_prec_round error for i = %d\n", i);
1000 1.1 mrg exit (1);
1001 1.1 mrg }
1002 1.1 mrg inex2 = mpfr_div (z2, x, y, rnd);
1003 1.1 mrg MPFR_ASSERTN (!MPFR_IS_NAN (z2));
1004 1.1 mrg if (inex1 != inex2 || mpfr_cmp (z1, z2) != 0)
1005 1.1 mrg {
1006 1.1 mrg printf ("Consistency error for i = %d\n", i);
1007 1.1 mrg exit (1);
1008 1.1 mrg }
1009 1.1 mrg }
1010 1.1 mrg
1011 1.1 mrg mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0);
1012 1.1 mrg }
1013 1.1 mrg
1014 1.1 mrg /* Reported by Carl Witty on 2007-06-03 */
1015 1.1 mrg static void
1016 1.1 mrg test_20070603 (void)
1017 1.1 mrg {
1018 1.1 mrg mpfr_t n, d, q, c;
1019 1.1 mrg
1020 1.1 mrg mpfr_init2 (n, 128);
1021 1.1 mrg mpfr_init2 (d, 128);
1022 1.1 mrg mpfr_init2 (q, 31);
1023 1.1 mrg mpfr_init2 (c, 31);
1024 1.1 mrg
1025 1.1 mrg mpfr_set_str (n, "10384593717069655257060992206846485", 10, MPFR_RNDN);
1026 1.1 mrg mpfr_set_str (d, "10384593717069655257060992206847132", 10, MPFR_RNDN);
1027 1.1 mrg mpfr_div (q, n, d, MPFR_RNDU);
1028 1.1 mrg
1029 1.1 mrg mpfr_set_ui (c, 1, MPFR_RNDN);
1030 1.1 mrg if (mpfr_cmp (q, c) != 0)
1031 1.1 mrg {
1032 1.1 mrg printf ("Error in test_20070603\nGot ");
1033 1.1 mrg mpfr_dump (q);
1034 1.1 mrg printf ("instead of ");
1035 1.1 mrg mpfr_dump (c);
1036 1.1 mrg exit (1);
1037 1.1 mrg }
1038 1.1 mrg
1039 1.1 mrg /* same for 64-bit machines */
1040 1.1 mrg mpfr_set_prec (n, 256);
1041 1.1 mrg mpfr_set_prec (d, 256);
1042 1.1 mrg mpfr_set_prec (q, 63);
1043 1.1 mrg mpfr_set_str (n, "822752278660603021077484591278675252491367930877209729029898240", 10, MPFR_RNDN);
1044 1.1 mrg mpfr_set_str (d, "822752278660603021077484591278675252491367930877212507873738752", 10, MPFR_RNDN);
1045 1.1 mrg mpfr_div (q, n, d, MPFR_RNDU);
1046 1.1 mrg if (mpfr_cmp (q, c) != 0)
1047 1.1 mrg {
1048 1.1 mrg printf ("Error in test_20070603\nGot ");
1049 1.1 mrg mpfr_dump (q);
1050 1.1 mrg printf ("instead of ");
1051 1.1 mrg mpfr_dump (c);
1052 1.1 mrg exit (1);
1053 1.1 mrg }
1054 1.1 mrg
1055 1.1 mrg mpfr_clear (n);
1056 1.1 mrg mpfr_clear (d);
1057 1.1 mrg mpfr_clear (q);
1058 1.1 mrg mpfr_clear (c);
1059 1.1 mrg }
1060 1.1 mrg
1061 1.1 mrg /* Bug found while adding tests for mpfr_cot */
1062 1.1 mrg static void
1063 1.1 mrg test_20070628 (void)
1064 1.1 mrg {
1065 1.1 mrg mpfr_exp_t old_emax;
1066 1.1 mrg mpfr_t x, y;
1067 1.1 mrg int inex, err = 0;
1068 1.1 mrg
1069 1.1 mrg old_emax = mpfr_get_emax ();
1070 1.1 mrg
1071 1.1 mrg if (mpfr_set_emax (256))
1072 1.1 mrg {
1073 1.1 mrg printf ("Can't change exponent range\n");
1074 1.1 mrg exit (1);
1075 1.1 mrg }
1076 1.1 mrg
1077 1.1 mrg mpfr_inits2 (53, x, y, (mpfr_ptr) 0);
1078 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
1079 1.1 mrg mpfr_set_si_2exp (y, 1, -256, MPFR_RNDN);
1080 1.1 mrg mpfr_clear_flags ();
1081 1.1 mrg inex = mpfr_div (x, x, y, MPFR_RNDD);
1082 1.1 mrg if (MPFR_SIGN (x) >= 0 || ! mpfr_inf_p (x))
1083 1.1 mrg {
1084 1.1 mrg printf ("Error in test_20070628: expected -Inf, got\n");
1085 1.1 mrg mpfr_dump (x);
1086 1.1 mrg err++;
1087 1.1 mrg }
1088 1.1 mrg if (inex >= 0)
1089 1.1 mrg {
1090 1.1 mrg printf ("Error in test_20070628: expected inex < 0, got %d\n", inex);
1091 1.1 mrg err++;
1092 1.1 mrg }
1093 1.1 mrg if (! mpfr_overflow_p ())
1094 1.1 mrg {
1095 1.1 mrg printf ("Error in test_20070628: overflow flag is not set\n");
1096 1.1 mrg err++;
1097 1.1 mrg }
1098 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0);
1099 1.1 mrg mpfr_set_emax (old_emax);
1100 1.1 mrg }
1101 1.1 mrg
1102 1.1 mrg #define TEST_FUNCTION test_div
1103 1.1 mrg #define TWO_ARGS
1104 1.1 mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
1105 1.1 mrg #include "tgeneric.c"
1106 1.1 mrg
1107 1.1 mrg int
1108 1.1 mrg main (int argc, char *argv[])
1109 1.1 mrg {
1110 1.1 mrg tests_start_mpfr ();
1111 1.1 mrg
1112 1.1 mrg check_inexact ();
1113 1.1 mrg check_hard ();
1114 1.1.1.1.8.1 tls check_special ();
1115 1.1 mrg check_lowr ();
1116 1.1 mrg check_float (); /* checks single precision */
1117 1.1 mrg check_double ();
1118 1.1 mrg check_convergence ();
1119 1.1 mrg check_64 ();
1120 1.1 mrg
1121 1.1 mrg check4("4.0","4.503599627370496e15", MPFR_RNDZ, 62,
1122 1.1 mrg "0.10000000000000000000000000000000000000000000000000000000000000E-49");
1123 1.1 mrg check4("1.0","2.10263340267725788209e+187", MPFR_RNDU, 65,
1124 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-622");
1125 1.1 mrg check4("2.44394909079968374564e-150", "2.10263340267725788209e+187",MPFR_RNDU,
1126 1.1 mrg 65,
1127 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-1119");
1128 1.1 mrg
1129 1.1 mrg consistency ();
1130 1.1 mrg test_20070603 ();
1131 1.1 mrg test_20070628 ();
1132 1.1 mrg test_generic (2, 800, 50);
1133 1.1 mrg
1134 1.1 mrg tests_end_mpfr ();
1135 1.1 mrg return 0;
1136 1.1 mrg }
1137