tgeneric.c revision 1.1.1.6 1 1.1 mrg /* Generic test file for functions with one or two arguments (the second being
2 1.1.1.3 mrg either mpfr_t or double or unsigned long).
3 1.1 mrg
4 1.1.1.6 mrg Copyright 2001-2023 Free Software Foundation, Inc.
5 1.1.1.3 mrg Contributed by the AriC and Caramba 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.1.5 mrg https://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.1.3 mrg /* Define TWO_ARGS for two-argument functions like mpfr_pow.
25 1.1.1.3 mrg Define DOUBLE_ARG1 or DOUBLE_ARG2 for function with a double operand in
26 1.1.1.3 mrg first or second place like sub_d or d_sub.
27 1.1.1.3 mrg Define ULONG_ARG1 or ULONG_ARG2 for function with an unsigned long
28 1.1.1.6 mrg operand in first or second place like sub_ui or ui_sub.
29 1.1.1.6 mrg Define THREE_ARGS for three-argument functions like mpfr_atan2u. */
30 1.1.1.3 mrg
31 1.1.1.4 mrg /* TODO: Add support for type long and extreme integer values, as done
32 1.1.1.4 mrg in tgeneric_ui.c; then tgeneric_ui.c could probably disappear. */
33 1.1.1.4 mrg
34 1.1.1.6 mrg #ifdef THREE_ARGS
35 1.1.1.6 mrg /* This is like TWO_ARGS, but with an additional argument. */
36 1.1.1.6 mrg #define TWO_ARGS
37 1.1.1.3 mrg #endif
38 1.1.1.6 mrg
39 1.1.1.6 mrg #if defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
40 1.1.1.6 mrg #define DOUBLE_ARG
41 1.1.1.6 mrg #else
42 1.1.1.6 mrg #undef DOUBLE_ARG
43 1.1.1.4 mrg #endif
44 1.1.1.4 mrg
45 1.1.1.6 mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG)
46 1.1.1.6 mrg #define TWO_ARGS_ALL
47 1.1.1.6 mrg #define NSPEC 9
48 1.1.1.6 mrg #else
49 1.1.1.6 mrg #undef TWO_ARGS_ALL
50 1.1.1.6 mrg #define NSPEC 5
51 1.1.1.6 mrg #endif
52 1.1.1.6 mrg
53 1.1.1.6 mrg #if defined(ULONG_ARG1) || defined(ULONG_ARG2) || defined(THREE_ARGS)
54 1.1.1.6 mrg #define ULONG_ARG
55 1.1.1.6 mrg #else
56 1.1.1.6 mrg #undef ULONG_ARG
57 1.1.1.4 mrg #endif
58 1.1 mrg
59 1.1 mrg #ifndef TEST_RANDOM_POS
60 1.1 mrg /* For the random function: one number on two is negative. */
61 1.1 mrg #define TEST_RANDOM_POS 256
62 1.1 mrg #endif
63 1.1 mrg
64 1.1 mrg #ifndef TEST_RANDOM_POS2
65 1.1 mrg /* For the random function: one number on two is negative. */
66 1.1 mrg #define TEST_RANDOM_POS2 256
67 1.1 mrg #endif
68 1.1 mrg
69 1.1 mrg #ifndef TEST_RANDOM_EMIN
70 1.1 mrg #define TEST_RANDOM_EMIN -256
71 1.1 mrg #endif
72 1.1 mrg
73 1.1 mrg #ifndef TEST_RANDOM_EMAX
74 1.1 mrg #define TEST_RANDOM_EMAX 255
75 1.1 mrg #endif
76 1.1 mrg
77 1.1.1.3 mrg #ifndef TEST_RANDOM_ALWAYS_SCALE
78 1.1.1.3 mrg #define TEST_RANDOM_ALWAYS_SCALE 0
79 1.1.1.3 mrg #endif
80 1.1.1.3 mrg
81 1.1.1.2 mrg /* If the MPFR_SUSPICIOUS_OVERFLOW test fails but this is not a bug,
82 1.1.1.2 mrg then define TGENERIC_SO_TEST with an adequate test (possibly 0) to
83 1.1.1.2 mrg omit this particular case. */
84 1.1.1.2 mrg #ifndef TGENERIC_SO_TEST
85 1.1.1.2 mrg #define TGENERIC_SO_TEST 1
86 1.1.1.2 mrg #endif
87 1.1.1.2 mrg
88 1.1.1.6 mrg #define TGENERIC_DUMPARGS(X1,X2,U) \
89 1.1 mrg do \
90 1.1 mrg { \
91 1.1.1.6 mrg printf ("x1 = "); \
92 1.1.1.6 mrg mpfr_dump (X1); \
93 1.1.1.6 mrg if ((X2) != 0) \
94 1.1 mrg { \
95 1.1.1.6 mrg printf ("x2 = "); \
96 1.1.1.6 mrg mpfr_dump (X2); \
97 1.1 mrg } \
98 1.1.1.6 mrg if ((U) >= 0) \
99 1.1.1.6 mrg printf ("u = %lu\n", (unsigned long) U); \
100 1.1.1.6 mrg } \
101 1.1.1.6 mrg while (0)
102 1.1.1.6 mrg
103 1.1.1.6 mrg #define TGENERIC_FAIL(S,X1,X2,U) \
104 1.1.1.6 mrg do \
105 1.1.1.6 mrg { \
106 1.1.1.6 mrg printf ("tgeneric: %s\n", (S)); \
107 1.1.1.6 mrg TGENERIC_DUMPARGS (X1, X2, U); \
108 1.1.1.3 mrg printf ("yprec = %u, rnd_mode = %s, inexact = %d\nflags =", \
109 1.1.1.3 mrg (unsigned int) yprec, mpfr_print_rnd_mode (rnd), \
110 1.1.1.3 mrg compare); \
111 1.1.1.3 mrg flags_out (flags); \
112 1.1 mrg exit (1); \
113 1.1 mrg } \
114 1.1 mrg while (0)
115 1.1 mrg
116 1.1.1.6 mrg #define TGENERIC_CHECK_AUX(S,EXPR,X2,U) \
117 1.1.1.6 mrg do \
118 1.1.1.6 mrg if (!(EXPR)) \
119 1.1.1.6 mrg TGENERIC_FAIL (S " for " MAKE_STR(TEST_FUNCTION), x, X2, U); \
120 1.1.1.2 mrg while (0)
121 1.1.1.2 mrg
122 1.1 mrg #undef TGENERIC_CHECK
123 1.1.1.6 mrg #if defined(THREE_ARGS)
124 1.1.1.6 mrg #define TGENERIC_CHECK(S,EXPR) TGENERIC_CHECK_AUX (S, EXPR, x2, u)
125 1.1.1.6 mrg #elif defined(TWO_ARGS_ALL)
126 1.1.1.6 mrg #define TGENERIC_CHECK(S,EXPR) TGENERIC_CHECK_AUX (S, EXPR, x2, -1)
127 1.1.1.6 mrg #elif defined(ULONG_ARG)
128 1.1.1.6 mrg #define TGENERIC_CHECK(S,EXPR) TGENERIC_CHECK_AUX (S, EXPR, 0, u)
129 1.1 mrg #else
130 1.1.1.6 mrg #define TGENERIC_CHECK(S,EXPR) TGENERIC_CHECK_AUX (S, EXPR, 0, -1)
131 1.1 mrg #endif
132 1.1 mrg
133 1.1.1.4 mrg #ifdef MPFR_DEBUG_TGENERIC
134 1.1.1.6 mrg #define TGENERIC_IAUX(P,X1,X2,U) \
135 1.1 mrg do \
136 1.1 mrg { \
137 1.1.1.6 mrg printf ("tgeneric: testing function " MAKE_STR(TEST_FUNCTION) \
138 1.1.1.6 mrg ", %s, target prec = %u\n", \
139 1.1.1.6 mrg mpfr_print_rnd_mode (rnd), (unsigned int) (P)); \
140 1.1.1.6 mrg TGENERIC_DUMPARGS (X1, X2, U); \
141 1.1 mrg } \
142 1.1 mrg while (0)
143 1.1 mrg #undef TGENERIC_INFO
144 1.1.1.6 mrg #if defined(THREE_ARGS)
145 1.1.1.6 mrg #define TGENERIC_INFO(P) TGENERIC_IAUX (P, x, x2, u)
146 1.1.1.6 mrg #elif defined(TWO_ARGS_ALL)
147 1.1.1.6 mrg #define TGENERIC_INFO(P) TGENERIC_IAUX (P, x, x2, -1)
148 1.1.1.6 mrg #elif defined(ULONG_ARG)
149 1.1.1.6 mrg #define TGENERIC_INFO(P) TGENERIC_IAUX (P, x, 0, u)
150 1.1 mrg #else
151 1.1.1.6 mrg #define TGENERIC_INFO(P) TGENERIC_IAUX (P, x, 0, -1)
152 1.1 mrg #endif
153 1.1.1.4 mrg #endif /* MPFR_DEBUG_TGENERIC */
154 1.1 mrg
155 1.1 mrg /* For some functions (for example cos), the argument reduction is too
156 1.1 mrg expensive when using mpfr_get_emax(). Then simply define REDUCE_EMAX
157 1.1 mrg to some reasonable value before including tgeneric.c. */
158 1.1 mrg #ifndef REDUCE_EMAX
159 1.1 mrg #define REDUCE_EMAX mpfr_get_emax ()
160 1.1 mrg #endif
161 1.1 mrg
162 1.1.1.4 mrg /* same for mpfr_get_emin() */
163 1.1.1.4 mrg #ifndef REDUCE_EMIN
164 1.1.1.4 mrg #define REDUCE_EMIN mpfr_get_emin ()
165 1.1.1.4 mrg #endif
166 1.1.1.4 mrg
167 1.1 mrg static void
168 1.1.1.2 mrg test_generic (mpfr_prec_t p0, mpfr_prec_t p1, unsigned int nmax)
169 1.1 mrg {
170 1.1 mrg mpfr_prec_t prec, xprec, yprec;
171 1.1.1.4 mrg mpfr_t x, y, z, t, w, yd, yu;
172 1.1.1.6 mrg #ifdef TWO_ARGS_ALL
173 1.1.1.6 mrg mpfr_t x2;
174 1.1.1.3 mrg #endif
175 1.1.1.3 mrg #if defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
176 1.1 mrg double d;
177 1.1 mrg #endif
178 1.1.1.6 mrg #ifdef ULONG_ARG
179 1.1.1.6 mrg unsigned long u;
180 1.1.1.3 mrg #endif
181 1.1 mrg mpfr_rnd_t rnd;
182 1.1 mrg int inexact, compare, compare2;
183 1.1 mrg unsigned int n;
184 1.1 mrg unsigned long ctrt = 0, ctrn = 0;
185 1.1 mrg mpfr_exp_t old_emin, old_emax;
186 1.1 mrg
187 1.1 mrg old_emin = mpfr_get_emin ();
188 1.1 mrg old_emax = mpfr_get_emax ();
189 1.1 mrg
190 1.1.1.4 mrg mpfr_inits2 (MPFR_PREC_MIN, x, y, yd, yu, z, t, w, (mpfr_ptr) 0);
191 1.1.1.6 mrg #if defined(TWO_ARGS_ALL)
192 1.1.1.6 mrg mpfr_init2 (x2, MPFR_PREC_MIN);
193 1.1 mrg #endif
194 1.1 mrg
195 1.1.1.6 mrg /* generic tests */
196 1.1 mrg for (prec = p0; prec <= p1; prec++)
197 1.1 mrg {
198 1.1.1.4 mrg /* Number of overflow/underflow tests for each precision.
199 1.1.1.4 mrg Since MPFR uses several algorithms and there may also be
200 1.1.1.4 mrg early overflow/underflow detection, several tests may be
201 1.1.1.4 mrg needed to detect a bug. */
202 1.1.1.4 mrg int test_of = 3, test_uf = 3;
203 1.1.1.4 mrg
204 1.1 mrg mpfr_set_prec (z, prec);
205 1.1 mrg mpfr_set_prec (t, prec);
206 1.1.1.6 mrg yprec = prec + 20;
207 1.1 mrg mpfr_set_prec (y, yprec);
208 1.1.1.4 mrg mpfr_set_prec (yd, yprec);
209 1.1.1.4 mrg mpfr_set_prec (yu, yprec);
210 1.1 mrg mpfr_set_prec (w, yprec);
211 1.1 mrg
212 1.1.1.4 mrg /* Note: in precision p1, we test NSPEC special cases. */
213 1.1.1.4 mrg for (n = 0; n < (prec == p1 ? nmax + NSPEC : nmax); n++)
214 1.1 mrg {
215 1.1.1.2 mrg int infinite_input = 0;
216 1.1.1.4 mrg mpfr_flags_t flags;
217 1.1.1.3 mrg mpfr_exp_t oemin, oemax;
218 1.1.1.2 mrg
219 1.1 mrg xprec = prec;
220 1.1.1.6 mrg if (RAND_BOOL ())
221 1.1 mrg {
222 1.1.1.3 mrg /* In half cases, modify the precision of the inputs:
223 1.1.1.3 mrg If the base precision (for the result) is small,
224 1.1.1.3 mrg take a larger input precision in general, else
225 1.1.1.3 mrg take a smaller precision. */
226 1.1.1.3 mrg xprec *= (prec < 16 ? 256.0 : 1.0) *
227 1.1.1.6 mrg (double) randlimb () / (double) MPFR_LIMB_MAX;
228 1.1 mrg if (xprec < MPFR_PREC_MIN)
229 1.1 mrg xprec = MPFR_PREC_MIN;
230 1.1 mrg }
231 1.1 mrg mpfr_set_prec (x, xprec);
232 1.1.1.3 mrg #if defined(TWO_ARGS)
233 1.1.1.6 mrg mpfr_set_prec (x2, xprec);
234 1.1.1.6 mrg #elif defined(DOUBLE_ARG)
235 1.1.1.6 mrg mpfr_set_prec (x2, IEEE_DBL_MANT_DIG);
236 1.1 mrg #endif
237 1.1 mrg
238 1.1.1.6 mrg #ifdef MPFR_DEBUG_TGENERIC
239 1.1.1.6 mrg printf ("prec = %u, n = %u, xprec = %u\n",
240 1.1.1.6 mrg (unsigned int) prec, n, (unsigned int) xprec);
241 1.1.1.6 mrg #endif
242 1.1.1.6 mrg
243 1.1.1.6 mrg /* Generate random arguments, even in the special cases
244 1.1.1.6 mrg (this may not be needed, but this is simpler).
245 1.1.1.6 mrg Note that if RAND_FUNCTION is defined, this specific
246 1.1.1.6 mrg random function is used for all arguments; this is
247 1.1.1.6 mrg typically mpfr_random2, which generates a positive
248 1.1.1.6 mrg random mpfr_t with long runs of consecutive ones and
249 1.1.1.6 mrg zeros in the binary representation. */
250 1.1.1.6 mrg
251 1.1 mrg #if defined(RAND_FUNCTION)
252 1.1.1.6 mrg RAND_FUNCTION (x);
253 1.1.1.6 mrg #if defined(TWO_ARGS_ALL)
254 1.1.1.6 mrg RAND_FUNCTION (x2);
255 1.1 mrg #endif
256 1.1.1.3 mrg #else /* ! defined(RAND_FUNCTION) */
257 1.1.1.6 mrg tests_default_random (x, TEST_RANDOM_POS,
258 1.1.1.6 mrg TEST_RANDOM_EMIN, TEST_RANDOM_EMAX,
259 1.1.1.6 mrg TEST_RANDOM_ALWAYS_SCALE);
260 1.1.1.6 mrg #if defined(TWO_ARGS_ALL)
261 1.1.1.6 mrg tests_default_random (x2, TEST_RANDOM_POS2,
262 1.1.1.6 mrg TEST_RANDOM_EMIN, TEST_RANDOM_EMAX,
263 1.1.1.6 mrg TEST_RANDOM_ALWAYS_SCALE);
264 1.1 mrg #endif
265 1.1.1.3 mrg #endif /* ! defined(RAND_FUNCTION) */
266 1.1.1.6 mrg
267 1.1.1.6 mrg #if defined(ULONG_ARG)
268 1.1.1.6 mrg /* FIXME: If MPFR_LIMB_MAX < ULONG_MAX, large values will
269 1.1.1.6 mrg never be tested. */
270 1.1.1.6 mrg u = randlimb ();
271 1.1.1.6 mrg #endif
272 1.1.1.6 mrg
273 1.1.1.6 mrg if (n < NSPEC && prec == p1)
274 1.1 mrg {
275 1.1.1.4 mrg /* Special cases tested in precision p1 if n < NSPEC. They are
276 1.1 mrg useful really in the extended exponent range. */
277 1.1.1.6 mrg /* TODO: x2 is set even when it is associated with a double;
278 1.1.1.6 mrg check whether this really makes sense. */
279 1.1.1.6 mrg #if defined(DOUBLE_ARG) && defined(MPFR_ERRDIVZERO)
280 1.1.1.2 mrg goto next_n;
281 1.1.1.2 mrg #endif
282 1.1 mrg set_emin (MPFR_EMIN_MIN);
283 1.1 mrg set_emax (MPFR_EMAX_MAX);
284 1.1.1.4 mrg if (n == 0)
285 1.1 mrg {
286 1.1.1.4 mrg mpfr_set_nan (x);
287 1.1.1.4 mrg }
288 1.1.1.4 mrg else if (n <= 2)
289 1.1.1.4 mrg {
290 1.1.1.4 mrg MPFR_ASSERTN (n == 1 || n == 2);
291 1.1.1.4 mrg mpfr_set_si (x, n == 1 ? 1 : -1, MPFR_RNDN);
292 1.1.1.4 mrg mpfr_set_exp (x, REDUCE_EMIN);
293 1.1.1.6 mrg #if defined(TWO_ARGS_ALL)
294 1.1.1.6 mrg mpfr_set_si (x2, RAND_BOOL () ? -1 : 1, MPFR_RNDN);
295 1.1.1.6 mrg mpfr_set_exp (x2, REDUCE_EMIN);
296 1.1 mrg #endif
297 1.1 mrg }
298 1.1.1.4 mrg else if (n <= 4)
299 1.1 mrg {
300 1.1.1.4 mrg MPFR_ASSERTN (n == 3 || n == 4);
301 1.1.1.4 mrg mpfr_set_si (x, n == 3 ? 1 : -1, MPFR_RNDN);
302 1.1 mrg mpfr_setmax (x, REDUCE_EMAX);
303 1.1.1.6 mrg #if defined(TWO_ARGS_ALL)
304 1.1.1.6 mrg mpfr_set_si (x2, RAND_BOOL () ? -1 : 1, MPFR_RNDN);
305 1.1.1.6 mrg mpfr_setmax (x2, REDUCE_EMAX);
306 1.1.1.4 mrg #endif
307 1.1.1.4 mrg }
308 1.1.1.6 mrg #if defined(TWO_ARGS_ALL)
309 1.1.1.4 mrg else if (n <= 6)
310 1.1.1.4 mrg {
311 1.1.1.4 mrg MPFR_ASSERTN (n == 5 || n == 6);
312 1.1.1.4 mrg mpfr_set_si (x, n == 5 ? 1 : -1, MPFR_RNDN);
313 1.1.1.4 mrg mpfr_set_exp (x, REDUCE_EMIN);
314 1.1.1.6 mrg mpfr_set_si (x2, RAND_BOOL () ? -1 : 1, MPFR_RNDN);
315 1.1.1.6 mrg mpfr_setmax (x2, REDUCE_EMAX);
316 1.1 mrg }
317 1.1.1.4 mrg else
318 1.1.1.4 mrg {
319 1.1.1.4 mrg MPFR_ASSERTN (n == 7 || n == 8);
320 1.1.1.4 mrg mpfr_set_si (x, n == 7 ? 1 : -1, MPFR_RNDN);
321 1.1.1.4 mrg mpfr_setmax (x, REDUCE_EMAX);
322 1.1.1.6 mrg mpfr_set_si (x2, RAND_BOOL () ? -1 : 1, MPFR_RNDN);
323 1.1.1.6 mrg mpfr_set_exp (x2, REDUCE_EMIN);
324 1.1.1.4 mrg }
325 1.1.1.4 mrg #endif /* two arguments */
326 1.1 mrg }
327 1.1 mrg
328 1.1.1.3 mrg /* Exponent range for the test. */
329 1.1.1.3 mrg oemin = mpfr_get_emin ();
330 1.1.1.3 mrg oemax = mpfr_get_emax ();
331 1.1.1.3 mrg
332 1.1 mrg rnd = RND_RAND ();
333 1.1 mrg mpfr_clear_flags ();
334 1.1.1.4 mrg #ifdef MPFR_DEBUG_TGENERIC
335 1.1.1.6 mrg TGENERIC_INFO (MPFR_PREC (y));
336 1.1 mrg #endif
337 1.1.1.6 mrg #if defined(THREE_ARGS)
338 1.1.1.6 mrg compare = TEST_FUNCTION (y, x, x2, u, rnd);
339 1.1.1.6 mrg #elif defined(TWO_ARGS)
340 1.1.1.6 mrg compare = TEST_FUNCTION (y, x, x2, rnd);
341 1.1.1.6 mrg #elif defined(DOUBLE_ARG)
342 1.1.1.6 mrg d = mpfr_get_d (x2, rnd);
343 1.1.1.6 mrg # if defined(DOUBLE_ARG1)
344 1.1 mrg compare = TEST_FUNCTION (y, d, x, rnd);
345 1.1.1.6 mrg # elif defined(DOUBLE_ARG2)
346 1.1 mrg compare = TEST_FUNCTION (y, x, d, rnd);
347 1.1.1.6 mrg # else
348 1.1.1.6 mrg # error "cannot occur"
349 1.1.1.6 mrg # endif
350 1.1.1.2 mrg /* d can be infinite due to overflow in mpfr_get_d */
351 1.1.1.2 mrg infinite_input |= DOUBLE_ISINF (d);
352 1.1.1.4 mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
353 1.1.1.6 mrg compare = TEST_FUNCTION (y, u, rnd);
354 1.1.1.3 mrg #elif defined(ULONG_ARG1)
355 1.1.1.6 mrg compare = TEST_FUNCTION (y, u, x, rnd);
356 1.1.1.3 mrg #elif defined(ULONG_ARG2)
357 1.1.1.6 mrg compare = TEST_FUNCTION (y, x, u, rnd);
358 1.1 mrg #else
359 1.1 mrg compare = TEST_FUNCTION (y, x, rnd);
360 1.1 mrg #endif
361 1.1.1.3 mrg flags = __gmpfr_flags;
362 1.1.1.3 mrg if (mpfr_get_emin () != oemin ||
363 1.1.1.3 mrg mpfr_get_emax () != oemax)
364 1.1.1.3 mrg {
365 1.1.1.3 mrg printf ("tgeneric: the exponent range has been modified"
366 1.1.1.3 mrg " by the tested function!\n");
367 1.1.1.3 mrg exit (1);
368 1.1.1.3 mrg }
369 1.1.1.4 mrg if (rnd != MPFR_RNDF)
370 1.1.1.4 mrg TGENERIC_CHECK ("bad inexact flag",
371 1.1.1.4 mrg (compare != 0) ^ (mpfr_inexflag_p () == 0));
372 1.1 mrg ctrt++;
373 1.1 mrg
374 1.1.1.4 mrg /* If rnd = RNDF, check that we obtain the same result as
375 1.1.1.4 mrg RNDD or RNDU. */
376 1.1.1.4 mrg if (rnd == MPFR_RNDF)
377 1.1.1.4 mrg {
378 1.1.1.6 mrg #if defined(THREE_ARGS)
379 1.1.1.6 mrg TEST_FUNCTION (yd, x, x2, u, MPFR_RNDD);
380 1.1.1.6 mrg TEST_FUNCTION (yu, x, x2, u, MPFR_RNDU);
381 1.1.1.6 mrg #elif defined(TWO_ARGS)
382 1.1.1.6 mrg TEST_FUNCTION (yd, x, x2, MPFR_RNDD);
383 1.1.1.6 mrg TEST_FUNCTION (yu, x, x2, MPFR_RNDU);
384 1.1.1.4 mrg #elif defined(DOUBLE_ARG1)
385 1.1.1.6 mrg d = mpfr_get_d (x2, MPFR_RNDD);
386 1.1.1.4 mrg TEST_FUNCTION (yd, d, x, MPFR_RNDD);
387 1.1.1.6 mrg d = mpfr_get_d (x2, MPFR_RNDU);
388 1.1.1.4 mrg TEST_FUNCTION (yu, d, x, MPFR_RNDU);
389 1.1.1.4 mrg #elif defined(DOUBLE_ARG2)
390 1.1.1.6 mrg d = mpfr_get_d (x2, MPFR_RNDD);
391 1.1.1.4 mrg TEST_FUNCTION (yd, x, d, MPFR_RNDD);
392 1.1.1.6 mrg d = mpfr_get_d (x2, MPFR_RNDU);
393 1.1.1.4 mrg TEST_FUNCTION (yu, x, d, MPFR_RNDU);
394 1.1.1.4 mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
395 1.1.1.6 mrg TEST_FUNCTION (yd, u, MPFR_RNDD);
396 1.1.1.6 mrg TEST_FUNCTION (yu, u, MPFR_RNDU);
397 1.1.1.4 mrg #elif defined(ULONG_ARG1)
398 1.1.1.6 mrg TEST_FUNCTION (yd, u, x, MPFR_RNDD);
399 1.1.1.6 mrg TEST_FUNCTION (yu, u, x, MPFR_RNDU);
400 1.1.1.4 mrg #elif defined(ULONG_ARG2)
401 1.1.1.6 mrg TEST_FUNCTION (yd, x, u, MPFR_RNDD);
402 1.1.1.6 mrg TEST_FUNCTION (yu, x, u, MPFR_RNDU);
403 1.1.1.4 mrg #else
404 1.1.1.4 mrg TEST_FUNCTION (yd, x, MPFR_RNDD);
405 1.1.1.4 mrg TEST_FUNCTION (yu, x, MPFR_RNDU);
406 1.1.1.4 mrg #endif
407 1.1.1.4 mrg if (! (SAME_VAL (y, yd) || SAME_VAL (y, yu)))
408 1.1.1.4 mrg {
409 1.1.1.6 mrg printf ("tgeneric: error for" MAKE_STR(TEST_FUNCTION)
410 1.1.1.6 mrg ", RNDF; result matches neither RNDD nor RNDU\n");
411 1.1.1.6 mrg printf ("x1 = "); mpfr_dump (x);
412 1.1.1.6 mrg #ifdef TWO_ARGS_ALL
413 1.1.1.6 mrg printf ("x2 = "); mpfr_dump (x2);
414 1.1.1.6 mrg #endif
415 1.1.1.6 mrg #ifdef ULONG_ARG
416 1.1.1.6 mrg printf ("u = %lu\n", u);
417 1.1.1.6 mrg #endif
418 1.1.1.6 mrg printf ("yd (RNDD) = "); mpfr_dump (yd);
419 1.1.1.6 mrg printf ("yu (RNDU) = "); mpfr_dump (yu);
420 1.1.1.6 mrg printf ("y (RNDF) = "); mpfr_dump (y);
421 1.1.1.6 mrg exit (1);
422 1.1.1.4 mrg }
423 1.1.1.4 mrg }
424 1.1.1.4 mrg
425 1.1.1.3 mrg /* Tests in a reduced exponent range. */
426 1.1.1.3 mrg {
427 1.1.1.4 mrg mpfr_flags_t oldflags = flags;
428 1.1.1.3 mrg mpfr_exp_t e, emin, emax;
429 1.1.1.3 mrg
430 1.1.1.3 mrg /* Determine the smallest exponent range containing the
431 1.1.1.3 mrg exponents of the mpfr_t inputs (x, and u if TWO_ARGS)
432 1.1.1.3 mrg and output (y). */
433 1.1.1.3 mrg emin = MPFR_EMAX_MAX;
434 1.1.1.3 mrg emax = MPFR_EMIN_MIN;
435 1.1.1.3 mrg if (MPFR_IS_PURE_FP (x))
436 1.1.1.3 mrg {
437 1.1.1.3 mrg e = MPFR_GET_EXP (x);
438 1.1.1.3 mrg if (e < emin)
439 1.1.1.3 mrg emin = e;
440 1.1.1.3 mrg if (e > emax)
441 1.1.1.3 mrg emax = e;
442 1.1.1.3 mrg }
443 1.1 mrg #if defined(TWO_ARGS)
444 1.1.1.6 mrg if (MPFR_IS_PURE_FP (x2))
445 1.1.1.3 mrg {
446 1.1.1.6 mrg e = MPFR_GET_EXP (x2);
447 1.1.1.3 mrg if (e < emin)
448 1.1.1.3 mrg emin = e;
449 1.1.1.3 mrg if (e > emax)
450 1.1.1.3 mrg emax = e;
451 1.1.1.3 mrg }
452 1.1.1.3 mrg #endif
453 1.1.1.3 mrg if (MPFR_IS_PURE_FP (y))
454 1.1.1.3 mrg {
455 1.1.1.4 mrg e = MPFR_GET_EXP (y); /* exponent of the result */
456 1.1.1.4 mrg
457 1.1.1.4 mrg if (test_of > 0 && e - 1 >= emax) /* overflow test */
458 1.1.1.3 mrg {
459 1.1.1.4 mrg mpfr_flags_t ex_flags;
460 1.1.1.3 mrg
461 1.1.1.4 mrg /* Exponent e of the result > exponents of the inputs;
462 1.1.1.4 mrg let's set emax to e - 1, so that one should get an
463 1.1.1.4 mrg overflow. */
464 1.1.1.6 mrg set_emax (e - 1);
465 1.1.1.4 mrg #ifdef MPFR_DEBUG_TGENERIC
466 1.1.1.4 mrg printf ("tgeneric: overflow test (emax = %"
467 1.1.1.4 mrg MPFR_EXP_FSPEC "d)\n",
468 1.1.1.4 mrg (mpfr_eexp_t) __gmpfr_emax);
469 1.1.1.4 mrg #endif
470 1.1.1.3 mrg mpfr_clear_flags ();
471 1.1.1.6 mrg #if defined(THREE_ARGS)
472 1.1.1.6 mrg inexact = TEST_FUNCTION (w, x, x2, u, rnd);
473 1.1.1.6 mrg #elif defined(TWO_ARGS)
474 1.1.1.6 mrg inexact = TEST_FUNCTION (w, x, x2, rnd);
475 1.1.1.3 mrg #elif defined(DOUBLE_ARG1)
476 1.1.1.3 mrg inexact = TEST_FUNCTION (w, d, x, rnd);
477 1.1.1.3 mrg #elif defined(DOUBLE_ARG2)
478 1.1.1.3 mrg inexact = TEST_FUNCTION (w, x, d, rnd);
479 1.1.1.4 mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
480 1.1.1.6 mrg inexact = TEST_FUNCTION (w, u, rnd);
481 1.1.1.3 mrg #elif defined(ULONG_ARG1)
482 1.1.1.6 mrg inexact = TEST_FUNCTION (w, u, x, rnd);
483 1.1.1.3 mrg #elif defined(ULONG_ARG2)
484 1.1.1.6 mrg inexact = TEST_FUNCTION (w, x, u, rnd);
485 1.1.1.3 mrg #else
486 1.1.1.3 mrg inexact = TEST_FUNCTION (w, x, rnd);
487 1.1.1.3 mrg #endif
488 1.1.1.3 mrg flags = __gmpfr_flags;
489 1.1.1.6 mrg set_emax (oemax);
490 1.1.1.3 mrg ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT;
491 1.1.1.4 mrg /* For RNDF, this test makes no sense, since RNDF
492 1.1.1.4 mrg might return either the maximal floating-point
493 1.1.1.4 mrg value or infinity, and the flags might differ in
494 1.1.1.4 mrg those two cases. */
495 1.1.1.4 mrg if (flags != ex_flags && rnd != MPFR_RNDF)
496 1.1.1.3 mrg {
497 1.1.1.3 mrg printf ("tgeneric: error for " MAKE_STR(TEST_FUNCTION)
498 1.1.1.3 mrg ", reduced exponent range [%"
499 1.1.1.3 mrg MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC
500 1.1.1.3 mrg "d] (overflow test) on:\n",
501 1.1.1.3 mrg (mpfr_eexp_t) oemin, (mpfr_eexp_t) e - 1);
502 1.1.1.6 mrg printf ("x1 = "); mpfr_dump (x);
503 1.1.1.6 mrg #ifdef TWO_ARGS_ALL
504 1.1.1.6 mrg printf ("x2 = "); mpfr_dump (x2);
505 1.1.1.6 mrg #endif
506 1.1.1.6 mrg #ifdef ULONG_ARG
507 1.1.1.6 mrg printf ("u = %lu\n", u);
508 1.1.1.3 mrg #endif
509 1.1.1.3 mrg printf ("yprec = %u, rnd_mode = %s\n",
510 1.1.1.3 mrg (unsigned int) yprec,
511 1.1.1.3 mrg mpfr_print_rnd_mode (rnd));
512 1.1.1.3 mrg printf ("Expected flags =");
513 1.1.1.3 mrg flags_out (ex_flags);
514 1.1.1.3 mrg printf (" got flags =");
515 1.1.1.3 mrg flags_out (flags);
516 1.1.1.3 mrg printf ("inex = %d, w = ", inexact);
517 1.1.1.3 mrg mpfr_dump (w);
518 1.1.1.3 mrg exit (1);
519 1.1.1.3 mrg }
520 1.1.1.4 mrg test_of--;
521 1.1.1.3 mrg }
522 1.1.1.4 mrg
523 1.1.1.4 mrg if (test_uf > 0 && e + 1 <= emin) /* underflow test */
524 1.1.1.3 mrg {
525 1.1.1.4 mrg mpfr_flags_t ex_flags;
526 1.1.1.3 mrg
527 1.1.1.4 mrg /* Exponent e of the result < exponents of the inputs;
528 1.1.1.4 mrg let's set emin to e + 1, so that one should get an
529 1.1.1.4 mrg underflow. */
530 1.1.1.6 mrg set_emin (e + 1);
531 1.1.1.4 mrg #ifdef MPFR_DEBUG_TGENERIC
532 1.1.1.4 mrg printf ("tgeneric: underflow test (emin = %"
533 1.1.1.4 mrg MPFR_EXP_FSPEC "d)\n",
534 1.1.1.4 mrg (mpfr_eexp_t) __gmpfr_emin);
535 1.1.1.4 mrg #endif
536 1.1.1.3 mrg mpfr_clear_flags ();
537 1.1.1.6 mrg #if defined(THREE_ARGS)
538 1.1.1.6 mrg inexact = TEST_FUNCTION (w, x, x2, u, rnd);
539 1.1.1.6 mrg #elif defined(TWO_ARGS)
540 1.1.1.6 mrg inexact = TEST_FUNCTION (w, x, x2, rnd);
541 1.1.1.3 mrg #elif defined(DOUBLE_ARG1)
542 1.1.1.3 mrg inexact = TEST_FUNCTION (w, d, x, rnd);
543 1.1.1.3 mrg #elif defined(DOUBLE_ARG2)
544 1.1.1.3 mrg inexact = TEST_FUNCTION (w, x, d, rnd);
545 1.1.1.4 mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
546 1.1.1.6 mrg inexact = TEST_FUNCTION (w, u, rnd);
547 1.1.1.3 mrg #elif defined(ULONG_ARG1)
548 1.1.1.6 mrg inexact = TEST_FUNCTION (w, u, x, rnd);
549 1.1.1.3 mrg #elif defined(ULONG_ARG2)
550 1.1.1.6 mrg inexact = TEST_FUNCTION (w, x, u, rnd);
551 1.1.1.3 mrg #else
552 1.1.1.3 mrg inexact = TEST_FUNCTION (w, x, rnd);
553 1.1 mrg #endif
554 1.1.1.3 mrg flags = __gmpfr_flags;
555 1.1.1.6 mrg set_emin (oemin);
556 1.1.1.3 mrg ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT;
557 1.1.1.4 mrg /* For RNDF, this test makes no sense, since RNDF
558 1.1.1.4 mrg might return either the maximal floating-point
559 1.1.1.4 mrg value or infinity, and the flags might differ in
560 1.1.1.4 mrg those two cases. */
561 1.1.1.4 mrg if (flags != ex_flags && rnd != MPFR_RNDF)
562 1.1.1.3 mrg {
563 1.1.1.3 mrg printf ("tgeneric: error for " MAKE_STR(TEST_FUNCTION)
564 1.1.1.3 mrg ", reduced exponent range [%"
565 1.1.1.3 mrg MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC
566 1.1.1.3 mrg "d] (underflow test) on:\n",
567 1.1.1.3 mrg (mpfr_eexp_t) e + 1, (mpfr_eexp_t) oemax);
568 1.1.1.6 mrg printf ("x1 = "); mpfr_dump (x);
569 1.1.1.6 mrg #ifdef TWO_ARGS_ALL
570 1.1.1.6 mrg printf ("x2 = "); mpfr_dump (x2);
571 1.1.1.6 mrg #endif
572 1.1.1.6 mrg #ifdef ULONG_ARG
573 1.1.1.6 mrg printf ("u = %lu\n", u);
574 1.1.1.3 mrg #endif
575 1.1.1.3 mrg printf ("yprec = %u, rnd_mode = %s\n",
576 1.1.1.3 mrg (unsigned int) yprec,
577 1.1.1.3 mrg mpfr_print_rnd_mode (rnd));
578 1.1.1.3 mrg printf ("Expected flags =");
579 1.1.1.3 mrg flags_out (ex_flags);
580 1.1.1.3 mrg printf (" got flags =");
581 1.1.1.3 mrg flags_out (flags);
582 1.1.1.3 mrg printf ("inex = %d, w = ", inexact);
583 1.1.1.3 mrg mpfr_dump (w);
584 1.1.1.3 mrg exit (1);
585 1.1.1.3 mrg }
586 1.1.1.4 mrg test_uf--;
587 1.1.1.3 mrg }
588 1.1.1.4 mrg
589 1.1.1.3 mrg if (e < emin)
590 1.1.1.3 mrg emin = e;
591 1.1.1.3 mrg if (e > emax)
592 1.1.1.3 mrg emax = e;
593 1.1.1.4 mrg } /* MPFR_IS_PURE_FP (y) */
594 1.1.1.4 mrg
595 1.1.1.3 mrg if (emin > emax)
596 1.1.1.3 mrg emin = emax; /* case where all values are singular */
597 1.1.1.4 mrg
598 1.1.1.3 mrg /* Consistency test in a reduced exponent range. Doing it
599 1.1.1.3 mrg for the first 10 samples and for prec == p1 (which has
600 1.1.1.3 mrg some special cases) should be sufficient. */
601 1.1.1.3 mrg if (ctrt <= 10 || prec == p1)
602 1.1.1.3 mrg {
603 1.1.1.6 mrg set_emin (emin);
604 1.1.1.6 mrg set_emax (emax);
605 1.1.1.4 mrg #ifdef MPFR_DEBUG_TGENERIC
606 1.1.1.3 mrg /* Useful information in case of assertion failure. */
607 1.1.1.3 mrg printf ("tgeneric: reduced exponent range [%"
608 1.1.1.3 mrg MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC "d]\n",
609 1.1.1.3 mrg (mpfr_eexp_t) emin, (mpfr_eexp_t) emax);
610 1.1.1.2 mrg #endif
611 1.1.1.3 mrg mpfr_clear_flags ();
612 1.1.1.6 mrg #if defined(THREE_ARGS)
613 1.1.1.6 mrg inexact = TEST_FUNCTION (w, x, x2, u, rnd);
614 1.1.1.6 mrg #elif defined(TWO_ARGS)
615 1.1.1.6 mrg inexact = TEST_FUNCTION (w, x, x2, rnd);
616 1.1 mrg #elif defined(DOUBLE_ARG1)
617 1.1.1.3 mrg inexact = TEST_FUNCTION (w, d, x, rnd);
618 1.1 mrg #elif defined(DOUBLE_ARG2)
619 1.1.1.3 mrg inexact = TEST_FUNCTION (w, x, d, rnd);
620 1.1.1.4 mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
621 1.1.1.6 mrg inexact = TEST_FUNCTION (w, u, rnd);
622 1.1.1.3 mrg #elif defined(ULONG_ARG1)
623 1.1.1.6 mrg inexact = TEST_FUNCTION (w, u, x, rnd);
624 1.1.1.3 mrg #elif defined(ULONG_ARG2)
625 1.1.1.6 mrg inexact = TEST_FUNCTION (w, x, u, rnd);
626 1.1 mrg #else
627 1.1.1.3 mrg inexact = TEST_FUNCTION (w, x, rnd);
628 1.1 mrg #endif
629 1.1.1.3 mrg flags = __gmpfr_flags;
630 1.1.1.6 mrg set_emin (oemin);
631 1.1.1.6 mrg set_emax (oemax);
632 1.1.1.4 mrg /* That test makes no sense for RNDF. */
633 1.1.1.4 mrg if (rnd != MPFR_RNDF && ! (SAME_VAL (w, y) &&
634 1.1.1.3 mrg SAME_SIGN (inexact, compare) &&
635 1.1.1.3 mrg flags == oldflags))
636 1.1.1.3 mrg {
637 1.1.1.3 mrg printf ("tgeneric: error for " MAKE_STR(TEST_FUNCTION)
638 1.1.1.3 mrg ", reduced exponent range [%"
639 1.1.1.3 mrg MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC "d] on:\n",
640 1.1.1.3 mrg (mpfr_eexp_t) emin, (mpfr_eexp_t) emax);
641 1.1.1.6 mrg printf ("x1 = "); mpfr_dump (x);
642 1.1.1.6 mrg #ifdef TWO_ARGS_ALL
643 1.1.1.6 mrg printf ("x2 = "); mpfr_dump (x2);
644 1.1.1.6 mrg #endif
645 1.1.1.6 mrg #ifdef ULONG_ARG
646 1.1.1.6 mrg printf ("u = %lu\n", u);
647 1.1.1.3 mrg #endif
648 1.1.1.3 mrg printf ("yprec = %u, rnd_mode = %s\n",
649 1.1.1.3 mrg (unsigned int) yprec, mpfr_print_rnd_mode (rnd));
650 1.1.1.3 mrg printf ("Expected:\n y = ");
651 1.1.1.3 mrg mpfr_dump (y);
652 1.1.1.3 mrg printf (" inex = %d, flags =", compare);
653 1.1.1.3 mrg flags_out (oldflags);
654 1.1.1.3 mrg printf ("Got:\n w = ");
655 1.1.1.3 mrg mpfr_dump (w);
656 1.1.1.3 mrg printf (" inex = %d, flags =", inexact);
657 1.1.1.3 mrg flags_out (flags);
658 1.1.1.3 mrg exit (1);
659 1.1.1.3 mrg }
660 1.1.1.3 mrg }
661 1.1.1.4 mrg
662 1.1.1.3 mrg __gmpfr_flags = oldflags; /* restore the flags */
663 1.1.1.4 mrg } /* tests in a reduced exponent range */
664 1.1.1.3 mrg
665 1.1 mrg if (MPFR_IS_SINGULAR (y))
666 1.1 mrg {
667 1.1 mrg if (MPFR_IS_NAN (y) || mpfr_nanflag_p ())
668 1.1.1.3 mrg TGENERIC_CHECK ("bad NaN flag",
669 1.1 mrg MPFR_IS_NAN (y) && mpfr_nanflag_p ());
670 1.1 mrg else if (MPFR_IS_INF (y))
671 1.1.1.2 mrg {
672 1.1.1.3 mrg TGENERIC_CHECK ("bad overflow flag",
673 1.1.1.2 mrg (compare != 0) ^ (mpfr_overflow_p () == 0));
674 1.1.1.3 mrg TGENERIC_CHECK ("bad divide-by-zero flag",
675 1.1.1.2 mrg (compare == 0 && !infinite_input) ^
676 1.1.1.2 mrg (mpfr_divby0_p () == 0));
677 1.1.1.2 mrg }
678 1.1 mrg else if (MPFR_IS_ZERO (y))
679 1.1.1.3 mrg TGENERIC_CHECK ("bad underflow flag",
680 1.1 mrg (compare != 0) ^ (mpfr_underflow_p () == 0));
681 1.1 mrg }
682 1.1.1.2 mrg else if (mpfr_divby0_p ())
683 1.1.1.2 mrg {
684 1.1.1.3 mrg TGENERIC_CHECK ("both overflow and divide-by-zero",
685 1.1.1.2 mrg ! mpfr_overflow_p ());
686 1.1.1.3 mrg TGENERIC_CHECK ("both underflow and divide-by-zero",
687 1.1.1.2 mrg ! mpfr_underflow_p ());
688 1.1.1.3 mrg TGENERIC_CHECK ("bad compare value (divide-by-zero)",
689 1.1.1.2 mrg compare == 0);
690 1.1.1.2 mrg }
691 1.1 mrg else if (mpfr_overflow_p ())
692 1.1 mrg {
693 1.1.1.3 mrg TGENERIC_CHECK ("both underflow and overflow",
694 1.1.1.2 mrg ! mpfr_underflow_p ());
695 1.1.1.3 mrg TGENERIC_CHECK ("bad compare value (overflow)", compare != 0);
696 1.1 mrg mpfr_nexttoinf (y);
697 1.1.1.3 mrg TGENERIC_CHECK ("should have been max MPFR number (overflow)",
698 1.1 mrg MPFR_IS_INF (y));
699 1.1 mrg }
700 1.1 mrg else if (mpfr_underflow_p ())
701 1.1 mrg {
702 1.1.1.3 mrg TGENERIC_CHECK ("bad compare value (underflow)", compare != 0);
703 1.1 mrg mpfr_nexttozero (y);
704 1.1.1.3 mrg TGENERIC_CHECK ("should have been min MPFR number (underflow)",
705 1.1 mrg MPFR_IS_ZERO (y));
706 1.1 mrg }
707 1.1.1.4 mrg else if (compare == 0 || rnd == MPFR_RNDF ||
708 1.1.1.4 mrg mpfr_can_round (y, yprec, rnd, rnd, prec))
709 1.1 mrg {
710 1.1 mrg ctrn++;
711 1.1 mrg mpfr_set (t, y, rnd);
712 1.1 mrg /* Risk of failures are known when some flags are already set
713 1.1 mrg before the function call. Do not set the erange flag, as
714 1.1 mrg it will remain set after the function call and no checks
715 1.1 mrg are performed in such a case (see the mpfr_erangeflag_p
716 1.1 mrg test below). */
717 1.1.1.6 mrg if (RAND_BOOL ())
718 1.1 mrg __gmpfr_flags = MPFR_FLAGS_ALL ^ MPFR_FLAGS_ERANGE;
719 1.1.1.4 mrg #ifdef MPFR_DEBUG_TGENERIC
720 1.1.1.6 mrg TGENERIC_INFO (MPFR_PREC (z));
721 1.1 mrg #endif
722 1.1 mrg /* Let's increase the precision of the inputs in a random way.
723 1.1 mrg In most cases, this doesn't make any difference, but for
724 1.1 mrg the mpfr_fmod bug fixed in r6230, this triggers the bug. */
725 1.1 mrg mpfr_prec_round (x, mpfr_get_prec (x) + (randlimb () & 15),
726 1.1 mrg MPFR_RNDN);
727 1.1 mrg #if defined(TWO_ARGS)
728 1.1.1.6 mrg mpfr_prec_round (x2, mpfr_get_prec (x2) + (randlimb () & 15),
729 1.1 mrg MPFR_RNDN);
730 1.1.1.6 mrg #if defined(THREE_ARGS)
731 1.1.1.6 mrg inexact = TEST_FUNCTION (z, x, x2, u, rnd);
732 1.1.1.6 mrg #else
733 1.1.1.6 mrg inexact = TEST_FUNCTION (z, x, x2, rnd);
734 1.1.1.6 mrg #endif
735 1.1 mrg #elif defined(DOUBLE_ARG1)
736 1.1 mrg inexact = TEST_FUNCTION (z, d, x, rnd);
737 1.1 mrg #elif defined(DOUBLE_ARG2)
738 1.1 mrg inexact = TEST_FUNCTION (z, x, d, rnd);
739 1.1.1.4 mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
740 1.1.1.6 mrg inexact = TEST_FUNCTION (z, u, rnd);
741 1.1.1.3 mrg #elif defined(ULONG_ARG1)
742 1.1.1.6 mrg inexact = TEST_FUNCTION (z, u, x, rnd);
743 1.1.1.3 mrg #elif defined(ULONG_ARG2)
744 1.1.1.6 mrg inexact = TEST_FUNCTION (z, x, u, rnd);
745 1.1 mrg #else
746 1.1 mrg inexact = TEST_FUNCTION (z, x, rnd);
747 1.1 mrg #endif
748 1.1 mrg if (mpfr_erangeflag_p ())
749 1.1 mrg goto next_n;
750 1.1.1.4 mrg if (! mpfr_equal_p (t, z) && rnd != MPFR_RNDF)
751 1.1 mrg {
752 1.1.1.3 mrg printf ("tgeneric: results differ for "
753 1.1.1.6 mrg MAKE_STR(TEST_FUNCTION) " on\n");
754 1.1.1.6 mrg printf ("x1[%u] = ", (unsigned int) mpfr_get_prec (x));
755 1.1.1.3 mrg mpfr_dump (x);
756 1.1.1.6 mrg #ifdef TWO_ARGS_ALL
757 1.1.1.6 mrg printf ("x2[%u] = ", (unsigned int) mpfr_get_prec (x2));
758 1.1.1.6 mrg mpfr_dump (x2);
759 1.1.1.6 mrg #endif
760 1.1.1.6 mrg #ifdef ULONG_ARG
761 1.1.1.6 mrg printf ("u = %lu\n", u);
762 1.1 mrg #endif
763 1.1.1.6 mrg printf ("prec = %u, rnd_mode = %s\n",
764 1.1.1.3 mrg (unsigned int) prec, mpfr_print_rnd_mode (rnd));
765 1.1.1.3 mrg printf ("Got ");
766 1.1.1.3 mrg mpfr_dump (z);
767 1.1.1.3 mrg printf ("Expected ");
768 1.1.1.3 mrg mpfr_dump (t);
769 1.1.1.3 mrg printf ("Approx ");
770 1.1.1.3 mrg mpfr_dump (y);
771 1.1 mrg exit (1);
772 1.1 mrg }
773 1.1 mrg compare2 = mpfr_cmp (t, y);
774 1.1 mrg /* if rounding to nearest, cannot know the sign of t - f(x)
775 1.1 mrg because of composed rounding: y = o(f(x)) and t = o(y) */
776 1.1 mrg if (compare * compare2 >= 0)
777 1.1 mrg compare = compare + compare2;
778 1.1 mrg else
779 1.1 mrg compare = inexact; /* cannot determine sign(t-f(x)) */
780 1.1.1.4 mrg if (! SAME_SIGN (inexact, compare) && rnd != MPFR_RNDF)
781 1.1 mrg {
782 1.1 mrg printf ("Wrong inexact flag for rnd=%s: expected %d, got %d"
783 1.1 mrg "\n", mpfr_print_rnd_mode (rnd), compare, inexact);
784 1.1.1.6 mrg printf ("x1[%u] = ", (unsigned int) mpfr_get_prec (x));
785 1.1.1.3 mrg mpfr_dump (x);
786 1.1.1.6 mrg #ifdef TWO_ARGS_ALL
787 1.1.1.6 mrg printf ("x2[%u] = ", (unsigned int) mpfr_get_prec (x2));
788 1.1.1.6 mrg mpfr_dump (x2);
789 1.1.1.6 mrg #endif
790 1.1.1.6 mrg #ifdef ULONG_ARG
791 1.1.1.6 mrg printf ("u = %lu\n", u);
792 1.1 mrg #endif
793 1.1.1.3 mrg printf ("y = ");
794 1.1.1.3 mrg mpfr_dump (y);
795 1.1.1.3 mrg printf ("t = ");
796 1.1.1.3 mrg mpfr_dump (t);
797 1.1 mrg exit (1);
798 1.1 mrg }
799 1.1 mrg }
800 1.1 mrg else if (getenv ("MPFR_SUSPICIOUS_OVERFLOW") != NULL)
801 1.1 mrg {
802 1.1 mrg /* For developers only! */
803 1.1 mrg MPFR_ASSERTN (MPFR_IS_PURE_FP (y));
804 1.1 mrg mpfr_nexttoinf (y);
805 1.1 mrg if (MPFR_IS_INF (y) && MPFR_IS_LIKE_RNDZ (rnd, MPFR_IS_NEG (y))
806 1.1.1.2 mrg && !mpfr_overflow_p () && TGENERIC_SO_TEST)
807 1.1 mrg {
808 1.1 mrg printf ("Possible bug! |y| is the maximum finite number "
809 1.1.1.5 mrg "(with yprec = %u) and has\nbeen obtained when "
810 1.1.1.5 mrg "rounding toward zero (%s). Thus there is a very\n"
811 1.1.1.5 mrg "probable overflow, but the overflow flag is not "
812 1.1.1.5 mrg "set!\n",
813 1.1.1.5 mrg (unsigned int) yprec, mpfr_print_rnd_mode (rnd));
814 1.1.1.6 mrg printf ("x1[%u] = ", (unsigned int) mpfr_get_prec (x));
815 1.1.1.3 mrg mpfr_dump (x);
816 1.1.1.6 mrg #ifdef TWO_ARGS_ALL
817 1.1.1.6 mrg printf ("x2[%u] = ", (unsigned int) mpfr_get_prec (x2));
818 1.1.1.6 mrg mpfr_dump (x2);
819 1.1.1.6 mrg #endif
820 1.1.1.6 mrg #ifdef ULONG_ARG
821 1.1.1.6 mrg printf ("u = %lu\n", u);
822 1.1 mrg #endif
823 1.1 mrg exit (1);
824 1.1 mrg }
825 1.1 mrg }
826 1.1 mrg
827 1.1 mrg next_n:
828 1.1 mrg /* In case the exponent range has been changed by
829 1.1 mrg tests_default_random() or for special values... */
830 1.1.1.6 mrg set_emin (old_emin);
831 1.1.1.6 mrg set_emax (old_emax);
832 1.1 mrg }
833 1.1 mrg }
834 1.1 mrg
835 1.1.1.6 mrg if (getenv ("MPFR_TGENERIC_STAT") != NULL)
836 1.1.1.6 mrg printf ("tgeneric: normal cases / total = %lu / %lu\n", ctrn, ctrt);
837 1.1.1.6 mrg
838 1.1 mrg #ifndef TGENERIC_NOWARNING
839 1.1 mrg if (3 * ctrn < 2 * ctrt)
840 1.1 mrg printf ("Warning! Too few normal cases in generic tests (%lu / %lu)\n",
841 1.1 mrg ctrn, ctrt);
842 1.1 mrg #endif
843 1.1 mrg
844 1.1.1.4 mrg mpfr_clears (x, y, yd, yu, z, t, w, (mpfr_ptr) 0);
845 1.1.1.6 mrg #ifdef TWO_ARGS_ALL
846 1.1.1.6 mrg mpfr_clear (x2);
847 1.1 mrg #endif
848 1.1 mrg }
849 1.1 mrg
850 1.1 mrg #undef TEST_RANDOM_POS
851 1.1 mrg #undef TEST_RANDOM_POS2
852 1.1 mrg #undef TEST_RANDOM_EMIN
853 1.1 mrg #undef TEST_RANDOM_EMAX
854 1.1.1.3 mrg #undef TEST_RANDOM_ALWAYS_SCALE
855 1.1 mrg #undef RAND_FUNCTION
856 1.1.1.6 mrg #undef THREE_ARGS
857 1.1 mrg #undef TWO_ARGS
858 1.1.1.3 mrg #undef TWO_ARGS_ALL
859 1.1.1.6 mrg #undef ULONG_ARG
860 1.1.1.6 mrg #undef DOUBLE_ARG
861 1.1.1.3 mrg #undef DOUBLE_ARG1
862 1.1.1.3 mrg #undef DOUBLE_ARG2
863 1.1.1.3 mrg #undef ULONG_ARG1
864 1.1.1.3 mrg #undef ULONG_ARG2
865 1.1 mrg #undef TEST_FUNCTION
866 1.1 mrg #undef test_generic
867 1.1.1.4 mrg #undef NSPEC
868