1 1.1.1.4 mrg /* Test file for mpfr_set_si, mpfr_set_ui, mpfr_get_si and mpfr_get_ui. 2 1.1 mrg 3 1.1.1.6 mrg Copyright 1999, 2001-2023 Free Software Foundation, Inc. 4 1.1.1.3 mrg Contributed by the AriC and Caramba 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.1.5 mrg https://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 "mpfr-test.h" 24 1.1 mrg 25 1.1.1.4 mrg #define PRINT_ERROR(str) \ 26 1.1.1.4 mrg do { printf ("Error for %s\n", str); exit (1); } while (0) 27 1.1 mrg 28 1.1 mrg static void 29 1.1 mrg test_2exp (void) 30 1.1 mrg { 31 1.1 mrg mpfr_t x; 32 1.1 mrg int res; 33 1.1 mrg 34 1.1 mrg mpfr_init2 (x, 32); 35 1.1 mrg 36 1.1 mrg mpfr_set_ui_2exp (x, 1, 0, MPFR_RNDN); 37 1.1.1.4 mrg if (mpfr_cmp_ui (x, 1) != 0) 38 1.1.1.4 mrg PRINT_ERROR ("(1U,0)"); 39 1.1 mrg 40 1.1 mrg mpfr_set_ui_2exp (x, 1024, -10, MPFR_RNDN); 41 1.1.1.4 mrg if (mpfr_cmp_ui(x, 1) != 0) 42 1.1.1.4 mrg PRINT_ERROR ("(1024U,-10)"); 43 1.1 mrg 44 1.1 mrg mpfr_set_ui_2exp (x, 1024, 10, MPFR_RNDN); 45 1.1.1.4 mrg if (mpfr_cmp_ui (x, 1024 * 1024) != 0) 46 1.1.1.4 mrg PRINT_ERROR ("(1024U,+10)"); 47 1.1 mrg 48 1.1 mrg mpfr_set_si_2exp (x, -1024L * 1024L, -10, MPFR_RNDN); 49 1.1.1.4 mrg if (mpfr_cmp_si (x, -1024) != 0) 50 1.1.1.4 mrg PRINT_ERROR ("(1M,-10)"); 51 1.1 mrg 52 1.1 mrg mpfr_set_ui_2exp (x, 0x92345678, 16, MPFR_RNDN); 53 1.1.1.4 mrg if (mpfr_cmp_str (x, "92345678@4", 16, MPFR_RNDN) != 0) 54 1.1.1.4 mrg PRINT_ERROR ("(x92345678U,+16)"); 55 1.1 mrg 56 1.1 mrg mpfr_set_si_2exp (x, -0x1ABCDEF0, -256, MPFR_RNDN); 57 1.1.1.4 mrg if (mpfr_cmp_str (x, "-1ABCDEF0@-64", 16, MPFR_RNDN) != 0) 58 1.1.1.4 mrg PRINT_ERROR ("(-x1ABCDEF0,-256)"); 59 1.1 mrg 60 1.1 mrg mpfr_set_prec (x, 2); 61 1.1 mrg res = mpfr_set_si_2exp (x, 7, 10, MPFR_RNDU); 62 1.1.1.4 mrg if (mpfr_cmp_ui (x, 1<<13) != 0 || res <= 0) 63 1.1.1.4 mrg PRINT_ERROR ("Prec 2 + si_2exp"); 64 1.1 mrg 65 1.1 mrg res = mpfr_set_ui_2exp (x, 7, 10, MPFR_RNDU); 66 1.1.1.4 mrg if (mpfr_cmp_ui (x, 1<<13) != 0 || res <= 0) 67 1.1.1.4 mrg PRINT_ERROR ("Prec 2 + ui_2exp"); 68 1.1 mrg 69 1.1 mrg mpfr_clear_flags (); 70 1.1 mrg mpfr_set_ui_2exp (x, 17, MPFR_EMAX_MAX, MPFR_RNDN); 71 1.1 mrg if (!mpfr_inf_p (x) || MPFR_IS_NEG (x)) 72 1.1.1.4 mrg PRINT_ERROR ("mpfr_set_ui_2exp and overflow (bad result)"); 73 1.1 mrg if (!mpfr_overflow_p ()) 74 1.1.1.4 mrg PRINT_ERROR ("mpfr_set_ui_2exp and overflow (overflow flag not set)"); 75 1.1 mrg 76 1.1 mrg mpfr_clear_flags (); 77 1.1 mrg mpfr_set_si_2exp (x, 17, MPFR_EMAX_MAX, MPFR_RNDN); 78 1.1 mrg if (!mpfr_inf_p (x) || MPFR_IS_NEG (x)) 79 1.1.1.4 mrg PRINT_ERROR ("mpfr_set_si_2exp (pos) and overflow (bad result)"); 80 1.1 mrg if (!mpfr_overflow_p ()) 81 1.1.1.4 mrg PRINT_ERROR ("mpfr_set_si_2exp (pos) and overflow (overflow flag not set)"); 82 1.1 mrg 83 1.1 mrg mpfr_clear_flags (); 84 1.1 mrg mpfr_set_si_2exp (x, -17, MPFR_EMAX_MAX, MPFR_RNDN); 85 1.1 mrg if (!mpfr_inf_p (x) || MPFR_IS_POS (x)) 86 1.1.1.4 mrg PRINT_ERROR ("mpfr_set_si_2exp (neg) and overflow (bad result)"); 87 1.1 mrg if (!mpfr_overflow_p ()) 88 1.1.1.4 mrg PRINT_ERROR ("mpfr_set_si_2exp (neg) and overflow (overflow flag not set)"); 89 1.1 mrg 90 1.1 mrg mpfr_clear (x); 91 1.1 mrg } 92 1.1 mrg 93 1.1.1.5 mrg #define REXP 1024 94 1.1.1.5 mrg 95 1.1.1.5 mrg static void 96 1.1.1.5 mrg test_2exp_extreme_aux (void) 97 1.1.1.5 mrg { 98 1.1.1.5 mrg mpfr_t x1, x2, y; 99 1.1.1.5 mrg mpfr_exp_t e, ep[1 + 8 * 5], eb[] = 100 1.1.1.5 mrg { MPFR_EMIN_MIN, -REXP, REXP, MPFR_EMAX_MAX, MPFR_EXP_MAX }; 101 1.1.1.5 mrg mpfr_flags_t flags1, flags2; 102 1.1.1.5 mrg int i, j, rnd, inex1, inex2; 103 1.1.1.5 mrg char s; 104 1.1.1.5 mrg 105 1.1.1.5 mrg ep[0] = MPFR_EXP_MIN; 106 1.1.1.5 mrg for (i = 0; i < numberof(eb); i++) 107 1.1.1.5 mrg for (j = 0; j < 8; j++) 108 1.1.1.5 mrg ep[1 + 8 * i + j] = eb[i] - j; 109 1.1.1.5 mrg 110 1.1.1.5 mrg mpfr_inits2 (3, x1, x2, (mpfr_ptr) 0); 111 1.1.1.5 mrg mpfr_init2 (y, 32); 112 1.1.1.5 mrg 113 1.1.1.5 mrg for (i = 0; i < numberof(ep); i++) 114 1.1.1.5 mrg for (j = -31; j <= 31; j++) 115 1.1.1.5 mrg RND_LOOP_NO_RNDF (rnd) 116 1.1.1.5 mrg { 117 1.1.1.5 mrg int sign = j < 0 ? -1 : 1; 118 1.1.1.5 mrg 119 1.1.1.5 mrg /* Compute the expected value, inex and flags */ 120 1.1.1.5 mrg inex1 = mpfr_set_si (y, j, MPFR_RNDN); 121 1.1.1.5 mrg MPFR_ASSERTN (inex1 == 0); 122 1.1.1.5 mrg inex1 = mpfr_set (x1, y, (mpfr_rnd_t) rnd); 123 1.1.1.5 mrg /* x1 is the rounded value and inex1 the ternary value, 124 1.1.1.5 mrg assuming that the exponent argument is 0 (this is the 125 1.1.1.5 mrg rounded significand of the final result, assuming an 126 1.1.1.5 mrg unbounded exponent range). The multiplication by a 127 1.1.1.5 mrg power of 2 is exact, unless underflow/overflow occurs. 128 1.1.1.5 mrg The tests on the exponent below avoid integer overflows 129 1.1.1.5 mrg (ep[i] may take extreme values). */ 130 1.1.1.5 mrg mpfr_clear_flags (); 131 1.1.1.6 mrg if (j == 0) 132 1.1.1.6 mrg goto zero; 133 1.1.1.6 mrg e = MPFR_GET_EXP (x1); 134 1.1.1.6 mrg if (ep[i] < __gmpfr_emin - e) /* underflow */ 135 1.1.1.5 mrg { 136 1.1.1.5 mrg mpfr_rnd_t r = 137 1.1.1.5 mrg (rnd == MPFR_RNDN && 138 1.1.1.6 mrg (ep[i] < __gmpfr_emin - MPFR_GET_EXP (y) - 1 || 139 1.1.1.5 mrg IS_POW2 (sign * j))) ? 140 1.1.1.5 mrg MPFR_RNDZ : (mpfr_rnd_t) rnd; 141 1.1.1.5 mrg inex1 = mpfr_underflow (x1, r, sign); 142 1.1.1.5 mrg flags1 = __gmpfr_flags; 143 1.1.1.5 mrg } 144 1.1.1.6 mrg else if (ep[i] > __gmpfr_emax - e) /* overflow */ 145 1.1.1.5 mrg { 146 1.1.1.5 mrg inex1 = mpfr_overflow (x1, (mpfr_rnd_t) rnd, sign); 147 1.1.1.5 mrg flags1 = __gmpfr_flags; 148 1.1.1.5 mrg } 149 1.1.1.5 mrg else 150 1.1.1.5 mrg { 151 1.1.1.6 mrg mpfr_set_exp (x1, ep[i] + e); 152 1.1.1.6 mrg zero: 153 1.1.1.5 mrg flags1 = inex1 != 0 ? MPFR_FLAGS_INEXACT : 0; 154 1.1.1.5 mrg } 155 1.1.1.5 mrg 156 1.1.1.5 mrg /* Test mpfr_set_si_2exp */ 157 1.1.1.5 mrg mpfr_clear_flags (); 158 1.1.1.5 mrg inex2 = mpfr_set_si_2exp (x2, j, ep[i], (mpfr_rnd_t) rnd); 159 1.1.1.5 mrg flags2 = __gmpfr_flags; 160 1.1.1.5 mrg 161 1.1.1.5 mrg if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) && 162 1.1.1.5 mrg mpfr_equal_p (x1, x2))) 163 1.1.1.5 mrg { 164 1.1.1.5 mrg s = 's'; 165 1.1.1.5 mrg goto err_extreme; 166 1.1.1.5 mrg } 167 1.1.1.5 mrg 168 1.1.1.5 mrg if (j < 0) 169 1.1.1.5 mrg continue; 170 1.1.1.5 mrg 171 1.1.1.5 mrg /* Test mpfr_set_ui_2exp */ 172 1.1.1.5 mrg mpfr_clear_flags (); 173 1.1.1.5 mrg inex2 = mpfr_set_ui_2exp (x2, j, ep[i], (mpfr_rnd_t) rnd); 174 1.1.1.5 mrg flags2 = __gmpfr_flags; 175 1.1.1.5 mrg 176 1.1.1.5 mrg if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) && 177 1.1.1.5 mrg mpfr_equal_p (x1, x2))) 178 1.1.1.5 mrg { 179 1.1.1.5 mrg s = 'u'; 180 1.1.1.5 mrg err_extreme: 181 1.1.1.5 mrg printf ("Error in extreme mpfr_set_%ci_2exp for i=%d j=%d %s\n", 182 1.1.1.5 mrg s, i, j, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 183 1.1.1.5 mrg printf ("emin=%" MPFR_EXP_FSPEC "d " 184 1.1.1.5 mrg "emax=%" MPFR_EXP_FSPEC "d\n", 185 1.1.1.5 mrg (mpfr_eexp_t) __gmpfr_emin, 186 1.1.1.5 mrg (mpfr_eexp_t) __gmpfr_emax); 187 1.1.1.5 mrg printf ("ep[%d] = %" MPFR_EXP_FSPEC "d\n", 188 1.1.1.5 mrg i, (mpfr_eexp_t) ep[i]); 189 1.1.1.5 mrg printf ("Expected "); 190 1.1.1.5 mrg mpfr_dump (x1); 191 1.1.1.5 mrg printf ("with inex = %d and flags =", inex1); 192 1.1.1.5 mrg flags_out (flags1); 193 1.1.1.5 mrg printf ("Got "); 194 1.1.1.5 mrg mpfr_dump (x2); 195 1.1.1.5 mrg printf ("with inex = %d and flags =", inex2); 196 1.1.1.5 mrg flags_out (flags2); 197 1.1.1.5 mrg exit (1); 198 1.1.1.5 mrg } 199 1.1.1.5 mrg } 200 1.1.1.5 mrg 201 1.1.1.5 mrg mpfr_clears (x1, x2, y, (mpfr_ptr) 0); 202 1.1.1.5 mrg } 203 1.1.1.5 mrg 204 1.1.1.5 mrg static void 205 1.1.1.5 mrg test_2exp_extreme (void) 206 1.1.1.5 mrg { 207 1.1.1.5 mrg mpfr_exp_t emin, emax; 208 1.1.1.5 mrg 209 1.1.1.5 mrg emin = mpfr_get_emin (); 210 1.1.1.5 mrg emax = mpfr_get_emax (); 211 1.1.1.5 mrg 212 1.1.1.5 mrg set_emin (MPFR_EMIN_MIN); 213 1.1.1.5 mrg set_emax (MPFR_EMAX_MAX); 214 1.1.1.5 mrg test_2exp_extreme_aux (); 215 1.1.1.5 mrg 216 1.1.1.5 mrg set_emin (-REXP); 217 1.1.1.5 mrg set_emax (REXP); 218 1.1.1.5 mrg test_2exp_extreme_aux (); 219 1.1.1.5 mrg 220 1.1.1.5 mrg set_emin (emin); 221 1.1.1.5 mrg set_emax (emax); 222 1.1.1.5 mrg } 223 1.1.1.5 mrg 224 1.1 mrg static void 225 1.1 mrg test_macros (void) 226 1.1 mrg { 227 1.1 mrg mpfr_t x[3]; 228 1.1 mrg mpfr_ptr p; 229 1.1 mrg int r; 230 1.1 mrg 231 1.1.1.4 mrg /* Note: the ++'s below allow one to check that the corresponding 232 1.1.1.4 mrg arguments are evaluated only once by the macros. */ 233 1.1.1.4 mrg 234 1.1 mrg mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0); 235 1.1 mrg p = x[0]; 236 1.1 mrg r = 0; 237 1.1 mrg mpfr_set_ui (p++, 0, (mpfr_rnd_t) r++); 238 1.1 mrg if (p != x[1] || r != 1) 239 1.1 mrg { 240 1.1 mrg printf ("Error in mpfr_set_ui macro: p - x[0] = %d (expecting 1), " 241 1.1 mrg "r = %d (expecting 1)\n", (int) (p - x[0]), r); 242 1.1 mrg exit (1); 243 1.1 mrg } 244 1.1 mrg p = x[0]; 245 1.1 mrg r = 0; 246 1.1 mrg mpfr_set_si (p++, 0, (mpfr_rnd_t) r++); 247 1.1 mrg if (p != x[1] || r != 1) 248 1.1 mrg { 249 1.1 mrg printf ("Error in mpfr_set_si macro: p - x[0] = %d (expecting 1), " 250 1.1 mrg "r = %d (expecting 1)\n", (int) (p - x[0]), r); 251 1.1 mrg exit (1); 252 1.1 mrg } 253 1.1 mrg mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0); 254 1.1 mrg } 255 1.1 mrg 256 1.1.1.2 mrg static void 257 1.1.1.2 mrg test_macros_keyword (void) 258 1.1.1.2 mrg { 259 1.1.1.2 mrg mpfr_t x; 260 1.1.1.2 mrg unsigned long i; 261 1.1.1.2 mrg 262 1.1.1.2 mrg mpfr_init2 (x, 64); 263 1.1.1.2 mrg #define MKN 0x1000000 264 1.1.1.2 mrg #define long short 265 1.1.1.2 mrg mpfr_set_ui (x, MKN, MPFR_RNDN); 266 1.1.1.2 mrg #undef long 267 1.1.1.2 mrg i = mpfr_get_ui (x, MPFR_RNDN); 268 1.1.1.2 mrg if (i != MKN) 269 1.1.1.2 mrg { 270 1.1.1.2 mrg printf ("Error in test_macros_keyword: expected 0x%lx, got 0x%lx.\n", 271 1.1.1.2 mrg (unsigned long) MKN, i); 272 1.1.1.2 mrg exit (1); 273 1.1.1.2 mrg } 274 1.1.1.2 mrg mpfr_clear (x); 275 1.1.1.2 mrg } 276 1.1.1.2 mrg 277 1.1.1.4 mrg static void 278 1.1.1.4 mrg test_get_ui_smallneg (void) 279 1.1.1.4 mrg { 280 1.1.1.4 mrg mpfr_t x; 281 1.1.1.4 mrg int i; 282 1.1.1.4 mrg 283 1.1.1.4 mrg mpfr_init2 (x, 64); 284 1.1.1.4 mrg 285 1.1.1.4 mrg for (i = 1; i <= 4; i++) 286 1.1.1.4 mrg { 287 1.1.1.4 mrg int r; 288 1.1.1.4 mrg 289 1.1.1.4 mrg mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN); 290 1.1.1.4 mrg RND_LOOP (r) 291 1.1.1.4 mrg { 292 1.1.1.4 mrg long s; 293 1.1.1.4 mrg unsigned long u; 294 1.1.1.4 mrg 295 1.1.1.4 mrg mpfr_clear_erangeflag (); 296 1.1.1.4 mrg s = mpfr_get_si (x, r != MPFR_RNDF ? (mpfr_rnd_t) r : MPFR_RNDA); 297 1.1.1.4 mrg if (mpfr_erangeflag_p ()) 298 1.1.1.4 mrg { 299 1.1.1.4 mrg printf ("ERROR for get_si + ERANGE + small negative op" 300 1.1.1.4 mrg " for rnd = %s and x = -%d/4\n", 301 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r), i); 302 1.1.1.4 mrg exit (1); 303 1.1.1.4 mrg } 304 1.1.1.4 mrg u = mpfr_get_ui (x, (mpfr_rnd_t) r); 305 1.1.1.4 mrg if (u != 0) 306 1.1.1.4 mrg { 307 1.1.1.4 mrg printf ("ERROR for get_ui + ERANGE + small negative op" 308 1.1.1.4 mrg " for rnd = %s and x = -%d/4\n", 309 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r), i); 310 1.1.1.4 mrg printf ("Expected 0, got %lu\n", u); 311 1.1.1.4 mrg exit (1); 312 1.1.1.4 mrg } 313 1.1.1.4 mrg if ((s == 0) ^ !mpfr_erangeflag_p ()) 314 1.1.1.4 mrg { 315 1.1.1.4 mrg const char *Not = s == 0 ? "" : " not"; 316 1.1.1.4 mrg 317 1.1.1.4 mrg printf ("ERROR for get_ui + ERANGE + small negative op" 318 1.1.1.4 mrg " for rnd = %s and x = -%d/4\n", 319 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r), i); 320 1.1.1.4 mrg printf ("The rounding integer (%ld) is%s representable in " 321 1.1.1.4 mrg "unsigned long,\nbut the erange flag is%s set.\n", 322 1.1.1.4 mrg s, Not, Not); 323 1.1.1.4 mrg exit (1); 324 1.1.1.4 mrg } 325 1.1.1.4 mrg } 326 1.1.1.4 mrg } 327 1.1.1.4 mrg 328 1.1.1.4 mrg mpfr_clear (x); 329 1.1.1.4 mrg } 330 1.1.1.4 mrg 331 1.1.1.4 mrg /* Test mpfr_get_si and mpfr_get_ui, on values around some particular 332 1.1.1.4 mrg * integers (see ts[] and tu[]): x = t?[i] + j/4, where '?' is 's' or 333 1.1.1.4 mrg * 'u', and j is an integer from -8 to 8. 334 1.1.1.4 mrg */ 335 1.1.1.4 mrg static void get_tests (void) 336 1.1.1.4 mrg { 337 1.1.1.4 mrg mpfr_exp_t emin, emax; 338 1.1.1.4 mrg mpfr_t x, z; 339 1.1.1.4 mrg long ts[5] = { LONG_MIN, LONG_MAX, -17, 0, 17 }; 340 1.1.1.4 mrg unsigned long tu[3] = { 0, ULONG_MAX, 17 }; 341 1.1.1.4 mrg int s, i, j, odd, ctr = 0; 342 1.1.1.4 mrg int inex; 343 1.1.1.4 mrg int r; 344 1.1.1.4 mrg 345 1.1.1.4 mrg emin = mpfr_get_emin (); 346 1.1.1.4 mrg emax = mpfr_get_emax (); 347 1.1.1.4 mrg 348 1.1.1.4 mrg /* We need the bitsize of an unsigned long + 3 bits (1 additional bit for 349 1.1.1.4 mrg * the cases >= ULONG_MAX + 1; 2 additional bits for the fractional part). 350 1.1.1.4 mrg */ 351 1.1.1.4 mrg mpfr_init2 (x, sizeof (unsigned long) * CHAR_BIT + 3); 352 1.1.1.4 mrg 353 1.1.1.4 mrg mpfr_init2 (z, MPFR_PREC_MIN); 354 1.1.1.4 mrg mpfr_set_ui_2exp (z, 1, -2, MPFR_RNDN); /* z = 1/4 */ 355 1.1.1.4 mrg 356 1.1.1.4 mrg for (s = 1; s >= 0; s--) 357 1.1.1.4 mrg for (i = 0; i < (s ? 5 : 3); i++) 358 1.1.1.4 mrg { 359 1.1.1.4 mrg odd = (s ? (unsigned long) ts[i] : tu[i]) & 1; 360 1.1.1.4 mrg inex = s ? 361 1.1.1.4 mrg mpfr_set_si (x, ts[i], MPFR_RNDN) : 362 1.1.1.4 mrg mpfr_set_ui (x, tu[i], MPFR_RNDN); 363 1.1.1.4 mrg MPFR_ASSERTN (inex == 0); 364 1.1.1.4 mrg inex = mpfr_sub_ui (x, x, 2, MPFR_RNDN); 365 1.1.1.4 mrg MPFR_ASSERTN (inex == 0); 366 1.1.1.4 mrg for (j = -8; j <= 8; j++) 367 1.1.1.4 mrg { 368 1.1.1.4 mrg /* Test x = t?[i] + j/4 in each non-RNDF rounding mode... */ 369 1.1.1.4 mrg RND_LOOP_NO_RNDF (r) 370 1.1.1.4 mrg { 371 1.1.1.4 mrg mpfr_flags_t ex_flags, flags; 372 1.1.1.4 mrg int e, k, overflow; 373 1.1.1.4 mrg 374 1.1.1.4 mrg ctr++; /* for the check below */ 375 1.1.1.4 mrg 376 1.1.1.4 mrg /* Let's determine k such that the rounded integer should 377 1.1.1.4 mrg be t?[i] + k, assuming an unbounded exponent range. */ 378 1.1.1.4 mrg k = (j + 8 + 379 1.1.1.4 mrg (MPFR_IS_LIKE_RNDD (r, MPFR_SIGN (x)) ? 0 : 380 1.1.1.4 mrg MPFR_IS_LIKE_RNDU (r, MPFR_SIGN (x)) ? 3 : 381 1.1.1.4 mrg 2)) / 4 - 2; 382 1.1.1.4 mrg if (r == MPFR_RNDN && ((unsigned int) j & 3) == 2 && 383 1.1.1.4 mrg ((odd + k) & 1)) 384 1.1.1.4 mrg k--; /* even rounding */ 385 1.1.1.4 mrg 386 1.1.1.4 mrg /* Overflow cases. Note that with the above choices: 387 1.1.1.4 mrg _ t?[0] == minval(type) 388 1.1.1.4 mrg _ t?[1] == maxval(type) 389 1.1.1.4 mrg */ 390 1.1.1.4 mrg overflow = (i == 0 && k < 0) || (i == 1 && k > 0); 391 1.1.1.4 mrg 392 1.1.1.4 mrg /* Expected flags. Note that in case of overflow, only the 393 1.1.1.4 mrg erange flag is set. Otherwise, the result is inexact iff 394 1.1.1.4 mrg j mod 1 != 0, i.e. the last two bits are not 00. */ 395 1.1.1.4 mrg ex_flags = overflow ? MPFR_FLAGS_ERANGE 396 1.1.1.4 mrg : ((unsigned int) j & 3) != 0 ? MPFR_FLAGS_INEXACT : 0; 397 1.1.1.4 mrg 398 1.1.1.4 mrg mpfr_clear_flags (); 399 1.1.1.4 mrg 400 1.1.1.4 mrg #define GET_TESTS_TEST(TYPE,TZ,F,C,FMT) \ 401 1.1.1.4 mrg do { \ 402 1.1.1.4 mrg TYPE a, d; \ 403 1.1.1.4 mrg \ 404 1.1.1.4 mrg a = TZ[i] + (overflow ? 0 : k); \ 405 1.1.1.4 mrg if (e) \ 406 1.1.1.4 mrg { \ 407 1.1.1.4 mrg mpfr_exp_t ex; \ 408 1.1.1.4 mrg ex = MPFR_GET_EXP (x); \ 409 1.1.1.4 mrg set_emin (ex); \ 410 1.1.1.4 mrg set_emax (ex); \ 411 1.1.1.4 mrg } \ 412 1.1.1.4 mrg d = F (x, (mpfr_rnd_t) r); \ 413 1.1.1.4 mrg flags = __gmpfr_flags; \ 414 1.1.1.4 mrg set_emin (emin); \ 415 1.1.1.4 mrg set_emax (emax); \ 416 1.1.1.4 mrg if (flags != ex_flags || a != d) \ 417 1.1.1.4 mrg { \ 418 1.1.1.4 mrg printf ("Error in get_tests for " #F " on %s%s\n", \ 419 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r), \ 420 1.1.1.4 mrg e ? ", reduced exponent range" : ""); \ 421 1.1.1.4 mrg printf ("x = t" C "[%d] + (%d/4) = ", i, j); \ 422 1.1.1.4 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); \ 423 1.1.1.4 mrg printf ("\n--> k = %d\n", k); \ 424 1.1.1.4 mrg printf ("Expected %l" FMT "\n", a); \ 425 1.1.1.4 mrg printf ("Got %l" FMT "\n", d); \ 426 1.1.1.4 mrg printf ("Expected flags:"); \ 427 1.1.1.4 mrg flags_out (ex_flags); \ 428 1.1.1.4 mrg printf ("Got flags: "); \ 429 1.1.1.4 mrg flags_out (flags); \ 430 1.1.1.4 mrg exit (1); \ 431 1.1.1.4 mrg } \ 432 1.1.1.4 mrg } while (0) 433 1.1.1.4 mrg 434 1.1.1.4 mrg for (e = 0; e < 2; e++) 435 1.1.1.4 mrg { 436 1.1.1.4 mrg if (e && MPFR_IS_ZERO (x)) 437 1.1.1.4 mrg break; 438 1.1.1.4 mrg if (s) 439 1.1.1.4 mrg GET_TESTS_TEST (long, 440 1.1.1.4 mrg ts, mpfr_get_si, "s", "d"); 441 1.1.1.4 mrg else 442 1.1.1.4 mrg GET_TESTS_TEST (unsigned long, 443 1.1.1.4 mrg tu, mpfr_get_ui, "u", "u"); 444 1.1.1.4 mrg } 445 1.1.1.4 mrg } 446 1.1.1.4 mrg inex = mpfr_add (x, x, z, MPFR_RNDN); 447 1.1.1.4 mrg MPFR_ASSERTN (inex == 0); 448 1.1.1.4 mrg } 449 1.1.1.4 mrg } 450 1.1.1.4 mrg 451 1.1.1.4 mrg /* Check that we have tested everything: 8 = 5 + 3 integers t?[i] 452 1.1.1.4 mrg * with 17 = 8 - (-8) + 1 additional terms (j/4) for each integer, 453 1.1.1.4 mrg * and each non-RNDF rounding mode. 454 1.1.1.4 mrg */ 455 1.1.1.4 mrg MPFR_ASSERTN (ctr == 8 * 17 * ((int) MPFR_RND_MAX - 1)); 456 1.1.1.4 mrg 457 1.1.1.4 mrg mpfr_clear (x); 458 1.1.1.4 mrg mpfr_clear (z); 459 1.1.1.4 mrg } 460 1.1.1.4 mrg 461 1.1 mrg /* FIXME: Comparing against mpfr_get_si/ui is not ideal, it'd be better to 462 1.1 mrg have all tests examine the bits in mpfr_t for what should come out. */ 463 1.1 mrg 464 1.1 mrg int 465 1.1 mrg main (int argc, char *argv[]) 466 1.1 mrg { 467 1.1 mrg mpfr_t x; 468 1.1 mrg long k, z, d, N; 469 1.1 mrg unsigned long zl, dl; 470 1.1 mrg int inex; 471 1.1 mrg int r; 472 1.1 mrg mpfr_exp_t emin, emax; 473 1.1 mrg int flag; 474 1.1 mrg 475 1.1 mrg tests_start_mpfr (); 476 1.1 mrg 477 1.1.1.4 mrg get_tests (); 478 1.1.1.4 mrg 479 1.1 mrg mpfr_init2 (x, 100); 480 1.1 mrg 481 1.1.1.4 mrg N = (argc == 1) ? 100000 : atol (argv[1]); 482 1.1 mrg 483 1.1 mrg for (k = 1; k <= N; k++) 484 1.1 mrg { 485 1.1 mrg z = (long) (randlimb () & LONG_MAX) + LONG_MIN / 2; 486 1.1 mrg inex = mpfr_set_si (x, z, MPFR_RNDZ); 487 1.1 mrg d = mpfr_get_si (x, MPFR_RNDZ); 488 1.1 mrg if (d != z) 489 1.1 mrg { 490 1.1 mrg printf ("Error in mpfr_set_si: expected %ld got %ld\n", z, d); 491 1.1 mrg exit (1); 492 1.1 mrg } 493 1.1 mrg if (inex) 494 1.1 mrg { 495 1.1 mrg printf ("Error in mpfr_set_si: inex value incorrect for %ld: %d\n", 496 1.1 mrg z, inex); 497 1.1 mrg exit (1); 498 1.1 mrg } 499 1.1 mrg } 500 1.1 mrg 501 1.1 mrg for (k = 1; k <= N; k++) 502 1.1 mrg { 503 1.1 mrg zl = randlimb (); 504 1.1 mrg inex = mpfr_set_ui (x, zl, MPFR_RNDZ); 505 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDZ); 506 1.1 mrg if (dl != zl) 507 1.1 mrg { 508 1.1 mrg printf ("Error in mpfr_set_ui: expected %lu got %lu\n", zl, dl); 509 1.1 mrg exit (1); 510 1.1 mrg } 511 1.1 mrg if (inex) 512 1.1 mrg { 513 1.1 mrg printf ("Error in mpfr_set_ui: inex value incorrect for %lu: %d\n", 514 1.1 mrg zl, inex); 515 1.1 mrg exit (1); 516 1.1 mrg } 517 1.1 mrg } 518 1.1 mrg 519 1.1 mrg mpfr_set_prec (x, 2); 520 1.1 mrg if (mpfr_set_si (x, 5, MPFR_RNDZ) >= 0) 521 1.1 mrg { 522 1.1 mrg printf ("Wrong inexact flag for x=5, rnd=MPFR_RNDZ\n"); 523 1.1 mrg exit (1); 524 1.1 mrg } 525 1.1 mrg 526 1.1 mrg mpfr_set_prec (x, 2); 527 1.1 mrg if (mpfr_set_si (x, -5, MPFR_RNDZ) <= 0) 528 1.1 mrg { 529 1.1 mrg printf ("Wrong inexact flag for x=-5, rnd=MPFR_RNDZ\n"); 530 1.1 mrg exit (1); 531 1.1 mrg } 532 1.1 mrg 533 1.1 mrg mpfr_set_prec (x, 3); 534 1.1 mrg inex = mpfr_set_si (x, 77617, MPFR_RNDD); /* should be 65536 */ 535 1.1.1.4 mrg if (MPFR_MANT(x)[0] != MPFR_LIMB_HIGHBIT || inex >= 0) 536 1.1 mrg { 537 1.1 mrg printf ("Error in mpfr_set_si(x:3, 77617, MPFR_RNDD)\n"); 538 1.1.1.4 mrg mpfr_dump (x); 539 1.1 mrg exit (1); 540 1.1 mrg } 541 1.1 mrg inex = mpfr_set_ui (x, 77617, MPFR_RNDD); /* should be 65536 */ 542 1.1.1.4 mrg if (MPFR_MANT(x)[0] != MPFR_LIMB_HIGHBIT || inex >= 0) 543 1.1 mrg { 544 1.1 mrg printf ("Error in mpfr_set_ui(x:3, 77617, MPFR_RNDD)\n"); 545 1.1.1.4 mrg mpfr_dump (x); 546 1.1 mrg exit (1); 547 1.1 mrg } 548 1.1 mrg 549 1.1 mrg mpfr_set_prec (x, 2); 550 1.1 mrg inex = mpfr_set_si (x, 33096, MPFR_RNDU); 551 1.1 mrg if (mpfr_get_si (x, MPFR_RNDZ) != 49152 || inex <= 0) 552 1.1 mrg { 553 1.1 mrg printf ("Error in mpfr_set_si, exp. 49152, got %ld, inex %d\n", 554 1.1 mrg mpfr_get_si (x, MPFR_RNDZ), inex); 555 1.1 mrg exit (1); 556 1.1 mrg } 557 1.1 mrg inex = mpfr_set_ui (x, 33096, MPFR_RNDU); 558 1.1 mrg if (mpfr_get_si (x, MPFR_RNDZ) != 49152) 559 1.1 mrg { 560 1.1 mrg printf ("Error in mpfr_set_ui, exp. 49152, got %ld, inex %d\n", 561 1.1 mrg mpfr_get_si (x, MPFR_RNDZ), inex); 562 1.1 mrg exit (1); 563 1.1 mrg } 564 1.1.1.2 mrg /* Also test the mpfr_set_ui function (instead of macro). */ 565 1.1.1.2 mrg inex = (mpfr_set_ui) (x, 33096, MPFR_RNDU); 566 1.1.1.2 mrg if (mpfr_get_si (x, MPFR_RNDZ) != 49152) 567 1.1.1.2 mrg { 568 1.1.1.2 mrg printf ("Error in mpfr_set_ui function, exp. 49152, got %ld, inex %d\n", 569 1.1.1.2 mrg mpfr_get_si (x, MPFR_RNDZ), inex); 570 1.1.1.2 mrg exit (1); 571 1.1.1.2 mrg } 572 1.1 mrg 573 1.1.1.6 mrg RND_LOOP (r) 574 1.1 mrg { 575 1.1 mrg mpfr_set_si (x, -1, (mpfr_rnd_t) r); 576 1.1 mrg mpfr_set_ui (x, 0, (mpfr_rnd_t) r); 577 1.1 mrg if (MPFR_IS_NEG (x) || mpfr_get_ui (x, (mpfr_rnd_t) r) != 0) 578 1.1 mrg { 579 1.1 mrg printf ("mpfr_set_ui (x, 0) gives -0 for %s\n", 580 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r)); 581 1.1 mrg exit (1); 582 1.1 mrg } 583 1.1 mrg 584 1.1 mrg mpfr_set_si (x, -1, (mpfr_rnd_t) r); 585 1.1 mrg mpfr_set_si (x, 0, (mpfr_rnd_t) r); 586 1.1 mrg if (MPFR_IS_NEG (x) || mpfr_get_si (x, (mpfr_rnd_t) r) != 0) 587 1.1 mrg { 588 1.1 mrg printf ("mpfr_set_si (x, 0) gives -0 for %s\n", 589 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r)); 590 1.1 mrg exit (1); 591 1.1 mrg } 592 1.1 mrg } 593 1.1 mrg 594 1.1 mrg /* check potential bug in case mp_limb_t is unsigned */ 595 1.1 mrg emax = mpfr_get_emax (); 596 1.1 mrg set_emax (0); 597 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN); 598 1.1 mrg if (mpfr_sgn (x) >= 0) 599 1.1 mrg { 600 1.1 mrg printf ("mpfr_set_si (x, -1) fails\n"); 601 1.1 mrg exit (1); 602 1.1 mrg } 603 1.1 mrg set_emax (emax); 604 1.1 mrg 605 1.1 mrg emax = mpfr_get_emax (); 606 1.1 mrg set_emax (5); 607 1.1 mrg mpfr_set_prec (x, 2); 608 1.1 mrg mpfr_set_si (x, -31, MPFR_RNDN); 609 1.1 mrg if (mpfr_sgn (x) >= 0) 610 1.1 mrg { 611 1.1 mrg printf ("mpfr_set_si (x, -31) fails\n"); 612 1.1 mrg exit (1); 613 1.1 mrg } 614 1.1 mrg set_emax (emax); 615 1.1 mrg 616 1.1 mrg /* test for get_ui */ 617 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); 618 1.1 mrg MPFR_ASSERTN(mpfr_get_ui (x, MPFR_RNDN) == 0); 619 1.1 mrg mpfr_set_ui (x, ULONG_MAX, MPFR_RNDU); 620 1.1 mrg mpfr_nextabove (x); 621 1.1 mrg mpfr_get_ui (x, MPFR_RNDU); 622 1.1 mrg 623 1.1 mrg /* another test for get_ui */ 624 1.1 mrg mpfr_set_prec (x, 10); 625 1.1 mrg mpfr_set_str_binary (x, "10.101"); 626 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN); 627 1.1 mrg MPFR_ASSERTN (dl == 3); 628 1.1 mrg 629 1.1 mrg mpfr_set_str_binary (x, "-1.0"); 630 1.1 mrg mpfr_get_ui (x, MPFR_RNDN); 631 1.1 mrg 632 1.1 mrg mpfr_set_str_binary (x, "0.1"); 633 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN); 634 1.1 mrg MPFR_ASSERTN (dl == 0); 635 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDZ); 636 1.1 mrg MPFR_ASSERTN (dl == 0); 637 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDD); 638 1.1 mrg MPFR_ASSERTN (dl == 0); 639 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDU); 640 1.1 mrg MPFR_ASSERTN (dl == 1); 641 1.1 mrg 642 1.1 mrg /* coverage tests */ 643 1.1 mrg mpfr_set_prec (x, 2); 644 1.1 mrg mpfr_set_si (x, -7, MPFR_RNDD); 645 1.1 mrg MPFR_ASSERTN(mpfr_cmp_si (x, -8) == 0); 646 1.1 mrg mpfr_set_prec (x, 2); 647 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDU); 648 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (x, 8) == 0); 649 1.1 mrg emax = mpfr_get_emax (); 650 1.1 mrg set_emax (3); 651 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDU); 652 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0); 653 1.1 mrg set_emax (1); 654 1.1 mrg MPFR_ASSERTN( mpfr_set_ui (x, 7, MPFR_RNDU) ); 655 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0); 656 1.1 mrg set_emax (emax); 657 1.1 mrg mpfr_set_ui_2exp (x, 17, -50, MPFR_RNDN); 658 1.1 mrg MPFR_ASSERTN (mpfr_get_ui (x, MPFR_RNDD) == 0); 659 1.1 mrg MPFR_ASSERTN (mpfr_get_si (x, MPFR_RNDD) == 0); 660 1.1 mrg 661 1.1.1.4 mrg /* Test for ERANGE flag + correct behavior if overflow */ 662 1.1 mrg mpfr_set_prec (x, 256); 663 1.1 mrg mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); 664 1.1 mrg mpfr_clear_erangeflag (); 665 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN); 666 1.1 mrg if (dl != ULONG_MAX || mpfr_erangeflag_p ()) 667 1.1 mrg { 668 1.1 mrg printf ("ERROR for get_ui + ERANGE + ULONG_MAX (1)\n"); 669 1.1 mrg exit (1); 670 1.1 mrg } 671 1.1 mrg mpfr_add_ui (x, x, 1, MPFR_RNDN); 672 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN); 673 1.1 mrg if (dl != ULONG_MAX || !mpfr_erangeflag_p ()) 674 1.1 mrg { 675 1.1 mrg printf ("ERROR for get_ui + ERANGE + ULONG_MAX (2)\n"); 676 1.1 mrg exit (1); 677 1.1 mrg } 678 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN); 679 1.1 mrg mpfr_clear_erangeflag (); 680 1.1 mrg dl = mpfr_get_ui (x, MPFR_RNDN); 681 1.1 mrg if (dl != 0 || !mpfr_erangeflag_p ()) 682 1.1 mrg { 683 1.1 mrg printf ("ERROR for get_ui + ERANGE + -1 \n"); 684 1.1 mrg exit (1); 685 1.1 mrg } 686 1.1 mrg mpfr_set_si (x, LONG_MAX, MPFR_RNDN); 687 1.1 mrg mpfr_clear_erangeflag (); 688 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN); 689 1.1 mrg if (d != LONG_MAX || mpfr_erangeflag_p ()) 690 1.1 mrg { 691 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MAX (1): %ld\n", d); 692 1.1 mrg exit (1); 693 1.1 mrg } 694 1.1 mrg mpfr_add_ui (x, x, 1, MPFR_RNDN); 695 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN); 696 1.1 mrg if (d != LONG_MAX || !mpfr_erangeflag_p ()) 697 1.1 mrg { 698 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MAX (2)\n"); 699 1.1 mrg exit (1); 700 1.1 mrg } 701 1.1 mrg mpfr_set_si (x, LONG_MIN, MPFR_RNDN); 702 1.1 mrg mpfr_clear_erangeflag (); 703 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN); 704 1.1 mrg if (d != LONG_MIN || mpfr_erangeflag_p ()) 705 1.1 mrg { 706 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MIN (1)\n"); 707 1.1 mrg exit (1); 708 1.1 mrg } 709 1.1 mrg mpfr_sub_ui (x, x, 1, MPFR_RNDN); 710 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN); 711 1.1 mrg if (d != LONG_MIN || !mpfr_erangeflag_p ()) 712 1.1 mrg { 713 1.1 mrg printf ("ERROR for get_si + ERANGE + LONG_MIN (2)\n"); 714 1.1 mrg exit (1); 715 1.1 mrg } 716 1.1 mrg 717 1.1 mrg mpfr_set_nan (x); 718 1.1.1.4 mrg mpfr_clear_flags (); 719 1.1 mrg d = mpfr_get_ui (x, MPFR_RNDN); 720 1.1.1.4 mrg if (d != 0 || __gmpfr_flags != MPFR_FLAGS_ERANGE) 721 1.1 mrg { 722 1.1 mrg printf ("ERROR for get_ui + NaN\n"); 723 1.1 mrg exit (1); 724 1.1 mrg } 725 1.1 mrg mpfr_clear_erangeflag (); 726 1.1 mrg d = mpfr_get_si (x, MPFR_RNDN); 727 1.1.1.4 mrg if (d != 0 || __gmpfr_flags != MPFR_FLAGS_ERANGE) 728 1.1 mrg { 729 1.1 mrg printf ("ERROR for get_si + NaN\n"); 730 1.1 mrg exit (1); 731 1.1 mrg } 732 1.1 mrg 733 1.1 mrg emin = mpfr_get_emin (); 734 1.1 mrg mpfr_set_prec (x, 2); 735 1.1 mrg 736 1.1.1.6 mrg set_emin (4); 737 1.1 mrg mpfr_clear_flags (); 738 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDU); 739 1.1 mrg flag = mpfr_underflow_p (); 740 1.1.1.6 mrg set_emin (emin); 741 1.1 mrg if (mpfr_cmp_ui (x, 8) != 0) 742 1.1 mrg { 743 1.1 mrg printf ("Error for mpfr_set_ui (x, 7, MPFR_RNDU), prec = 2, emin = 4\n"); 744 1.1 mrg exit (1); 745 1.1 mrg } 746 1.1 mrg if (flag) 747 1.1 mrg { 748 1.1 mrg printf ("mpfr_set_ui (x, 7, MPFR_RNDU) should not underflow " 749 1.1 mrg "with prec = 2, emin = 4\n"); 750 1.1 mrg exit (1); 751 1.1 mrg } 752 1.1 mrg 753 1.1.1.6 mrg set_emin (4); 754 1.1 mrg mpfr_clear_flags (); 755 1.1 mrg mpfr_set_si (x, -7, MPFR_RNDD); 756 1.1 mrg flag = mpfr_underflow_p (); 757 1.1.1.6 mrg set_emin (emin); 758 1.1 mrg if (mpfr_cmp_si (x, -8) != 0) 759 1.1 mrg { 760 1.1 mrg printf ("Error for mpfr_set_si (x, -7, MPFR_RNDD), prec = 2, emin = 4\n"); 761 1.1 mrg exit (1); 762 1.1 mrg } 763 1.1 mrg if (flag) 764 1.1 mrg { 765 1.1 mrg printf ("mpfr_set_si (x, -7, MPFR_RNDD) should not underflow " 766 1.1 mrg "with prec = 2, emin = 4\n"); 767 1.1 mrg exit (1); 768 1.1 mrg } 769 1.1 mrg 770 1.1 mrg mpfr_clear (x); 771 1.1 mrg 772 1.1 mrg test_2exp (); 773 1.1.1.5 mrg test_2exp_extreme (); 774 1.1 mrg test_macros (); 775 1.1.1.2 mrg test_macros_keyword (); 776 1.1.1.4 mrg test_get_ui_smallneg (); 777 1.1 mrg tests_end_mpfr (); 778 1.1 mrg return 0; 779 1.1 mrg } 780