tdiv.c revision 1.1 1 1.1 mrg /* Test file for mpfr_div.
2 1.1 mrg
3 1.1 mrg Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4 1.1 mrg Contributed by the Arenaire and Cacao 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 mrg #ifdef CHECK_EXTERNAL
29 1.1 mrg static int
30 1.1 mrg test_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode)
31 1.1 mrg {
32 1.1 mrg int res;
33 1.1 mrg int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b) && mpfr_number_p (c);
34 1.1 mrg if (ok)
35 1.1 mrg {
36 1.1 mrg mpfr_print_raw (b);
37 1.1 mrg printf (" ");
38 1.1 mrg mpfr_print_raw (c);
39 1.1 mrg }
40 1.1 mrg res = mpfr_div (a, b, c, rnd_mode);
41 1.1 mrg if (ok)
42 1.1 mrg {
43 1.1 mrg printf (" ");
44 1.1 mrg mpfr_print_raw (a);
45 1.1 mrg printf ("\n");
46 1.1 mrg }
47 1.1 mrg return res;
48 1.1 mrg }
49 1.1 mrg #else
50 1.1 mrg #define test_div mpfr_div
51 1.1 mrg #endif
52 1.1 mrg
53 1.1 mrg #define check53(n, d, rnd, res) check4(n, d, rnd, 53, res)
54 1.1 mrg
55 1.1 mrg /* return 0 iff a and b are of the same sign */
56 1.1 mrg static int
57 1.1 mrg inex_cmp (int a, int b)
58 1.1 mrg {
59 1.1 mrg if (a > 0)
60 1.1 mrg return (b > 0) ? 0 : 1;
61 1.1 mrg else if (a == 0)
62 1.1 mrg return (b == 0) ? 0 : 1;
63 1.1 mrg else
64 1.1 mrg return (b < 0) ? 0 : 1;
65 1.1 mrg }
66 1.1 mrg
67 1.1 mrg static void
68 1.1 mrg check4 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, int p,
69 1.1 mrg const char *Qs)
70 1.1 mrg {
71 1.1 mrg mpfr_t q, n, d;
72 1.1 mrg
73 1.1 mrg mpfr_inits2 (p, q, n, d, (mpfr_ptr) 0);
74 1.1 mrg mpfr_set_str1 (n, Ns);
75 1.1 mrg mpfr_set_str1 (d, Ds);
76 1.1 mrg test_div(q, n, d, rnd_mode);
77 1.1 mrg if (mpfr_cmp_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN) )
78 1.1 mrg {
79 1.1 mrg printf ("mpfr_div failed for n=%s, d=%s, p=%d, rnd_mode=%s\n",
80 1.1 mrg Ns, Ds, p, mpfr_print_rnd_mode (rnd_mode));
81 1.1 mrg printf ("got ");mpfr_print_binary(q);
82 1.1 mrg mpfr_set_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN);
83 1.1 mrg printf("\nexpected "); mpfr_print_binary(q);
84 1.1 mrg putchar('\n');
85 1.1 mrg exit (1);
86 1.1 mrg }
87 1.1 mrg mpfr_clears (q, n, d, (mpfr_ptr) 0);
88 1.1 mrg }
89 1.1 mrg
90 1.1 mrg static void
91 1.1 mrg check24 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, const char *Qs)
92 1.1 mrg {
93 1.1 mrg mpfr_t q, n, d;
94 1.1 mrg
95 1.1 mrg mpfr_inits2 (24, q, n, d, (mpfr_ptr) 0);
96 1.1 mrg
97 1.1 mrg mpfr_set_str1 (n, Ns);
98 1.1 mrg mpfr_set_str1 (d, Ds);
99 1.1 mrg test_div(q, n, d, rnd_mode);
100 1.1 mrg if (mpfr_cmp_str1 (q, Qs) )
101 1.1 mrg {
102 1.1 mrg printf ("mpfr_div failed for n=%s, d=%s, prec=24, rnd_mode=%s\n",
103 1.1 mrg Ns, Ds, mpfr_print_rnd_mode(rnd_mode));
104 1.1 mrg printf ("expected quotient is %s, got ", Qs);
105 1.1 mrg mpfr_out_str(stdout,10,0,q, MPFR_RNDN); putchar('\n');
106 1.1 mrg exit (1);
107 1.1 mrg }
108 1.1 mrg mpfr_clears (q, n, d, (mpfr_ptr) 0);
109 1.1 mrg }
110 1.1 mrg
111 1.1 mrg /* the following examples come from the paper "Number-theoretic Test
112 1.1 mrg Generation for Directed Rounding" from Michael Parks, Table 2 */
113 1.1 mrg static void
114 1.1 mrg check_float(void)
115 1.1 mrg {
116 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDN, "8.388609e6");
117 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDN, "8.388609e6");
118 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDN, "8.388609e6");
119 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDN, "8.38861e6");
120 1.1 mrg /* the exponent for the following example was forgotten in
121 1.1 mrg the Arith'14 version of Parks' paper */
122 1.1 mrg check24 ("12582913.0", "12582910.0", MPFR_RNDN, "1.000000238");
123 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDN, "8388610.0");
124 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDN, "1.6777213e7");
125 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDN, "8.388611e6");
126 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDN, "1.2582911e7");
127 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDN, "1.258291e7");
128 1.1 mrg
129 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDZ, "8.388608e6");
130 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDZ, "8.388609e6");
131 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDZ, "8.388608e6");
132 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDZ, "8.38861e6");
133 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDZ, "1.000000238");
134 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDZ, "8388610.0");
135 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDZ, "1.6777213e7");
136 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDZ, "8.38861e6");
137 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDZ, "1.2582911e7");
138 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDZ, "1.258291e7");
139 1.1 mrg
140 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDU, "8.388609e6");
141 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDU, "8.38861e6");
142 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDU, "8.388609e6");
143 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDU, "8.388611e6");
144 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDU, "1.000000357");
145 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDU, "8388611.0");
146 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDU, "1.6777214e7");
147 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDU, "8.388611e6");
148 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDU, "1.2582912e7");
149 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDU, "1.2582911e7");
150 1.1 mrg
151 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDD, "8.388608e6");
152 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDD, "8.388609e6");
153 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDD, "8.388608e6");
154 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDD, "8.38861e6");
155 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDD, "1.000000238");
156 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDD, "8388610.0");
157 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDD, "1.6777213e7");
158 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDD, "8.38861e6");
159 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDD, "1.2582911e7");
160 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDD, "1.258291e7");
161 1.1 mrg
162 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDA, "8.388609e6");
163 1.1 mrg }
164 1.1 mrg
165 1.1 mrg static void
166 1.1 mrg check_double(void)
167 1.1 mrg {
168 1.1 mrg check53("0.0", "1.0", MPFR_RNDZ, "0.0");
169 1.1 mrg check53("-7.4988969224688591e63", "4.8816866450288732e306", MPFR_RNDD,
170 1.1 mrg "-1.5361282826510687291e-243");
171 1.1 mrg check53("-1.33225773037748601769e+199", "3.63449540676937123913e+79",
172 1.1 mrg MPFR_RNDZ, "-3.6655920045905428978e119");
173 1.1 mrg check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDU,
174 1.1 mrg "1.6672003992376663654e-67");
175 1.1 mrg check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDA,
176 1.1 mrg "1.6672003992376663654e-67");
177 1.1 mrg check53("9.89438396044940256501e-134", "-5.93472984109987421717e-67",
178 1.1 mrg MPFR_RNDU, "-1.6672003992376663654e-67");
179 1.1 mrg check53("-4.53063926135729747564e-308", "7.02293374921793516813e-84",
180 1.1 mrg MPFR_RNDD, "-6.4512060388748850857e-225");
181 1.1 mrg check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
182 1.1 mrg MPFR_RNDD, "-2.6540006635008291192e229");
183 1.1 mrg check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
184 1.1 mrg MPFR_RNDA, "-2.6540006635008291192e229");
185 1.1 mrg check53("6.52308934689126e15", "-1.62063546601505417497e273", MPFR_RNDN,
186 1.1 mrg "-4.0250194961676020848e-258");
187 1.1 mrg check53("1.04636807108079349236e-189", "3.72295730823253012954e-292",
188 1.1 mrg MPFR_RNDZ, "2.810583051186143125e102");
189 1.1 mrg /* problems found by Kevin under HP-PA */
190 1.1 mrg check53 ("2.861044553323177e-136", "-1.1120354257068143e+45", MPFR_RNDZ,
191 1.1 mrg "-2.5727998292003016e-181");
192 1.1 mrg check53 ("-4.0559157245809205e-127", "-1.1237723844524865e+77", MPFR_RNDN,
193 1.1 mrg "3.6091968273068081e-204");
194 1.1 mrg check53 ("-1.8177943561493235e-93", "-8.51233984260364e-104", MPFR_RNDU,
195 1.1 mrg "2.1354814184595821e+10");
196 1.1 mrg }
197 1.1 mrg
198 1.1 mrg static void
199 1.1 mrg check_64(void)
200 1.1 mrg {
201 1.1 mrg mpfr_t x,y,z;
202 1.1 mrg
203 1.1 mrg mpfr_inits2 (64, x, y, z, (mpfr_ptr) 0);
204 1.1 mrg
205 1.1 mrg mpfr_set_str_binary(x, "1.00100100110110101001010010101111000001011100100101010000000000E54");
206 1.1 mrg mpfr_set_str_binary(y, "1.00000000000000000000000000000000000000000000000000000000000000E584");
207 1.1 mrg test_div(z, x, y, MPFR_RNDU);
208 1.1 mrg if (mpfr_cmp_str (z, "0.1001001001101101010010100101011110000010111001001010100000000000E-529", 2, MPFR_RNDN))
209 1.1 mrg {
210 1.1 mrg printf("Error for tdiv for MPFR_RNDU and p=64\nx=");
211 1.1 mrg mpfr_print_binary(x);
212 1.1 mrg printf("\ny=");
213 1.1 mrg mpfr_print_binary(y);
214 1.1 mrg printf("\ngot ");
215 1.1 mrg mpfr_print_binary(z);
216 1.1 mrg printf("\nexpected 0.1001001001101101010010100101011110000010111001001010100000000000E-529\n");
217 1.1 mrg exit(1);
218 1.1 mrg }
219 1.1 mrg
220 1.1 mrg mpfr_clears (x, y, z, (mpfr_ptr) 0);
221 1.1 mrg }
222 1.1 mrg
223 1.1 mrg static void
224 1.1 mrg check_convergence (void)
225 1.1 mrg {
226 1.1 mrg mpfr_t x, y; int i, j;
227 1.1 mrg
228 1.1 mrg mpfr_init2(x, 130);
229 1.1 mrg mpfr_set_str_binary(x, "0.1011111101011010101000001010011111101000011100011101010011111011000011001010000000111100100111110011001010110100100001001000111001E6944");
230 1.1 mrg mpfr_init2(y, 130);
231 1.1 mrg mpfr_set_ui(y, 5, MPFR_RNDN);
232 1.1 mrg test_div(x, x, y, MPFR_RNDD); /* exact division */
233 1.1 mrg
234 1.1 mrg mpfr_set_prec(x, 64);
235 1.1 mrg mpfr_set_prec(y, 64);
236 1.1 mrg mpfr_set_str_binary(x, "0.10010010011011010100101001010111100000101110010010101E55");
237 1.1 mrg mpfr_set_str_binary(y, "0.1E585");
238 1.1 mrg test_div(x, x, y, MPFR_RNDN);
239 1.1 mrg mpfr_set_str_binary(y, "0.10010010011011010100101001010111100000101110010010101E-529");
240 1.1 mrg if (mpfr_cmp (x, y))
241 1.1 mrg {
242 1.1 mrg printf ("Error in mpfr_div for prec=64, rnd=MPFR_RNDN\n");
243 1.1 mrg printf ("got "); mpfr_print_binary(x); puts ("");
244 1.1 mrg printf ("instead of "); mpfr_print_binary(y); puts ("");
245 1.1 mrg exit(1);
246 1.1 mrg }
247 1.1 mrg
248 1.1 mrg for (i=32; i<=64; i+=32)
249 1.1 mrg {
250 1.1 mrg mpfr_set_prec(x, i);
251 1.1 mrg mpfr_set_prec(y, i);
252 1.1 mrg mpfr_set_ui(x, 1, MPFR_RNDN);
253 1.1 mrg RND_LOOP(j)
254 1.1 mrg {
255 1.1 mrg mpfr_set_ui (y, 1, MPFR_RNDN);
256 1.1 mrg test_div (y, x, y, (mpfr_rnd_t) j);
257 1.1 mrg if (mpfr_cmp_ui (y, 1))
258 1.1 mrg {
259 1.1 mrg printf ("mpfr_div failed for x=1.0, y=1.0, prec=%d rnd=%s\n",
260 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) j));
261 1.1 mrg printf ("got "); mpfr_print_binary(y); puts ("");
262 1.1 mrg exit (1);
263 1.1 mrg }
264 1.1 mrg }
265 1.1 mrg }
266 1.1 mrg
267 1.1 mrg mpfr_clear (x);
268 1.1 mrg mpfr_clear (y);
269 1.1 mrg }
270 1.1 mrg
271 1.1 mrg #define KMAX 10000
272 1.1 mrg
273 1.1 mrg /* given y = o(x/u), x, u, find the inexact flag by
274 1.1 mrg multiplying y by u */
275 1.1 mrg static int
276 1.1 mrg get_inexact (mpfr_t y, mpfr_t x, mpfr_t u)
277 1.1 mrg {
278 1.1 mrg mpfr_t xx;
279 1.1 mrg int inex;
280 1.1 mrg mpfr_init2 (xx, mpfr_get_prec (y) + mpfr_get_prec (u));
281 1.1 mrg mpfr_mul (xx, y, u, MPFR_RNDN); /* exact */
282 1.1 mrg inex = mpfr_cmp (xx, x);
283 1.1 mrg mpfr_clear (xx);
284 1.1 mrg return inex;
285 1.1 mrg }
286 1.1 mrg
287 1.1 mrg static void
288 1.1 mrg check_hard (void)
289 1.1 mrg {
290 1.1 mrg mpfr_t u, v, q, q2;
291 1.1 mrg mpfr_prec_t precu, precv, precq;
292 1.1 mrg int rnd;
293 1.1 mrg int inex, inex2, i, j;
294 1.1 mrg
295 1.1 mrg mpfr_init (q);
296 1.1 mrg mpfr_init (q2);
297 1.1 mrg mpfr_init (u);
298 1.1 mrg mpfr_init (v);
299 1.1 mrg
300 1.1 mrg for (precq = MPFR_PREC_MIN; precq <= 64; precq ++)
301 1.1 mrg {
302 1.1 mrg mpfr_set_prec (q, precq);
303 1.1 mrg mpfr_set_prec (q2, precq + 1);
304 1.1 mrg for (j = 0; j < 2; j++)
305 1.1 mrg {
306 1.1 mrg if (j == 0)
307 1.1 mrg {
308 1.1 mrg do
309 1.1 mrg {
310 1.1 mrg mpfr_urandomb (q2, RANDS);
311 1.1 mrg }
312 1.1 mrg while (mpfr_cmp_ui (q2, 0) == 0);
313 1.1 mrg }
314 1.1 mrg else /* use q2=1 */
315 1.1 mrg mpfr_set_ui (q2, 1, MPFR_RNDN);
316 1.1 mrg for (precv = precq; precv <= 10 * precq; precv += precq)
317 1.1 mrg {
318 1.1 mrg mpfr_set_prec (v, precv);
319 1.1 mrg do
320 1.1 mrg {
321 1.1 mrg mpfr_urandomb (v, RANDS);
322 1.1 mrg }
323 1.1 mrg while (mpfr_cmp_ui (v, 0) == 0);
324 1.1 mrg for (precu = precq; precu <= 10 * precq; precu += precq)
325 1.1 mrg {
326 1.1 mrg mpfr_set_prec (u, precu);
327 1.1 mrg mpfr_mul (u, v, q2, MPFR_RNDN);
328 1.1 mrg mpfr_nextbelow (u);
329 1.1 mrg for (i = 0; i <= 2; i++)
330 1.1 mrg {
331 1.1 mrg RND_LOOP(rnd)
332 1.1 mrg {
333 1.1 mrg inex = test_div (q, u, v, (mpfr_rnd_t) rnd);
334 1.1 mrg inex2 = get_inexact (q, u, v);
335 1.1 mrg if (inex_cmp (inex, inex2))
336 1.1 mrg {
337 1.1 mrg printf ("Wrong inexact flag for rnd=%s: expected %d, got %d\n",
338 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), inex2, inex);
339 1.1 mrg printf ("u= "); mpfr_dump (u);
340 1.1 mrg printf ("v= "); mpfr_dump (v);
341 1.1 mrg printf ("q= "); mpfr_dump (q);
342 1.1 mrg mpfr_set_prec (q2, precq + precv);
343 1.1 mrg mpfr_mul (q2, q, v, MPFR_RNDN);
344 1.1 mrg printf ("q*v="); mpfr_dump (q2);
345 1.1 mrg exit (1);
346 1.1 mrg }
347 1.1 mrg }
348 1.1 mrg mpfr_nextabove (u);
349 1.1 mrg }
350 1.1 mrg }
351 1.1 mrg }
352 1.1 mrg }
353 1.1 mrg }
354 1.1 mrg
355 1.1 mrg mpfr_clear (q);
356 1.1 mrg mpfr_clear (q2);
357 1.1 mrg mpfr_clear (u);
358 1.1 mrg mpfr_clear (v);
359 1.1 mrg }
360 1.1 mrg
361 1.1 mrg static void
362 1.1 mrg check_lowr (void)
363 1.1 mrg {
364 1.1 mrg mpfr_t x, y, z, z2, z3, tmp;
365 1.1 mrg int k, c, c2;
366 1.1 mrg
367 1.1 mrg
368 1.1 mrg mpfr_init2 (x, 1000);
369 1.1 mrg mpfr_init2 (y, 100);
370 1.1 mrg mpfr_init2 (tmp, 850);
371 1.1 mrg mpfr_init2 (z, 10);
372 1.1 mrg mpfr_init2 (z2, 10);
373 1.1 mrg mpfr_init2 (z3, 50);
374 1.1 mrg
375 1.1 mrg for (k = 1; k < KMAX; k++)
376 1.1 mrg {
377 1.1 mrg do
378 1.1 mrg {
379 1.1 mrg mpfr_urandomb (z, RANDS);
380 1.1 mrg }
381 1.1 mrg while (mpfr_cmp_ui (z, 0) == 0);
382 1.1 mrg do
383 1.1 mrg {
384 1.1 mrg mpfr_urandomb (tmp, RANDS);
385 1.1 mrg }
386 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0);
387 1.1 mrg mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
388 1.1 mrg c = test_div (z2, x, tmp, MPFR_RNDN);
389 1.1 mrg
390 1.1 mrg if (c || mpfr_cmp (z2, z))
391 1.1 mrg {
392 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
393 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
394 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
395 1.1 mrg printf ("inex flag = %d, expected 0\n", c);
396 1.1 mrg exit (1);
397 1.1 mrg }
398 1.1 mrg }
399 1.1 mrg
400 1.1 mrg /* x has still precision 1000, z precision 10, and tmp prec 850 */
401 1.1 mrg mpfr_set_prec (z2, 9);
402 1.1 mrg for (k = 1; k < KMAX; k++)
403 1.1 mrg {
404 1.1 mrg mpfr_urandomb (z, RANDS);
405 1.1 mrg do
406 1.1 mrg {
407 1.1 mrg mpfr_urandomb (tmp, RANDS);
408 1.1 mrg }
409 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0);
410 1.1 mrg mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
411 1.1 mrg c = test_div (z2, x, tmp, MPFR_RNDN);
412 1.1 mrg /* since z2 has one less bit that z, either the division is exact
413 1.1 mrg if z is representable on 9 bits, or we have an even round case */
414 1.1 mrg
415 1.1 mrg c2 = get_inexact (z2, x, tmp);
416 1.1 mrg if ((mpfr_cmp (z2, z) == 0 && c) || inex_cmp (c, c2))
417 1.1 mrg {
418 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
419 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
420 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
421 1.1 mrg printf ("inex flag = %d, expected %d\n", c, c2);
422 1.1 mrg exit (1);
423 1.1 mrg }
424 1.1 mrg else if (c == 2)
425 1.1 mrg {
426 1.1 mrg mpfr_nexttoinf (z);
427 1.1 mrg if (mpfr_cmp(z2, z))
428 1.1 mrg {
429 1.1 mrg printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
430 1.1 mrg printf ("Dividing ");
431 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
432 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
433 1.1 mrg printf ("inex flag = %d\n", 1);
434 1.1 mrg exit (1);
435 1.1 mrg }
436 1.1 mrg }
437 1.1 mrg else if (c == -2)
438 1.1 mrg {
439 1.1 mrg mpfr_nexttozero (z);
440 1.1 mrg if (mpfr_cmp(z2, z))
441 1.1 mrg {
442 1.1 mrg printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
443 1.1 mrg printf ("Dividing ");
444 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
445 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
446 1.1 mrg printf ("inex flag = %d\n", 1);
447 1.1 mrg exit (1);
448 1.1 mrg }
449 1.1 mrg }
450 1.1 mrg }
451 1.1 mrg
452 1.1 mrg mpfr_set_prec(x, 1000);
453 1.1 mrg mpfr_set_prec(y, 100);
454 1.1 mrg mpfr_set_prec(tmp, 850);
455 1.1 mrg mpfr_set_prec(z, 10);
456 1.1 mrg mpfr_set_prec(z2, 10);
457 1.1 mrg
458 1.1 mrg /* almost exact divisions */
459 1.1 mrg for (k = 1; k < KMAX; k++)
460 1.1 mrg {
461 1.1 mrg do
462 1.1 mrg {
463 1.1 mrg mpfr_urandomb (z, RANDS);
464 1.1 mrg }
465 1.1 mrg while (mpfr_cmp_ui (z, 0) == 0);
466 1.1 mrg do
467 1.1 mrg {
468 1.1 mrg mpfr_urandomb (tmp, RANDS);
469 1.1 mrg }
470 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0);
471 1.1 mrg mpfr_mul(x, z, tmp, MPFR_RNDN);
472 1.1 mrg mpfr_set(y, tmp, MPFR_RNDD);
473 1.1 mrg mpfr_nexttoinf (x);
474 1.1 mrg
475 1.1 mrg c = test_div(z2, x, y, MPFR_RNDD);
476 1.1 mrg test_div(z3, x, y, MPFR_RNDD);
477 1.1 mrg mpfr_set(z, z3, MPFR_RNDD);
478 1.1 mrg
479 1.1 mrg if (c != -1 || mpfr_cmp(z2, z))
480 1.1 mrg {
481 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDD\n");
482 1.1 mrg printf ("got "); mpfr_print_binary(z2); puts ("");
483 1.1 mrg printf ("instead of "); mpfr_print_binary(z); puts ("");
484 1.1 mrg printf ("inex flag = %d\n", c);
485 1.1 mrg exit (1);
486 1.1 mrg }
487 1.1 mrg
488 1.1 mrg mpfr_set (y, tmp, MPFR_RNDU);
489 1.1 mrg test_div (z3, x, y, MPFR_RNDU);
490 1.1 mrg mpfr_set (z, z3, MPFR_RNDU);
491 1.1 mrg c = test_div (z2, x, y, MPFR_RNDU);
492 1.1 mrg if (c != 1 || mpfr_cmp (z2, z))
493 1.1 mrg {
494 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDU\n");
495 1.1 mrg printf ("u="); mpfr_dump (x);
496 1.1 mrg printf ("v="); mpfr_dump (y);
497 1.1 mrg printf ("got "); mpfr_print_binary (z2); puts ("");
498 1.1 mrg printf ("instead of "); mpfr_print_binary (z); puts ("");
499 1.1 mrg printf ("inex flag = %d\n", c);
500 1.1 mrg exit (1);
501 1.1 mrg }
502 1.1 mrg }
503 1.1 mrg
504 1.1 mrg mpfr_clear (x);
505 1.1 mrg mpfr_clear (y);
506 1.1 mrg mpfr_clear (z);
507 1.1 mrg mpfr_clear (z2);
508 1.1 mrg mpfr_clear (z3);
509 1.1 mrg mpfr_clear (tmp);
510 1.1 mrg }
511 1.1 mrg
512 1.1 mrg #define MAX_PREC 128
513 1.1 mrg
514 1.1 mrg static void
515 1.1 mrg check_inexact (void)
516 1.1 mrg {
517 1.1 mrg mpfr_t x, y, z, u;
518 1.1 mrg mpfr_prec_t px, py, pu;
519 1.1 mrg int inexact, cmp;
520 1.1 mrg mpfr_rnd_t rnd;
521 1.1 mrg
522 1.1 mrg mpfr_init (x);
523 1.1 mrg mpfr_init (y);
524 1.1 mrg mpfr_init (z);
525 1.1 mrg mpfr_init (u);
526 1.1 mrg
527 1.1 mrg mpfr_set_prec (x, 28);
528 1.1 mrg mpfr_set_prec (y, 28);
529 1.1 mrg mpfr_set_prec (z, 1023);
530 1.1 mrg mpfr_set_str_binary (x, "0.1000001001101101111100010011E0");
531 1.1 mrg mpfr_set_str (z, "48284762641021308813686974720835219181653367326353400027913400579340343320519877153813133510034402932651132854764198688352364361009429039801248971901380781746767119334993621199563870113045276395603170432175354501451429471578325545278975153148347684600400321033502982713296919861760382863826626093689036010394", 10, MPFR_RNDN);
532 1.1 mrg mpfr_div (x, x, z, MPFR_RNDN);
533 1.1 mrg mpfr_set_str_binary (y, "0.1111001011001101001001111100E-1023");
534 1.1 mrg if (mpfr_cmp (x, y))
535 1.1 mrg {
536 1.1 mrg printf ("Error in mpfr_div for prec=28, RNDN\n");
537 1.1 mrg printf ("Expected "); mpfr_dump (y);
538 1.1 mrg printf ("Got "); mpfr_dump (x);
539 1.1 mrg exit (1);
540 1.1 mrg }
541 1.1 mrg
542 1.1 mrg mpfr_set_prec (x, 53);
543 1.1 mrg mpfr_set_str_binary (x, "0.11101100110010100011011000000100001111011111110010101E0");
544 1.1 mrg mpfr_set_prec (u, 127);
545 1.1 mrg mpfr_set_str_binary (u, "0.1000001100110110110101110110101101111000110000001111111110000000011111001010110100110010111111111101000001011011101011101101000E-2");
546 1.1 mrg mpfr_set_prec (y, 95);
547 1.1 mrg inexact = test_div (y, x, u, MPFR_RNDN);
548 1.1 mrg if (inexact != (cmp = get_inexact (y, x, u)))
549 1.1 mrg {
550 1.1 mrg printf ("Wrong inexact flag (0): expected %d, got %d\n", cmp, inexact);
551 1.1 mrg printf ("x="); mpfr_out_str (stdout, 10, 99, x, MPFR_RNDN); printf ("\n");
552 1.1 mrg printf ("u="); mpfr_out_str (stdout, 10, 99, u, MPFR_RNDN); printf ("\n");
553 1.1 mrg printf ("y="); mpfr_out_str (stdout, 10, 99, y, MPFR_RNDN); printf ("\n");
554 1.1 mrg exit (1);
555 1.1 mrg }
556 1.1 mrg
557 1.1 mrg mpfr_set_prec (x, 33);
558 1.1 mrg mpfr_set_str_binary (x, "0.101111100011011101010011101100001E0");
559 1.1 mrg mpfr_set_prec (u, 2);
560 1.1 mrg mpfr_set_str_binary (u, "0.1E0");
561 1.1 mrg mpfr_set_prec (y, 28);
562 1.1 mrg if ((inexact = test_div (y, x, u, MPFR_RNDN) >= 0))
563 1.1 mrg {
564 1.1 mrg printf ("Wrong inexact flag (1): expected -1, got %d\n",
565 1.1 mrg inexact);
566 1.1 mrg exit (1);
567 1.1 mrg }
568 1.1 mrg
569 1.1 mrg mpfr_set_prec (x, 129);
570 1.1 mrg mpfr_set_str_binary (x, "0.111110101111001100000101011100101100110011011101010001000110110101100101000010000001110110100001101010001010100010001111001101010E-2");
571 1.1 mrg mpfr_set_prec (u, 15);
572 1.1 mrg mpfr_set_str_binary (u, "0.101101000001100E-1");
573 1.1 mrg mpfr_set_prec (y, 92);
574 1.1 mrg if ((inexact = test_div (y, x, u, MPFR_RNDN)) <= 0)
575 1.1 mrg {
576 1.1 mrg printf ("Wrong inexact flag for rnd=MPFR_RNDN(1): expected 1, got %d\n",
577 1.1 mrg inexact);
578 1.1 mrg mpfr_dump (x);
579 1.1 mrg mpfr_dump (u);
580 1.1 mrg mpfr_dump (y);
581 1.1 mrg exit (1);
582 1.1 mrg }
583 1.1 mrg
584 1.1 mrg for (px=2; px<MAX_PREC; px++)
585 1.1 mrg {
586 1.1 mrg mpfr_set_prec (x, px);
587 1.1 mrg mpfr_urandomb (x, RANDS);
588 1.1 mrg for (pu=2; pu<=MAX_PREC; pu++)
589 1.1 mrg {
590 1.1 mrg mpfr_set_prec (u, pu);
591 1.1 mrg do { mpfr_urandomb (u, RANDS); } while (mpfr_cmp_ui (u, 0) == 0);
592 1.1 mrg {
593 1.1 mrg py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - MPFR_PREC_MIN));
594 1.1 mrg mpfr_set_prec (y, py);
595 1.1 mrg mpfr_set_prec (z, py + pu);
596 1.1 mrg {
597 1.1 mrg rnd = RND_RAND ();
598 1.1 mrg inexact = test_div (y, x, u, rnd);
599 1.1 mrg if (mpfr_mul (z, y, u, rnd))
600 1.1 mrg {
601 1.1 mrg printf ("z <- y * u should be exact\n");
602 1.1 mrg exit (1);
603 1.1 mrg }
604 1.1 mrg cmp = mpfr_cmp (z, x);
605 1.1 mrg if (((inexact == 0) && (cmp != 0)) ||
606 1.1 mrg ((inexact > 0) && (cmp <= 0)) ||
607 1.1 mrg ((inexact < 0) && (cmp >= 0)))
608 1.1 mrg {
609 1.1 mrg printf ("Wrong inexact flag for rnd=%s\n",
610 1.1 mrg mpfr_print_rnd_mode(rnd));
611 1.1 mrg printf ("expected %d, got %d\n", cmp, inexact);
612 1.1 mrg printf ("x="); mpfr_print_binary (x); puts ("");
613 1.1 mrg printf ("u="); mpfr_print_binary (u); puts ("");
614 1.1 mrg printf ("y="); mpfr_print_binary (y); puts ("");
615 1.1 mrg printf ("y*u="); mpfr_print_binary (z); puts ("");
616 1.1 mrg exit (1);
617 1.1 mrg }
618 1.1 mrg }
619 1.1 mrg }
620 1.1 mrg }
621 1.1 mrg }
622 1.1 mrg
623 1.1 mrg mpfr_clear (x);
624 1.1 mrg mpfr_clear (y);
625 1.1 mrg mpfr_clear (z);
626 1.1 mrg mpfr_clear (u);
627 1.1 mrg }
628 1.1 mrg
629 1.1 mrg static void
630 1.1 mrg check_nan (void)
631 1.1 mrg {
632 1.1 mrg mpfr_t a, d, q;
633 1.1 mrg mpfr_exp_t emax, emin;
634 1.1 mrg int i;
635 1.1 mrg
636 1.1 mrg mpfr_init2 (a, 100L);
637 1.1 mrg mpfr_init2 (d, 100L);
638 1.1 mrg mpfr_init2 (q, 100L);
639 1.1 mrg
640 1.1 mrg /* 1/nan == nan */
641 1.1 mrg mpfr_set_ui (a, 1L, MPFR_RNDN);
642 1.1 mrg MPFR_SET_NAN (d);
643 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
644 1.1 mrg MPFR_ASSERTN (mpfr_nan_p (q));
645 1.1 mrg
646 1.1 mrg /* nan/1 == nan */
647 1.1 mrg MPFR_SET_NAN (a);
648 1.1 mrg mpfr_set_ui (d, 1L, MPFR_RNDN);
649 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
650 1.1 mrg MPFR_ASSERTN (mpfr_nan_p (q));
651 1.1 mrg
652 1.1 mrg /* +inf/1 == +inf */
653 1.1 mrg MPFR_SET_INF (a);
654 1.1 mrg MPFR_SET_POS (a);
655 1.1 mrg mpfr_set_ui (d, 1L, MPFR_RNDN);
656 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
657 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q));
658 1.1 mrg MPFR_ASSERTN (mpfr_sgn (q) > 0);
659 1.1 mrg
660 1.1 mrg /* 1/+inf == 0 */
661 1.1 mrg mpfr_set_ui (a, 1L, MPFR_RNDN);
662 1.1 mrg MPFR_SET_INF (d);
663 1.1 mrg MPFR_SET_POS (d);
664 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
665 1.1 mrg MPFR_ASSERTN (mpfr_number_p (q));
666 1.1 mrg MPFR_ASSERTN (mpfr_sgn (q) == 0);
667 1.1 mrg
668 1.1 mrg /* 0/0 == nan */
669 1.1 mrg mpfr_set_ui (a, 0L, MPFR_RNDN);
670 1.1 mrg mpfr_set_ui (d, 0L, MPFR_RNDN);
671 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
672 1.1 mrg MPFR_ASSERTN (mpfr_nan_p (q));
673 1.1 mrg
674 1.1 mrg /* +inf/+inf == nan */
675 1.1 mrg MPFR_SET_INF (a);
676 1.1 mrg MPFR_SET_POS (a);
677 1.1 mrg MPFR_SET_INF (d);
678 1.1 mrg MPFR_SET_POS (d);
679 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
680 1.1 mrg MPFR_ASSERTN (mpfr_nan_p (q));
681 1.1 mrg
682 1.1 mrg /* 1/+0 = +Inf */
683 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ);
684 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
685 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
686 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
687 1.1 mrg
688 1.1 mrg /* 1/-0 = -Inf */
689 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ);
690 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
691 1.1 mrg mpfr_neg (d, d, MPFR_RNDZ);
692 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
693 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
694 1.1 mrg
695 1.1 mrg /* -1/+0 = -Inf */
696 1.1 mrg mpfr_set_si (a, -1, MPFR_RNDZ);
697 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
698 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
699 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
700 1.1 mrg
701 1.1 mrg /* -1/-0 = +Inf */
702 1.1 mrg mpfr_set_si (a, -1, MPFR_RNDZ);
703 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ);
704 1.1 mrg mpfr_neg (d, d, MPFR_RNDZ);
705 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
706 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
707 1.1 mrg
708 1.1 mrg /* check overflow */
709 1.1 mrg emax = mpfr_get_emax ();
710 1.1 mrg set_emax (1);
711 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ);
712 1.1 mrg mpfr_set_ui (d, 1, MPFR_RNDZ);
713 1.1 mrg mpfr_div_2exp (d, d, 1, MPFR_RNDZ);
714 1.1 mrg test_div (q, a, d, MPFR_RNDU); /* 1 / 0.5 = 2 -> overflow */
715 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
716 1.1 mrg set_emax (emax);
717 1.1 mrg
718 1.1 mrg /* check underflow */
719 1.1 mrg emin = mpfr_get_emin ();
720 1.1 mrg set_emin (-1);
721 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ);
722 1.1 mrg mpfr_div_2exp (a, a, 2, MPFR_RNDZ);
723 1.1 mrg mpfr_set_prec (d, mpfr_get_prec (q) + 8);
724 1.1 mrg for (i = -1; i <= 1; i++)
725 1.1 mrg {
726 1.1 mrg int sign;
727 1.1 mrg
728 1.1 mrg /* Test 2^(-2) / (+/- (2 + eps)), with eps < 0, eps = 0, eps > 0.
729 1.1 mrg -> underflow.
730 1.1 mrg With div.c r5513, this test fails for eps > 0 in MPFR_RNDN. */
731 1.1 mrg mpfr_set_ui (d, 2, MPFR_RNDZ);
732 1.1 mrg if (i < 0)
733 1.1 mrg mpfr_nextbelow (d);
734 1.1 mrg if (i > 0)
735 1.1 mrg mpfr_nextabove (d);
736 1.1 mrg for (sign = 0; sign <= 1; sign++)
737 1.1 mrg {
738 1.1 mrg mpfr_clear_flags ();
739 1.1 mrg test_div (q, a, d, MPFR_RNDZ); /* result = 0 */
740 1.1 mrg MPFR_ASSERTN (mpfr_underflow_p ());
741 1.1 mrg MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
742 1.1 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q));
743 1.1 mrg mpfr_clear_flags ();
744 1.1 mrg test_div (q, a, d, MPFR_RNDN); /* result = 0 iff eps >= 0 */
745 1.1 mrg MPFR_ASSERTN (mpfr_underflow_p ());
746 1.1 mrg MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
747 1.1 mrg if (i < 0)
748 1.1 mrg mpfr_nexttozero (q);
749 1.1 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q));
750 1.1 mrg mpfr_neg (d, d, MPFR_RNDN);
751 1.1 mrg }
752 1.1 mrg }
753 1.1 mrg set_emin (emin);
754 1.1 mrg
755 1.1 mrg mpfr_clear (a);
756 1.1 mrg mpfr_clear (d);
757 1.1 mrg mpfr_clear (q);
758 1.1 mrg }
759 1.1 mrg
760 1.1 mrg static void
761 1.1 mrg consistency (void)
762 1.1 mrg {
763 1.1 mrg mpfr_t x, y, z1, z2;
764 1.1 mrg int i;
765 1.1 mrg
766 1.1 mrg mpfr_inits (x, y, z1, z2, (mpfr_ptr) 0);
767 1.1 mrg
768 1.1 mrg for (i = 0; i < 10000; i++)
769 1.1 mrg {
770 1.1 mrg mpfr_rnd_t rnd;
771 1.1 mrg mpfr_prec_t px, py, pz, p;
772 1.1 mrg int inex1, inex2;
773 1.1 mrg
774 1.1 mrg rnd = RND_RAND ();
775 1.1 mrg px = (randlimb () % 256) + 2;
776 1.1 mrg py = (randlimb () % 128) + 2;
777 1.1 mrg pz = (randlimb () % 256) + 2;
778 1.1 mrg mpfr_set_prec (x, px);
779 1.1 mrg mpfr_set_prec (y, py);
780 1.1 mrg mpfr_set_prec (z1, pz);
781 1.1 mrg mpfr_set_prec (z2, pz);
782 1.1 mrg mpfr_urandomb (x, RANDS);
783 1.1 mrg do
784 1.1 mrg mpfr_urandomb (y, RANDS);
785 1.1 mrg while (mpfr_zero_p (y));
786 1.1 mrg inex1 = mpfr_div (z1, x, y, rnd);
787 1.1 mrg MPFR_ASSERTN (!MPFR_IS_NAN (z1));
788 1.1 mrg p = MAX (MAX (px, py), pz);
789 1.1 mrg if (mpfr_prec_round (x, p, MPFR_RNDN) != 0 ||
790 1.1 mrg mpfr_prec_round (y, p, MPFR_RNDN) != 0)
791 1.1 mrg {
792 1.1 mrg printf ("mpfr_prec_round error for i = %d\n", i);
793 1.1 mrg exit (1);
794 1.1 mrg }
795 1.1 mrg inex2 = mpfr_div (z2, x, y, rnd);
796 1.1 mrg MPFR_ASSERTN (!MPFR_IS_NAN (z2));
797 1.1 mrg if (inex1 != inex2 || mpfr_cmp (z1, z2) != 0)
798 1.1 mrg {
799 1.1 mrg printf ("Consistency error for i = %d\n", i);
800 1.1 mrg exit (1);
801 1.1 mrg }
802 1.1 mrg }
803 1.1 mrg
804 1.1 mrg mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0);
805 1.1 mrg }
806 1.1 mrg
807 1.1 mrg /* Reported by Carl Witty on 2007-06-03 */
808 1.1 mrg static void
809 1.1 mrg test_20070603 (void)
810 1.1 mrg {
811 1.1 mrg mpfr_t n, d, q, c;
812 1.1 mrg
813 1.1 mrg mpfr_init2 (n, 128);
814 1.1 mrg mpfr_init2 (d, 128);
815 1.1 mrg mpfr_init2 (q, 31);
816 1.1 mrg mpfr_init2 (c, 31);
817 1.1 mrg
818 1.1 mrg mpfr_set_str (n, "10384593717069655257060992206846485", 10, MPFR_RNDN);
819 1.1 mrg mpfr_set_str (d, "10384593717069655257060992206847132", 10, MPFR_RNDN);
820 1.1 mrg mpfr_div (q, n, d, MPFR_RNDU);
821 1.1 mrg
822 1.1 mrg mpfr_set_ui (c, 1, MPFR_RNDN);
823 1.1 mrg if (mpfr_cmp (q, c) != 0)
824 1.1 mrg {
825 1.1 mrg printf ("Error in test_20070603\nGot ");
826 1.1 mrg mpfr_dump (q);
827 1.1 mrg printf ("instead of ");
828 1.1 mrg mpfr_dump (c);
829 1.1 mrg exit (1);
830 1.1 mrg }
831 1.1 mrg
832 1.1 mrg /* same for 64-bit machines */
833 1.1 mrg mpfr_set_prec (n, 256);
834 1.1 mrg mpfr_set_prec (d, 256);
835 1.1 mrg mpfr_set_prec (q, 63);
836 1.1 mrg mpfr_set_str (n, "822752278660603021077484591278675252491367930877209729029898240", 10, MPFR_RNDN);
837 1.1 mrg mpfr_set_str (d, "822752278660603021077484591278675252491367930877212507873738752", 10, MPFR_RNDN);
838 1.1 mrg mpfr_div (q, n, d, MPFR_RNDU);
839 1.1 mrg if (mpfr_cmp (q, c) != 0)
840 1.1 mrg {
841 1.1 mrg printf ("Error in test_20070603\nGot ");
842 1.1 mrg mpfr_dump (q);
843 1.1 mrg printf ("instead of ");
844 1.1 mrg mpfr_dump (c);
845 1.1 mrg exit (1);
846 1.1 mrg }
847 1.1 mrg
848 1.1 mrg mpfr_clear (n);
849 1.1 mrg mpfr_clear (d);
850 1.1 mrg mpfr_clear (q);
851 1.1 mrg mpfr_clear (c);
852 1.1 mrg }
853 1.1 mrg
854 1.1 mrg /* Bug found while adding tests for mpfr_cot */
855 1.1 mrg static void
856 1.1 mrg test_20070628 (void)
857 1.1 mrg {
858 1.1 mrg mpfr_exp_t old_emax;
859 1.1 mrg mpfr_t x, y;
860 1.1 mrg int inex, err = 0;
861 1.1 mrg
862 1.1 mrg old_emax = mpfr_get_emax ();
863 1.1 mrg
864 1.1 mrg if (mpfr_set_emax (256))
865 1.1 mrg {
866 1.1 mrg printf ("Can't change exponent range\n");
867 1.1 mrg exit (1);
868 1.1 mrg }
869 1.1 mrg
870 1.1 mrg mpfr_inits2 (53, x, y, (mpfr_ptr) 0);
871 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
872 1.1 mrg mpfr_set_si_2exp (y, 1, -256, MPFR_RNDN);
873 1.1 mrg mpfr_clear_flags ();
874 1.1 mrg inex = mpfr_div (x, x, y, MPFR_RNDD);
875 1.1 mrg if (MPFR_SIGN (x) >= 0 || ! mpfr_inf_p (x))
876 1.1 mrg {
877 1.1 mrg printf ("Error in test_20070628: expected -Inf, got\n");
878 1.1 mrg mpfr_dump (x);
879 1.1 mrg err++;
880 1.1 mrg }
881 1.1 mrg if (inex >= 0)
882 1.1 mrg {
883 1.1 mrg printf ("Error in test_20070628: expected inex < 0, got %d\n", inex);
884 1.1 mrg err++;
885 1.1 mrg }
886 1.1 mrg if (! mpfr_overflow_p ())
887 1.1 mrg {
888 1.1 mrg printf ("Error in test_20070628: overflow flag is not set\n");
889 1.1 mrg err++;
890 1.1 mrg }
891 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0);
892 1.1 mrg mpfr_set_emax (old_emax);
893 1.1 mrg }
894 1.1 mrg
895 1.1 mrg #define TEST_FUNCTION test_div
896 1.1 mrg #define TWO_ARGS
897 1.1 mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
898 1.1 mrg #include "tgeneric.c"
899 1.1 mrg
900 1.1 mrg int
901 1.1 mrg main (int argc, char *argv[])
902 1.1 mrg {
903 1.1 mrg tests_start_mpfr ();
904 1.1 mrg
905 1.1 mrg check_inexact ();
906 1.1 mrg check_hard ();
907 1.1 mrg check_nan ();
908 1.1 mrg check_lowr ();
909 1.1 mrg check_float (); /* checks single precision */
910 1.1 mrg check_double ();
911 1.1 mrg check_convergence ();
912 1.1 mrg check_64 ();
913 1.1 mrg
914 1.1 mrg check4("4.0","4.503599627370496e15", MPFR_RNDZ, 62,
915 1.1 mrg "0.10000000000000000000000000000000000000000000000000000000000000E-49");
916 1.1 mrg check4("1.0","2.10263340267725788209e+187", MPFR_RNDU, 65,
917 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-622");
918 1.1 mrg check4("2.44394909079968374564e-150", "2.10263340267725788209e+187",MPFR_RNDU,
919 1.1 mrg 65,
920 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-1119");
921 1.1 mrg
922 1.1 mrg consistency ();
923 1.1 mrg test_20070603 ();
924 1.1 mrg test_20070628 ();
925 1.1 mrg test_generic (2, 800, 50);
926 1.1 mrg
927 1.1 mrg tests_end_mpfr ();
928 1.1 mrg return 0;
929 1.1 mrg }
930