tgeneric.c revision 1.1 1 1.1 mrg /* Generic test file for functions with one or two arguments (the second being
2 1.1 mrg either mpfr_t or double).
3 1.1 mrg
4 1.1 mrg Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
5 1.1 mrg Contributed by the Arenaire and Cacao projects, INRIA.
6 1.1 mrg
7 1.1 mrg This file is part of the GNU MPFR Library.
8 1.1 mrg
9 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
10 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
11 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
12 1.1 mrg option) any later version.
13 1.1 mrg
14 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
15 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 1.1 mrg License for more details.
18 1.1 mrg
19 1.1 mrg You should have received a copy of the GNU Lesser General Public License
20 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
21 1.1 mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
22 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
23 1.1 mrg
24 1.1 mrg /* define TWO_ARGS for two-argument functions like mpfr_pow
25 1.1 mrg define DOUBLE_ARG1 or DOUBLE_ARG2 for function with a double operand in
26 1.1 mrg first or second place like sub_d or d_sub */
27 1.1 mrg
28 1.1 mrg #ifndef TEST_RANDOM_POS
29 1.1 mrg /* For the random function: one number on two is negative. */
30 1.1 mrg #define TEST_RANDOM_POS 256
31 1.1 mrg #endif
32 1.1 mrg
33 1.1 mrg #ifndef TEST_RANDOM_POS2
34 1.1 mrg /* For the random function: one number on two is negative. */
35 1.1 mrg #define TEST_RANDOM_POS2 256
36 1.1 mrg #endif
37 1.1 mrg
38 1.1 mrg #ifndef TEST_RANDOM_EMIN
39 1.1 mrg #define TEST_RANDOM_EMIN -256
40 1.1 mrg #endif
41 1.1 mrg
42 1.1 mrg #ifndef TEST_RANDOM_EMAX
43 1.1 mrg #define TEST_RANDOM_EMAX 255
44 1.1 mrg #endif
45 1.1 mrg
46 1.1 mrg /* The (void *) below is needed to avoid a warning with gcc 4.2+ and functions
47 1.1 mrg * with 2 arguments. See <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36299>.
48 1.1 mrg */
49 1.1 mrg #define TGENERIC_FAIL(S, X, U) \
50 1.1 mrg do \
51 1.1 mrg { \
52 1.1 mrg printf ("%s\nx = ", (S)); \
53 1.1 mrg mpfr_out_str (stdout, 2, 0, (X), MPFR_RNDN); \
54 1.1 mrg printf ("\n"); \
55 1.1 mrg if ((void *) U != 0) \
56 1.1 mrg { \
57 1.1 mrg printf ("u = "); \
58 1.1 mrg mpfr_out_str (stdout, 2, 0, (U), MPFR_RNDN); \
59 1.1 mrg printf ("\n"); \
60 1.1 mrg } \
61 1.1 mrg printf ("yprec = %u, rnd_mode = %s, inexact = %d, flags = %u\n", \
62 1.1 mrg (unsigned int) yprec, mpfr_print_rnd_mode (rnd), compare, \
63 1.1 mrg (unsigned int) __gmpfr_flags); \
64 1.1 mrg exit (1); \
65 1.1 mrg } \
66 1.1 mrg while (0)
67 1.1 mrg
68 1.1 mrg #undef TGENERIC_CHECK
69 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
70 1.1 mrg #define TGENERIC_CHECK(S, EXPR) \
71 1.1 mrg do if (!(EXPR)) TGENERIC_FAIL (S, x, u); while (0)
72 1.1 mrg #else
73 1.1 mrg #define TGENERIC_CHECK(S, EXPR) \
74 1.1 mrg do if (!(EXPR)) TGENERIC_FAIL (S, x, 0); while (0)
75 1.1 mrg #endif
76 1.1 mrg
77 1.1 mrg #ifdef DEBUG_TGENERIC
78 1.1 mrg #define STR(F) #F
79 1.1 mrg #define TGENERIC_IAUX(F,P,X,U) \
80 1.1 mrg do \
81 1.1 mrg { \
82 1.1 mrg printf ("tgeneric: testing function " STR(F) \
83 1.1 mrg ", %s, target prec = %lu\nx = ", \
84 1.1 mrg mpfr_print_rnd_mode (rnd), (unsigned long) (P)); \
85 1.1 mrg mpfr_out_str (stdout, 2, 0, (X), MPFR_RNDN); \
86 1.1 mrg printf ("\n"); \
87 1.1 mrg if (U) \
88 1.1 mrg { \
89 1.1 mrg printf ("u = "); \
90 1.1 mrg mpfr_out_str (stdout, 2, 0, (U), MPFR_RNDN); \
91 1.1 mrg printf ("\n"); \
92 1.1 mrg } \
93 1.1 mrg } \
94 1.1 mrg while (0)
95 1.1 mrg #undef TGENERIC_INFO
96 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
97 1.1 mrg #define TGENERIC_INFO(F,P) TGENERIC_IAUX(F,P,x,u)
98 1.1 mrg #else
99 1.1 mrg #define TGENERIC_INFO(F,P) TGENERIC_IAUX(F,P,x,0)
100 1.1 mrg #endif
101 1.1 mrg #endif
102 1.1 mrg
103 1.1 mrg /* For some functions (for example cos), the argument reduction is too
104 1.1 mrg expensive when using mpfr_get_emax(). Then simply define REDUCE_EMAX
105 1.1 mrg to some reasonable value before including tgeneric.c. */
106 1.1 mrg #ifndef REDUCE_EMAX
107 1.1 mrg #define REDUCE_EMAX mpfr_get_emax ()
108 1.1 mrg #endif
109 1.1 mrg
110 1.1 mrg static void
111 1.1 mrg test_generic (mpfr_prec_t p0, mpfr_prec_t p1, unsigned int N)
112 1.1 mrg {
113 1.1 mrg mpfr_prec_t prec, xprec, yprec;
114 1.1 mrg mpfr_t x, y, z, t, w;
115 1.1 mrg #ifdef TWO_ARGS
116 1.1 mrg mpfr_t u;
117 1.1 mrg #elif defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
118 1.1 mrg mpfr_t u;
119 1.1 mrg double d;
120 1.1 mrg #endif
121 1.1 mrg mpfr_rnd_t rnd;
122 1.1 mrg int inexact, compare, compare2;
123 1.1 mrg unsigned int n;
124 1.1 mrg unsigned long ctrt = 0, ctrn = 0;
125 1.1 mrg mpfr_exp_t old_emin, old_emax;
126 1.1 mrg
127 1.1 mrg old_emin = mpfr_get_emin ();
128 1.1 mrg old_emax = mpfr_get_emax ();
129 1.1 mrg
130 1.1 mrg mpfr_inits2 (MPFR_PREC_MIN, x, y, z, t, w, (mpfr_ptr) 0);
131 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
132 1.1 mrg mpfr_init2 (u, MPFR_PREC_MIN);
133 1.1 mrg #endif
134 1.1 mrg
135 1.1 mrg /* generic test */
136 1.1 mrg for (prec = p0; prec <= p1; prec++)
137 1.1 mrg {
138 1.1 mrg mpfr_set_prec (z, prec);
139 1.1 mrg mpfr_set_prec (t, prec);
140 1.1 mrg yprec = prec + 10;
141 1.1 mrg mpfr_set_prec (y, yprec);
142 1.1 mrg mpfr_set_prec (w, yprec);
143 1.1 mrg
144 1.1 mrg /* Note: in precision p1, we test 4 special cases. */
145 1.1 mrg for (n = 0; n < (prec == p1 ? N + 4 : N); n++)
146 1.1 mrg {
147 1.1 mrg xprec = prec;
148 1.1 mrg if (randlimb () & 1)
149 1.1 mrg {
150 1.1 mrg xprec *= (double) randlimb () / MP_LIMB_T_MAX;
151 1.1 mrg if (xprec < MPFR_PREC_MIN)
152 1.1 mrg xprec = MPFR_PREC_MIN;
153 1.1 mrg }
154 1.1 mrg mpfr_set_prec (x, xprec);
155 1.1 mrg #ifdef TWO_ARGS
156 1.1 mrg mpfr_set_prec (u, xprec);
157 1.1 mrg #elif defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
158 1.1 mrg mpfr_set_prec (u, IEEE_DBL_MANT_DIG);
159 1.1 mrg #endif
160 1.1 mrg
161 1.1 mrg if (n > 3 || prec < p1)
162 1.1 mrg {
163 1.1 mrg #if defined(RAND_FUNCTION)
164 1.1 mrg RAND_FUNCTION (x);
165 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
166 1.1 mrg RAND_FUNCTION (u);
167 1.1 mrg #endif
168 1.1 mrg #else
169 1.1 mrg tests_default_random (x, TEST_RANDOM_POS,
170 1.1 mrg TEST_RANDOM_EMIN, TEST_RANDOM_EMAX);
171 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
172 1.1 mrg tests_default_random (u, TEST_RANDOM_POS2,
173 1.1 mrg TEST_RANDOM_EMIN, TEST_RANDOM_EMAX);
174 1.1 mrg #endif
175 1.1 mrg #endif
176 1.1 mrg }
177 1.1 mrg else
178 1.1 mrg {
179 1.1 mrg /* Special cases tested in precision p1 if n <= 3. They are
180 1.1 mrg useful really in the extended exponent range. */
181 1.1 mrg set_emin (MPFR_EMIN_MIN);
182 1.1 mrg set_emax (MPFR_EMAX_MAX);
183 1.1 mrg if (n <= 1)
184 1.1 mrg {
185 1.1 mrg mpfr_set_si (x, n == 0 ? 1 : -1, MPFR_RNDN);
186 1.1 mrg mpfr_set_exp (x, mpfr_get_emin ());
187 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
188 1.1 mrg mpfr_set_si (u, randlimb () % 2 == 0 ? 1 : -1, MPFR_RNDN);
189 1.1 mrg mpfr_set_exp (u, mpfr_get_emin ());
190 1.1 mrg #endif
191 1.1 mrg }
192 1.1 mrg else /* 2 <= n <= 3 */
193 1.1 mrg {
194 1.1 mrg if (getenv ("MPFR_CHECK_MAX") == NULL)
195 1.1 mrg goto next_n;
196 1.1 mrg mpfr_set_si (x, n == 0 ? 1 : -1, MPFR_RNDN);
197 1.1 mrg mpfr_setmax (x, REDUCE_EMAX);
198 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
199 1.1 mrg mpfr_set_si (u, randlimb () % 2 == 0 ? 1 : -1, MPFR_RNDN);
200 1.1 mrg mpfr_setmax (u, mpfr_get_emax ());
201 1.1 mrg #endif
202 1.1 mrg }
203 1.1 mrg }
204 1.1 mrg
205 1.1 mrg rnd = RND_RAND ();
206 1.1 mrg mpfr_clear_flags ();
207 1.1 mrg #ifdef DEBUG_TGENERIC
208 1.1 mrg TGENERIC_INFO (TEST_FUNCTION, MPFR_PREC (y));
209 1.1 mrg #endif
210 1.1 mrg #if defined(TWO_ARGS)
211 1.1 mrg compare = TEST_FUNCTION (y, x, u, rnd);
212 1.1 mrg #elif defined(DOUBLE_ARG1)
213 1.1 mrg d = mpfr_get_d (u, rnd);
214 1.1 mrg compare = TEST_FUNCTION (y, d, x, rnd);
215 1.1 mrg #elif defined(DOUBLE_ARG2)
216 1.1 mrg d = mpfr_get_d (u, rnd);
217 1.1 mrg compare = TEST_FUNCTION (y, x, d, rnd);
218 1.1 mrg #else
219 1.1 mrg compare = TEST_FUNCTION (y, x, rnd);
220 1.1 mrg #endif
221 1.1 mrg TGENERIC_CHECK ("Bad inexact flag",
222 1.1 mrg (compare != 0) ^ (mpfr_inexflag_p () == 0));
223 1.1 mrg ctrt++;
224 1.1 mrg /* Consistency test in a reduced exponent range. Doing it
225 1.1 mrg for the first 10 samples and for prec == p1 (which has
226 1.1 mrg some special cases) should be sufficient. */
227 1.1 mrg if (ctrt <= 10 || prec == p1)
228 1.1 mrg {
229 1.1 mrg unsigned int flags, oldflags = __gmpfr_flags;
230 1.1 mrg mpfr_exp_t e, emin, emax, oemin, oemax;
231 1.1 mrg
232 1.1 mrg /* Determine the smallest exponent range containing the
233 1.1 mrg exponents of the mpfr_t inputs (x, and u if TWO_ARGS)
234 1.1 mrg and output (y). */
235 1.1 mrg emin = MPFR_EMAX_MAX;
236 1.1 mrg emax = MPFR_EMIN_MIN;
237 1.1 mrg if (MPFR_IS_PURE_FP (x))
238 1.1 mrg {
239 1.1 mrg e = MPFR_GET_EXP (x);
240 1.1 mrg if (e < emin)
241 1.1 mrg emin = e;
242 1.1 mrg if (e > emax)
243 1.1 mrg emax = e;
244 1.1 mrg }
245 1.1 mrg if (MPFR_IS_PURE_FP (y))
246 1.1 mrg {
247 1.1 mrg e = MPFR_GET_EXP (y);
248 1.1 mrg if (e < emin)
249 1.1 mrg emin = e;
250 1.1 mrg if (e > emax)
251 1.1 mrg emax = e;
252 1.1 mrg }
253 1.1 mrg #if defined(TWO_ARGS)
254 1.1 mrg if (MPFR_IS_PURE_FP (u))
255 1.1 mrg {
256 1.1 mrg e = MPFR_GET_EXP (u);
257 1.1 mrg if (e < emin)
258 1.1 mrg emin = e;
259 1.1 mrg if (e > emax)
260 1.1 mrg emax = e;
261 1.1 mrg }
262 1.1 mrg #endif
263 1.1 mrg if (emin > emax)
264 1.1 mrg emin = emax; /* case where all values are singular */
265 1.1 mrg oemin = mpfr_get_emin ();
266 1.1 mrg oemax = mpfr_get_emax ();
267 1.1 mrg mpfr_set_emin (emin);
268 1.1 mrg mpfr_set_emax (emax);
269 1.1 mrg mpfr_clear_flags ();
270 1.1 mrg #if defined(TWO_ARGS)
271 1.1 mrg inexact = TEST_FUNCTION (w, x, u, rnd);
272 1.1 mrg #elif defined(DOUBLE_ARG1)
273 1.1 mrg inexact = TEST_FUNCTION (w, d, x, rnd);
274 1.1 mrg #elif defined(DOUBLE_ARG2)
275 1.1 mrg inexact = TEST_FUNCTION (w, x, d, rnd);
276 1.1 mrg #else
277 1.1 mrg inexact = TEST_FUNCTION (w, x, rnd);
278 1.1 mrg #endif
279 1.1 mrg flags = __gmpfr_flags;
280 1.1 mrg mpfr_set_emin (oemin);
281 1.1 mrg mpfr_set_emax (oemax);
282 1.1 mrg if (! (SAME_VAL (w, y) &&
283 1.1 mrg SAME_SIGN (inexact, compare) &&
284 1.1 mrg flags == oldflags))
285 1.1 mrg {
286 1.1 mrg printf ("Error in reduced exponent range [%"
287 1.1 mrg MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC "d] on:\n",
288 1.1 mrg (mpfr_eexp_t) emin, (mpfr_eexp_t) emax);
289 1.1 mrg printf ("x = ");
290 1.1 mrg mpfr_dump (x);
291 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
292 1.1 mrg printf ("u = ");
293 1.1 mrg mpfr_dump (u);
294 1.1 mrg #endif
295 1.1 mrg printf ("yprec = %u, rnd_mode = %s\n",
296 1.1 mrg (unsigned int) yprec, mpfr_print_rnd_mode (rnd));
297 1.1 mrg printf ("Expected:\n y = ");
298 1.1 mrg mpfr_dump (y);
299 1.1 mrg printf (" inex = %d, flags = %u\n",
300 1.1 mrg SIGN (compare), oldflags);
301 1.1 mrg printf ("Got:\n w = ");
302 1.1 mrg mpfr_dump (w);
303 1.1 mrg printf (" inex = %d, flags = %u\n",
304 1.1 mrg SIGN (inexact), flags);
305 1.1 mrg exit (1);
306 1.1 mrg }
307 1.1 mrg }
308 1.1 mrg if (MPFR_IS_SINGULAR (y))
309 1.1 mrg {
310 1.1 mrg if (MPFR_IS_NAN (y) || mpfr_nanflag_p ())
311 1.1 mrg TGENERIC_CHECK ("Bad NaN flag",
312 1.1 mrg MPFR_IS_NAN (y) && mpfr_nanflag_p ());
313 1.1 mrg else if (MPFR_IS_INF (y))
314 1.1 mrg TGENERIC_CHECK ("Bad overflow flag",
315 1.1 mrg (compare != 0) ^ (mpfr_overflow_p () == 0));
316 1.1 mrg else if (MPFR_IS_ZERO (y))
317 1.1 mrg TGENERIC_CHECK ("Bad underflow flag",
318 1.1 mrg (compare != 0) ^ (mpfr_underflow_p () == 0));
319 1.1 mrg }
320 1.1 mrg else if (mpfr_overflow_p ())
321 1.1 mrg {
322 1.1 mrg TGENERIC_CHECK ("Bad compare value (overflow)", compare != 0);
323 1.1 mrg mpfr_nexttoinf (y);
324 1.1 mrg TGENERIC_CHECK ("Should have been max MPFR number",
325 1.1 mrg MPFR_IS_INF (y));
326 1.1 mrg }
327 1.1 mrg else if (mpfr_underflow_p ())
328 1.1 mrg {
329 1.1 mrg TGENERIC_CHECK ("Bad compare value (underflow)", compare != 0);
330 1.1 mrg mpfr_nexttozero (y);
331 1.1 mrg TGENERIC_CHECK ("Should have been min MPFR number",
332 1.1 mrg MPFR_IS_ZERO (y));
333 1.1 mrg }
334 1.1 mrg else if (mpfr_can_round (y, yprec, rnd, rnd, prec))
335 1.1 mrg {
336 1.1 mrg ctrn++;
337 1.1 mrg mpfr_set (t, y, rnd);
338 1.1 mrg /* Risk of failures are known when some flags are already set
339 1.1 mrg before the function call. Do not set the erange flag, as
340 1.1 mrg it will remain set after the function call and no checks
341 1.1 mrg are performed in such a case (see the mpfr_erangeflag_p
342 1.1 mrg test below). */
343 1.1 mrg if (randlimb () & 1)
344 1.1 mrg __gmpfr_flags = MPFR_FLAGS_ALL ^ MPFR_FLAGS_ERANGE;
345 1.1 mrg #ifdef DEBUG_TGENERIC
346 1.1 mrg TGENERIC_INFO (TEST_FUNCTION, MPFR_PREC (z));
347 1.1 mrg #endif
348 1.1 mrg /* Let's increase the precision of the inputs in a random way.
349 1.1 mrg In most cases, this doesn't make any difference, but for
350 1.1 mrg the mpfr_fmod bug fixed in r6230, this triggers the bug. */
351 1.1 mrg mpfr_prec_round (x, mpfr_get_prec (x) + (randlimb () & 15),
352 1.1 mrg MPFR_RNDN);
353 1.1 mrg #if defined(TWO_ARGS)
354 1.1 mrg mpfr_prec_round (u, mpfr_get_prec (u) + (randlimb () & 15),
355 1.1 mrg MPFR_RNDN);
356 1.1 mrg inexact = TEST_FUNCTION (z, x, u, rnd);
357 1.1 mrg #elif defined(DOUBLE_ARG1)
358 1.1 mrg inexact = TEST_FUNCTION (z, d, x, rnd);
359 1.1 mrg #elif defined(DOUBLE_ARG2)
360 1.1 mrg inexact = TEST_FUNCTION (z, x, d, rnd);
361 1.1 mrg #else
362 1.1 mrg inexact = TEST_FUNCTION (z, x, rnd);
363 1.1 mrg #endif
364 1.1 mrg if (mpfr_erangeflag_p ())
365 1.1 mrg goto next_n;
366 1.1 mrg if (mpfr_nan_p (z) || mpfr_cmp (t, z) != 0)
367 1.1 mrg {
368 1.1 mrg printf ("results differ for x=");
369 1.1 mrg mpfr_out_str (stdout, 2, xprec, x, MPFR_RNDN);
370 1.1 mrg #ifdef TWO_ARGS
371 1.1 mrg printf ("\nu=");
372 1.1 mrg mpfr_out_str (stdout, 2, xprec, u, MPFR_RNDN);
373 1.1 mrg #elif defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
374 1.1 mrg printf ("\nu=");
375 1.1 mrg mpfr_out_str (stdout, 2, IEEE_DBL_MANT_DIG, u, MPFR_RNDN);
376 1.1 mrg #endif
377 1.1 mrg printf (" prec=%u rnd_mode=%s\n", (unsigned) prec,
378 1.1 mrg mpfr_print_rnd_mode (rnd));
379 1.1 mrg printf ("got ");
380 1.1 mrg mpfr_out_str (stdout, 2, prec, z, MPFR_RNDN);
381 1.1 mrg puts ("");
382 1.1 mrg printf ("expected ");
383 1.1 mrg mpfr_out_str (stdout, 2, prec, t, MPFR_RNDN);
384 1.1 mrg puts ("");
385 1.1 mrg printf ("approx ");
386 1.1 mrg mpfr_print_binary (y);
387 1.1 mrg puts ("");
388 1.1 mrg exit (1);
389 1.1 mrg }
390 1.1 mrg compare2 = mpfr_cmp (t, y);
391 1.1 mrg /* if rounding to nearest, cannot know the sign of t - f(x)
392 1.1 mrg because of composed rounding: y = o(f(x)) and t = o(y) */
393 1.1 mrg if (compare * compare2 >= 0)
394 1.1 mrg compare = compare + compare2;
395 1.1 mrg else
396 1.1 mrg compare = inexact; /* cannot determine sign(t-f(x)) */
397 1.1 mrg if (((inexact == 0) && (compare != 0)) ||
398 1.1 mrg ((inexact > 0) && (compare <= 0)) ||
399 1.1 mrg ((inexact < 0) && (compare >= 0)))
400 1.1 mrg {
401 1.1 mrg printf ("Wrong inexact flag for rnd=%s: expected %d, got %d"
402 1.1 mrg "\n", mpfr_print_rnd_mode (rnd), compare, inexact);
403 1.1 mrg printf ("x="); mpfr_print_binary (x); puts ("");
404 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
405 1.1 mrg printf ("u="); mpfr_print_binary (u); puts ("");
406 1.1 mrg #endif
407 1.1 mrg printf ("y="); mpfr_print_binary (y); puts ("");
408 1.1 mrg printf ("t="); mpfr_print_binary (t); puts ("");
409 1.1 mrg exit (1);
410 1.1 mrg }
411 1.1 mrg }
412 1.1 mrg else if (getenv ("MPFR_SUSPICIOUS_OVERFLOW") != NULL)
413 1.1 mrg {
414 1.1 mrg /* For developers only! */
415 1.1 mrg MPFR_ASSERTN (MPFR_IS_PURE_FP (y));
416 1.1 mrg mpfr_nexttoinf (y);
417 1.1 mrg if (MPFR_IS_INF (y) && MPFR_IS_LIKE_RNDZ (rnd, MPFR_IS_NEG (y))
418 1.1 mrg && !mpfr_overflow_p ())
419 1.1 mrg {
420 1.1 mrg printf ("Possible bug! |y| is the maximum finite number "
421 1.1 mrg "and has been obtained when\nrounding toward zero"
422 1.1 mrg " (%s). Thus there is a very probable overflow,\n"
423 1.1 mrg "but the overflow flag is not set!\n",
424 1.1 mrg mpfr_print_rnd_mode (rnd));
425 1.1 mrg printf ("x="); mpfr_print_binary (x); puts ("");
426 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
427 1.1 mrg printf ("u="); mpfr_print_binary (u); puts ("");
428 1.1 mrg #endif
429 1.1 mrg exit (1);
430 1.1 mrg }
431 1.1 mrg }
432 1.1 mrg
433 1.1 mrg next_n:
434 1.1 mrg /* In case the exponent range has been changed by
435 1.1 mrg tests_default_random() or for special values... */
436 1.1 mrg mpfr_set_emin (old_emin);
437 1.1 mrg mpfr_set_emax (old_emax);
438 1.1 mrg }
439 1.1 mrg }
440 1.1 mrg
441 1.1 mrg #ifndef TGENERIC_NOWARNING
442 1.1 mrg if (3 * ctrn < 2 * ctrt)
443 1.1 mrg printf ("Warning! Too few normal cases in generic tests (%lu / %lu)\n",
444 1.1 mrg ctrn, ctrt);
445 1.1 mrg #endif
446 1.1 mrg
447 1.1 mrg mpfr_clears (x, y, z, t, w, (mpfr_ptr) 0);
448 1.1 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
449 1.1 mrg mpfr_clear (u);
450 1.1 mrg #endif
451 1.1 mrg }
452 1.1 mrg
453 1.1 mrg #undef TEST_RANDOM_POS
454 1.1 mrg #undef TEST_RANDOM_POS2
455 1.1 mrg #undef TEST_RANDOM_EMIN
456 1.1 mrg #undef TEST_RANDOM_EMAX
457 1.1 mrg #undef RAND_FUNCTION
458 1.1 mrg #undef TWO_ARGS
459 1.1 mrg #undef TWO_ARGS_UI
460 1.1 mrg #undef TEST_FUNCTION
461 1.1 mrg #undef test_generic
462