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