1 1.1 mrg /* Test file for 2 1.1 mrg mpfr_set_sj, mpfr_set_uj, mpfr_set_sj_2exp and mpfr_set_uj_2exp. 3 1.1 mrg 4 1.1.1.6 mrg Copyright 2004, 2006-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.5 mrg #define MPFR_NEED_INTMAX_H 25 1.1 mrg #include "mpfr-test.h" 26 1.1 mrg 27 1.1 mrg #ifndef _MPFR_H_HAVE_INTMAX_T 28 1.1.1.2 mrg 29 1.1 mrg int 30 1.1 mrg main (void) 31 1.1 mrg { 32 1.1.1.2 mrg return 77; 33 1.1 mrg } 34 1.1.1.2 mrg 35 1.1 mrg #else 36 1.1 mrg 37 1.1.1.4 mrg #define PRINT_ERROR(str) \ 38 1.1.1.4 mrg do { printf ("Error for %s\n", str); exit (1); } while (0) 39 1.1 mrg 40 1.1 mrg static int 41 1.1 mrg inexact_sign (int x) 42 1.1 mrg { 43 1.1 mrg return (x < 0) ? -1 : (x > 0); 44 1.1 mrg } 45 1.1 mrg 46 1.1 mrg static void 47 1.1 mrg check_set_uj (mpfr_prec_t pmin, mpfr_prec_t pmax, int N) 48 1.1 mrg { 49 1.1 mrg mpfr_t x, y; 50 1.1 mrg mpfr_prec_t p; 51 1.1 mrg int inex1, inex2, n; 52 1.1 mrg mp_limb_t limb; 53 1.1 mrg 54 1.1 mrg mpfr_inits2 (pmax, x, y, (mpfr_ptr) 0); 55 1.1 mrg 56 1.1.1.4 mrg for (p = pmin ; p < pmax ; p++) 57 1.1 mrg { 58 1.1 mrg mpfr_set_prec (x, p); 59 1.1 mrg mpfr_set_prec (y, p); 60 1.1 mrg for (n = 0 ; n < N ; n++) 61 1.1 mrg { 62 1.1 mrg /* mp_limb_t may be unsigned long long */ 63 1.1 mrg limb = (unsigned long) randlimb (); 64 1.1 mrg inex1 = mpfr_set_uj (x, limb, MPFR_RNDN); 65 1.1 mrg inex2 = mpfr_set_ui (y, limb, MPFR_RNDN); 66 1.1 mrg if (mpfr_cmp (x, y)) 67 1.1 mrg { 68 1.1 mrg printf ("ERROR for mpfr_set_uj and j=%lu and p=%lu\n", 69 1.1.1.2 mrg (unsigned long) limb, (unsigned long) p); 70 1.1 mrg printf ("X="); mpfr_dump (x); 71 1.1 mrg printf ("Y="); mpfr_dump (y); 72 1.1 mrg exit (1); 73 1.1 mrg } 74 1.1 mrg if (inexact_sign (inex1) != inexact_sign (inex2)) 75 1.1 mrg { 76 1.1 mrg printf ("ERROR for inexact(set_uj): j=%lu p=%lu\n" 77 1.1 mrg "Inexact1= %d Inexact2= %d\n", 78 1.1.1.2 mrg (unsigned long) limb, (unsigned long) p, inex1, inex2); 79 1.1 mrg exit (1); 80 1.1 mrg } 81 1.1 mrg } 82 1.1 mrg } 83 1.1 mrg /* Special case */ 84 1.1 mrg mpfr_set_prec (x, sizeof(uintmax_t)*CHAR_BIT); 85 1.1.1.5 mrg inex1 = mpfr_set_uj (x, UINTMAX_MAX, MPFR_RNDN); 86 1.1 mrg if (inex1 != 0 || mpfr_sgn(x) <= 0) 87 1.1.1.4 mrg PRINT_ERROR ("inexact / UINTMAX_MAX"); 88 1.1 mrg inex1 = mpfr_add_ui (x, x, 1, MPFR_RNDN); 89 1.1 mrg if (inex1 != 0 || !mpfr_powerof2_raw (x) 90 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(uintmax_t) * CHAR_BIT + 1) 91 1.1.1.4 mrg PRINT_ERROR ("power of 2"); 92 1.1 mrg mpfr_set_uj (x, 0, MPFR_RNDN); 93 1.1 mrg if (!MPFR_IS_ZERO (x)) 94 1.1.1.4 mrg PRINT_ERROR ("Setting 0"); 95 1.1 mrg 96 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0); 97 1.1 mrg } 98 1.1 mrg 99 1.1 mrg static void 100 1.1 mrg check_set_uj_2exp (void) 101 1.1 mrg { 102 1.1 mrg mpfr_t x; 103 1.1 mrg int inex; 104 1.1 mrg 105 1.1 mrg mpfr_init2 (x, sizeof(uintmax_t)*CHAR_BIT); 106 1.1 mrg 107 1.1 mrg inex = mpfr_set_uj_2exp (x, 1, 0, MPFR_RNDN); 108 1.1 mrg if (inex || mpfr_cmp_ui(x, 1)) 109 1.1.1.4 mrg PRINT_ERROR ("(1U,0)"); 110 1.1 mrg 111 1.1 mrg inex = mpfr_set_uj_2exp (x, 1024, -10, MPFR_RNDN); 112 1.1 mrg if (inex || mpfr_cmp_ui(x, 1)) 113 1.1.1.4 mrg PRINT_ERROR ("(1024U,-10)"); 114 1.1 mrg 115 1.1 mrg inex = mpfr_set_uj_2exp (x, 1024, 10, MPFR_RNDN); 116 1.1 mrg if (inex || mpfr_cmp_ui(x, 1024L * 1024L)) 117 1.1.1.4 mrg PRINT_ERROR ("(1024U,+10)"); 118 1.1 mrg 119 1.1.1.5 mrg inex = mpfr_set_uj_2exp (x, UINTMAX_MAX, 1000, MPFR_RNDN); 120 1.1 mrg inex |= mpfr_div_2ui (x, x, 1000, MPFR_RNDN); 121 1.1 mrg inex |= mpfr_add_ui (x, x, 1, MPFR_RNDN); 122 1.1 mrg if (inex || !mpfr_powerof2_raw (x) 123 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(uintmax_t) * CHAR_BIT + 1) 124 1.1.1.4 mrg PRINT_ERROR ("(UINTMAX_MAX)"); 125 1.1 mrg 126 1.1.1.5 mrg inex = mpfr_set_uj_2exp (x, UINTMAX_MAX, MPFR_EMAX_MAX-10, MPFR_RNDN); 127 1.1 mrg if (inex == 0 || !mpfr_inf_p (x)) 128 1.1.1.4 mrg PRINT_ERROR ("Overflow"); 129 1.1 mrg 130 1.1.1.5 mrg inex = mpfr_set_uj_2exp (x, UINTMAX_MAX, MPFR_EMIN_MIN-1000, MPFR_RNDN); 131 1.1 mrg if (inex == 0 || !MPFR_IS_ZERO (x)) 132 1.1.1.4 mrg PRINT_ERROR ("Underflow"); 133 1.1 mrg 134 1.1 mrg mpfr_clear (x); 135 1.1 mrg } 136 1.1 mrg 137 1.1 mrg static void 138 1.1 mrg check_set_sj (void) 139 1.1 mrg { 140 1.1 mrg mpfr_t x; 141 1.1 mrg int inex; 142 1.1 mrg 143 1.1 mrg mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1); 144 1.1 mrg 145 1.1.1.5 mrg inex = mpfr_set_sj (x, -INTMAX_MAX, MPFR_RNDN); 146 1.1 mrg inex |= mpfr_add_si (x, x, -1, MPFR_RNDN); 147 1.1 mrg if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x) 148 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(intmax_t) * CHAR_BIT) 149 1.1.1.4 mrg PRINT_ERROR ("set_sj (-INTMAX_MAX)"); 150 1.1 mrg 151 1.1 mrg inex = mpfr_set_sj (x, 1742, MPFR_RNDN); 152 1.1 mrg if (inex || mpfr_cmp_ui (x, 1742)) 153 1.1.1.4 mrg PRINT_ERROR ("set_sj (1742)"); 154 1.1 mrg 155 1.1 mrg mpfr_clear (x); 156 1.1 mrg } 157 1.1 mrg 158 1.1 mrg static void 159 1.1 mrg check_set_sj_2exp (void) 160 1.1 mrg { 161 1.1 mrg mpfr_t x; 162 1.1 mrg int inex; 163 1.1 mrg 164 1.1 mrg mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1); 165 1.1 mrg 166 1.1.1.5 mrg inex = mpfr_set_sj_2exp (x, INTMAX_MIN, 1000, MPFR_RNDN); 167 1.1 mrg if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x) 168 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(intmax_t) * CHAR_BIT + 1000) 169 1.1.1.4 mrg PRINT_ERROR ("set_sj_2exp (INTMAX_MIN)"); 170 1.1 mrg 171 1.1 mrg mpfr_clear (x); 172 1.1 mrg } 173 1.1 mrg 174 1.1.1.5 mrg #define REXP 1024 175 1.1.1.5 mrg 176 1.1.1.5 mrg static void 177 1.1.1.5 mrg test_2exp_extreme_aux (void) 178 1.1.1.5 mrg { 179 1.1.1.5 mrg mpfr_t x1, x2, y; 180 1.1.1.5 mrg mpfr_exp_t e, ep[1 + 8 * 5], eb[] = 181 1.1.1.5 mrg { MPFR_EMIN_MIN, -REXP, REXP, MPFR_EMAX_MAX, MPFR_EXP_MAX }; 182 1.1.1.5 mrg mpfr_flags_t flags1, flags2; 183 1.1.1.5 mrg int i, j, rnd, inex1, inex2; 184 1.1.1.5 mrg char s; 185 1.1.1.5 mrg 186 1.1.1.5 mrg ep[0] = MPFR_EXP_MIN; 187 1.1.1.5 mrg for (i = 0; i < numberof(eb); i++) 188 1.1.1.5 mrg for (j = 0; j < 8; j++) 189 1.1.1.5 mrg ep[1 + 8 * i + j] = eb[i] - j; 190 1.1.1.5 mrg 191 1.1.1.5 mrg mpfr_inits2 (3, x1, x2, (mpfr_ptr) 0); 192 1.1.1.5 mrg mpfr_init2 (y, 32); 193 1.1.1.5 mrg 194 1.1.1.5 mrg /* The cast to int is needed if numberof(ep) is of unsigned type, in 195 1.1.1.5 mrg which case the condition without the cast would be always false. */ 196 1.1.1.5 mrg for (i = -2; i < (int) numberof(ep); i++) 197 1.1.1.5 mrg for (j = -31; j <= 31; j++) 198 1.1.1.5 mrg RND_LOOP_NO_RNDF (rnd) 199 1.1.1.5 mrg { 200 1.1.1.5 mrg int sign = j < 0 ? -1 : 1; 201 1.1.1.5 mrg intmax_t em; 202 1.1.1.5 mrg 203 1.1.1.5 mrg if (i < 0) 204 1.1.1.5 mrg { 205 1.1.1.5 mrg em = i == -2 ? INTMAX_MIN : INTMAX_MAX; 206 1.1.1.5 mrg mpfr_clear_flags (); 207 1.1.1.5 mrg inex1 = j == 0 ? 208 1.1.1.5 mrg (mpfr_set_zero (x1, +1), 0) : i == -2 ? 209 1.1.1.5 mrg mpfr_underflow (x1, rnd == MPFR_RNDN ? 210 1.1.1.5 mrg MPFR_RNDZ : (mpfr_rnd_t) rnd, sign) : 211 1.1.1.5 mrg mpfr_overflow (x1, (mpfr_rnd_t) rnd, sign); 212 1.1.1.5 mrg flags1 = __gmpfr_flags; 213 1.1.1.5 mrg } 214 1.1.1.5 mrg else 215 1.1.1.5 mrg { 216 1.1.1.5 mrg em = ep[i]; 217 1.1.1.5 mrg /* Compute the expected value, inex and flags */ 218 1.1.1.5 mrg inex1 = mpfr_set_si (y, j, MPFR_RNDN); 219 1.1.1.5 mrg MPFR_ASSERTN (inex1 == 0); 220 1.1.1.5 mrg inex1 = mpfr_set (x1, y, (mpfr_rnd_t) rnd); 221 1.1.1.5 mrg /* x1 is the rounded value and inex1 the ternary value, 222 1.1.1.5 mrg assuming that the exponent argument is 0 (this is the 223 1.1.1.5 mrg rounded significand of the final result, assuming an 224 1.1.1.5 mrg unbounded exponent range). The multiplication by a 225 1.1.1.5 mrg power of 2 is exact, unless underflow/overflow occurs. 226 1.1.1.5 mrg The tests on the exponent below avoid integer overflows 227 1.1.1.5 mrg (ep[i] may take extreme values). */ 228 1.1.1.5 mrg mpfr_clear_flags (); 229 1.1.1.6 mrg if (j == 0) 230 1.1.1.6 mrg goto zero; 231 1.1.1.6 mrg e = MPFR_GET_EXP (x1); 232 1.1.1.6 mrg if (ep[i] < __gmpfr_emin - e) /* underflow */ 233 1.1.1.5 mrg { 234 1.1.1.5 mrg mpfr_rnd_t r = 235 1.1.1.5 mrg (rnd == MPFR_RNDN && 236 1.1.1.6 mrg (ep[i] < __gmpfr_emin - MPFR_GET_EXP (y) - 1 || 237 1.1.1.5 mrg IS_POW2 (sign * j))) ? 238 1.1.1.5 mrg MPFR_RNDZ : (mpfr_rnd_t) rnd; 239 1.1.1.5 mrg inex1 = mpfr_underflow (x1, r, sign); 240 1.1.1.5 mrg flags1 = __gmpfr_flags; 241 1.1.1.5 mrg } 242 1.1.1.6 mrg else if (ep[i] > __gmpfr_emax - e) /* overflow */ 243 1.1.1.5 mrg { 244 1.1.1.5 mrg inex1 = mpfr_overflow (x1, (mpfr_rnd_t) rnd, sign); 245 1.1.1.5 mrg flags1 = __gmpfr_flags; 246 1.1.1.5 mrg } 247 1.1.1.5 mrg else 248 1.1.1.5 mrg { 249 1.1.1.6 mrg mpfr_set_exp (x1, ep[i] + e); 250 1.1.1.6 mrg zero: 251 1.1.1.5 mrg flags1 = inex1 != 0 ? MPFR_FLAGS_INEXACT : 0; 252 1.1.1.5 mrg } 253 1.1.1.5 mrg } 254 1.1.1.5 mrg 255 1.1.1.5 mrg /* Test mpfr_set_sj_2exp */ 256 1.1.1.5 mrg mpfr_clear_flags (); 257 1.1.1.5 mrg inex2 = mpfr_set_sj_2exp (x2, j, em, (mpfr_rnd_t) rnd); 258 1.1.1.5 mrg flags2 = __gmpfr_flags; 259 1.1.1.5 mrg 260 1.1.1.5 mrg if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) && 261 1.1.1.5 mrg mpfr_equal_p (x1, x2))) 262 1.1.1.5 mrg { 263 1.1.1.5 mrg s = 's'; 264 1.1.1.5 mrg goto err_extreme; 265 1.1.1.5 mrg } 266 1.1.1.5 mrg 267 1.1.1.5 mrg if (j < 0) 268 1.1.1.5 mrg continue; 269 1.1.1.5 mrg 270 1.1.1.5 mrg /* Test mpfr_set_uj_2exp */ 271 1.1.1.5 mrg mpfr_clear_flags (); 272 1.1.1.5 mrg inex2 = mpfr_set_uj_2exp (x2, j, em, (mpfr_rnd_t) rnd); 273 1.1.1.5 mrg flags2 = __gmpfr_flags; 274 1.1.1.5 mrg 275 1.1.1.5 mrg if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) && 276 1.1.1.5 mrg mpfr_equal_p (x1, x2))) 277 1.1.1.5 mrg { 278 1.1.1.5 mrg s = 'u'; 279 1.1.1.5 mrg err_extreme: 280 1.1.1.5 mrg printf ("Error in extreme mpfr_set_%cj_2exp for i=%d j=%d %s\n", 281 1.1.1.5 mrg s, i, j, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 282 1.1.1.5 mrg printf ("emin=%" MPFR_EXP_FSPEC "d " 283 1.1.1.5 mrg "emax=%" MPFR_EXP_FSPEC "d\n", 284 1.1.1.5 mrg (mpfr_eexp_t) __gmpfr_emin, 285 1.1.1.5 mrg (mpfr_eexp_t) __gmpfr_emax); 286 1.1.1.5 mrg #ifndef NPRINTF_J 287 1.1.1.5 mrg printf ("e = %jd\n", em); 288 1.1.1.5 mrg #endif 289 1.1.1.5 mrg printf ("Expected "); 290 1.1.1.5 mrg mpfr_dump (x1); 291 1.1.1.5 mrg printf ("with inex = %d and flags =", inex1); 292 1.1.1.5 mrg flags_out (flags1); 293 1.1.1.5 mrg printf ("Got "); 294 1.1.1.5 mrg mpfr_dump (x2); 295 1.1.1.5 mrg printf ("with inex = %d and flags =", inex2); 296 1.1.1.5 mrg flags_out (flags2); 297 1.1.1.5 mrg exit (1); 298 1.1.1.5 mrg } 299 1.1.1.5 mrg } 300 1.1.1.5 mrg 301 1.1.1.5 mrg mpfr_clears (x1, x2, y, (mpfr_ptr) 0); 302 1.1.1.5 mrg } 303 1.1.1.5 mrg 304 1.1.1.5 mrg static void 305 1.1.1.5 mrg test_2exp_extreme (void) 306 1.1.1.5 mrg { 307 1.1.1.5 mrg mpfr_exp_t emin, emax; 308 1.1.1.5 mrg 309 1.1.1.5 mrg emin = mpfr_get_emin (); 310 1.1.1.5 mrg emax = mpfr_get_emax (); 311 1.1.1.5 mrg 312 1.1.1.5 mrg set_emin (MPFR_EMIN_MIN); 313 1.1.1.5 mrg set_emax (MPFR_EMAX_MAX); 314 1.1.1.5 mrg test_2exp_extreme_aux (); 315 1.1.1.5 mrg 316 1.1.1.5 mrg set_emin (-REXP); 317 1.1.1.5 mrg set_emax (REXP); 318 1.1.1.5 mrg test_2exp_extreme_aux (); 319 1.1.1.5 mrg 320 1.1.1.5 mrg set_emin (emin); 321 1.1.1.5 mrg set_emax (emax); 322 1.1.1.5 mrg } 323 1.1.1.5 mrg 324 1.1 mrg int 325 1.1 mrg main (int argc, char *argv[]) 326 1.1 mrg { 327 1.1 mrg tests_start_mpfr (); 328 1.1 mrg 329 1.1 mrg check_set_uj (2, 128, 50); 330 1.1 mrg check_set_uj_2exp (); 331 1.1 mrg check_set_sj (); 332 1.1 mrg check_set_sj_2exp (); 333 1.1.1.5 mrg test_2exp_extreme (); 334 1.1 mrg 335 1.1 mrg tests_end_mpfr (); 336 1.1 mrg return 0; 337 1.1 mrg } 338 1.1 mrg 339 1.1 mrg #endif 340