1 1.1 mrg /* Test file for mpfr_exp10. 2 1.1 mrg 3 1.1.1.6 mrg Copyright 2007-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 mrg #define TEST_FUNCTION mpfr_exp10 26 1.1 mrg #define TEST_RANDOM_EMIN -36 27 1.1 mrg #define TEST_RANDOM_EMAX 36 28 1.1 mrg #include "tgeneric.c" 29 1.1 mrg 30 1.1 mrg static void 31 1.1 mrg special_overflow (void) 32 1.1 mrg { 33 1.1 mrg mpfr_t x, y; 34 1.1 mrg int inex; 35 1.1 mrg mpfr_exp_t emin, emax; 36 1.1 mrg 37 1.1 mrg emin = mpfr_get_emin (); 38 1.1 mrg emax = mpfr_get_emax (); 39 1.1 mrg 40 1.1 mrg set_emin (-125); 41 1.1 mrg set_emax (128); 42 1.1 mrg 43 1.1 mrg mpfr_init2 (x, 24); 44 1.1 mrg mpfr_init2 (y, 24); 45 1.1 mrg 46 1.1 mrg mpfr_set_str_binary (x, "0.101100100000000000110100E15"); 47 1.1 mrg inex = mpfr_exp10 (y, x, MPFR_RNDN); 48 1.1 mrg if (!mpfr_inf_p (y) || inex <= 0) 49 1.1 mrg { 50 1.1 mrg printf ("Overflow error.\n"); 51 1.1 mrg mpfr_dump (y); 52 1.1 mrg printf ("inex = %d\n", inex); 53 1.1 mrg exit (1); 54 1.1 mrg } 55 1.1 mrg 56 1.1 mrg mpfr_clear (y); 57 1.1 mrg mpfr_clear (x); 58 1.1 mrg set_emin (emin); 59 1.1 mrg set_emax (emax); 60 1.1 mrg } 61 1.1 mrg 62 1.1 mrg static void 63 1.1 mrg emax_m_eps (void) 64 1.1 mrg { 65 1.1 mrg if (mpfr_get_emax () <= LONG_MAX) 66 1.1 mrg { 67 1.1 mrg mpfr_t x, y; 68 1.1 mrg int inex, ov; 69 1.1 mrg 70 1.1 mrg mpfr_init2 (x, sizeof(mpfr_exp_t) * CHAR_BIT * 4); 71 1.1 mrg mpfr_init2 (y, 8); 72 1.1 mrg mpfr_set_si (x, mpfr_get_emax (), MPFR_RNDN); 73 1.1 mrg 74 1.1 mrg mpfr_clear_flags (); 75 1.1 mrg inex = mpfr_exp10 (y, x, MPFR_RNDN); 76 1.1 mrg ov = mpfr_overflow_p (); 77 1.1 mrg if (!ov || !mpfr_inf_p (y) || inex <= 0) 78 1.1 mrg { 79 1.1 mrg printf ("Overflow error for x = emax, MPFR_RNDN.\n"); 80 1.1 mrg mpfr_dump (y); 81 1.1 mrg printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no "); 82 1.1 mrg exit (1); 83 1.1 mrg } 84 1.1 mrg 85 1.1 mrg mpfr_clear (x); 86 1.1 mrg mpfr_clear (y); 87 1.1 mrg } 88 1.1 mrg } 89 1.1 mrg 90 1.1 mrg static void 91 1.1 mrg exp_range (void) 92 1.1 mrg { 93 1.1 mrg mpfr_t x; 94 1.1 mrg mpfr_exp_t emin; 95 1.1 mrg 96 1.1 mrg emin = mpfr_get_emin (); 97 1.1 mrg set_emin (3); 98 1.1 mrg mpfr_init2 (x, 16); 99 1.1 mrg mpfr_set_ui (x, 4, MPFR_RNDN); 100 1.1 mrg mpfr_exp10 (x, x, MPFR_RNDN); 101 1.1 mrg set_emin (emin); 102 1.1 mrg if (mpfr_nan_p (x) || mpfr_cmp_ui (x, 10000) != 0) 103 1.1 mrg { 104 1.1 mrg printf ("Error in mpfr_exp10 for x = 4, with emin = 3\n"); 105 1.1 mrg printf ("Expected 10000, got "); 106 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); 107 1.1 mrg printf ("\n"); 108 1.1 mrg exit (1); 109 1.1 mrg } 110 1.1 mrg mpfr_clear (x); 111 1.1 mrg } 112 1.1 mrg 113 1.1 mrg static void 114 1.1 mrg overfl_exp10_0 (void) 115 1.1 mrg { 116 1.1 mrg mpfr_t x, y; 117 1.1 mrg int emax, i, inex, rnd, err = 0; 118 1.1 mrg mpfr_exp_t old_emax; 119 1.1 mrg 120 1.1 mrg old_emax = mpfr_get_emax (); 121 1.1 mrg 122 1.1 mrg mpfr_init2 (x, 8); 123 1.1 mrg mpfr_init2 (y, 8); 124 1.1 mrg 125 1.1 mrg for (emax = -1; emax <= 0; emax++) 126 1.1 mrg { 127 1.1 mrg mpfr_set_ui_2exp (y, 1, emax, MPFR_RNDN); 128 1.1 mrg mpfr_nextbelow (y); 129 1.1 mrg set_emax (emax); /* 1 is not representable. */ 130 1.1 mrg /* and if emax < 0, 1 - eps is not representable either. */ 131 1.1 mrg for (i = -1; i <= 1; i++) 132 1.1 mrg RND_LOOP (rnd) 133 1.1 mrg { 134 1.1 mrg mpfr_set_si_2exp (x, i, -512 * ABS (i), MPFR_RNDN); 135 1.1 mrg mpfr_clear_flags (); 136 1.1 mrg inex = mpfr_exp10 (x, x, (mpfr_rnd_t) rnd); 137 1.1 mrg if ((i >= 0 || emax < 0 || rnd == MPFR_RNDN || rnd == MPFR_RNDU) && 138 1.1 mrg ! mpfr_overflow_p ()) 139 1.1 mrg { 140 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n" 141 1.1 mrg " The overflow flag is not set.\n", 142 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 143 1.1 mrg err = 1; 144 1.1 mrg } 145 1.1 mrg if (rnd == MPFR_RNDZ || rnd == MPFR_RNDD) 146 1.1 mrg { 147 1.1 mrg if (inex >= 0) 148 1.1 mrg { 149 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n" 150 1.1 mrg " The inexact value must be negative.\n", 151 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 152 1.1 mrg err = 1; 153 1.1 mrg } 154 1.1 mrg if (! mpfr_equal_p (x, y)) 155 1.1 mrg { 156 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n" 157 1.1.1.4 mrg " Got ", i, 158 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 159 1.1.1.4 mrg mpfr_dump (x); 160 1.1.1.4 mrg printf (" instead of 0.11111111E%d.\n", emax); 161 1.1 mrg err = 1; 162 1.1 mrg } 163 1.1 mrg } 164 1.1.1.4 mrg else if (rnd != MPFR_RNDF) 165 1.1 mrg { 166 1.1 mrg if (inex <= 0) 167 1.1 mrg { 168 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n" 169 1.1 mrg " The inexact value must be positive.\n", 170 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 171 1.1 mrg err = 1; 172 1.1 mrg } 173 1.1.1.4 mrg if (! (mpfr_inf_p (x) && MPFR_IS_POS (x))) 174 1.1 mrg { 175 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n" 176 1.1.1.4 mrg " Got ", i, 177 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 178 1.1.1.4 mrg mpfr_dump (x); 179 1.1.1.4 mrg printf (" instead of +Inf.\n"); 180 1.1 mrg err = 1; 181 1.1 mrg } 182 1.1 mrg } 183 1.1 mrg } 184 1.1 mrg set_emax (old_emax); 185 1.1 mrg } 186 1.1 mrg 187 1.1 mrg if (err) 188 1.1 mrg exit (1); 189 1.1 mrg mpfr_clear (x); 190 1.1 mrg mpfr_clear (y); 191 1.1 mrg } 192 1.1 mrg 193 1.1.1.7 mrg /* Bug in mpfr_pow_general found by ofuf_thresholds (on 2023-02-13 for 194 1.1.1.7 mrg a 32-bit exponent, changed on 2023-03-06 for a 64-bit exponent too), 195 1.1.1.7 mrg fixed in commit b62966df913f73f08b3c5252e1d0c702bc20442f. 196 1.1.1.7 mrg With a 32-bit exponent, failure for i=0. 197 1.1.1.7 mrg expected 0.1111E1073741823 198 1.1.1.7 mrg got @Inf@ 199 1.1.1.7 mrg expected flags = inexact (8) 200 1.1.1.7 mrg got flags = overflow inexact (10) 201 1.1.1.7 mrg With a 64-bit exponent, failure for i=1. 202 1.1.1.7 mrg expected 0.11111111111111111111111E4611686018427387903 203 1.1.1.7 mrg got @Inf@ 204 1.1.1.7 mrg expected flags = inexact (8) 205 1.1.1.7 mrg got flags = overflow inexact (10) 206 1.1.1.7 mrg Note: ofuf_thresholds was added to the master branch, but for the 207 1.1.1.7 mrg time being, there are issues with these tests. 208 1.1.1.7 mrg */ 209 1.1.1.7 mrg static void 210 1.1.1.7 mrg bug20230213 (void) 211 1.1.1.7 mrg { 212 1.1.1.7 mrg const char *s[2] = { 213 1.1.1.7 mrg "0x1.34413504b3ccdbd5dd8p+28", 214 1.1.1.7 mrg "0x1.34413509f79fef2c4e0dd14a7ae0ecfbacdbp+60" 215 1.1.1.7 mrg }; 216 1.1.1.7 mrg mpfr_t x1, x2, y1, y2; 217 1.1.1.7 mrg mpfr_prec_t px[2] = { 74, 147 }; 218 1.1.1.7 mrg mpfr_prec_t py[2] = { 4, 23 }; 219 1.1.1.7 mrg mpfr_exp_t old_emax, emax; 220 1.1.1.7 mrg mpfr_flags_t flags1, flags2; 221 1.1.1.7 mrg int i; 222 1.1.1.7 mrg 223 1.1.1.7 mrg old_emax = mpfr_get_emax (); 224 1.1.1.7 mrg 225 1.1.1.7 mrg for (i = 0; i < 2; i++) 226 1.1.1.7 mrg { 227 1.1.1.7 mrg if (i != 0) 228 1.1.1.7 mrg set_emax (MPFR_EMAX_MAX); 229 1.1.1.7 mrg 230 1.1.1.7 mrg emax = mpfr_get_emax (); 231 1.1.1.7 mrg 232 1.1.1.7 mrg mpfr_inits2 (px[i], x1, x2, (mpfr_ptr) 0); 233 1.1.1.7 mrg mpfr_inits2 (py[i], y1, y2, (mpfr_ptr) 0); 234 1.1.1.7 mrg 235 1.1.1.7 mrg mpfr_setmax (y1, emax); 236 1.1.1.7 mrg mpfr_log10 (x1, y1, MPFR_RNDD); 237 1.1.1.7 mrg mpfr_set_str (x2, s[i], 0, MPFR_RNDN); 238 1.1.1.7 mrg /* For i == 0, emax == 2^30, so that the value can be checked. 239 1.1.1.7 mrg For i != 0, check the value for the case emax == 2^62. 240 1.1.1.7 mrg The "0UL" ensures that the shifts are valid. */ 241 1.1.1.7 mrg if (i == 0 || (((0UL + MPFR_EMAX_MAX) >> 31) >> 30) == 1) 242 1.1.1.7 mrg { 243 1.1.1.7 mrg /* printf ("Checking x1 for i=%d\n", i); */ 244 1.1.1.7 mrg MPFR_ASSERTN (mpfr_equal_p (x1, x2)); 245 1.1.1.7 mrg } 246 1.1.1.7 mrg 247 1.1.1.7 mrg /* Let MAXF be the maximum finite value (y1 above). 248 1.1.1.7 mrg Since x1 < log10(MAXF), one should have exp10(x1) < MAXF, and 249 1.1.1.7 mrg therefore, y2 = RU(exp10(x1)) <= RU(MAXF) = MAXF (no overflow). */ 250 1.1.1.7 mrg flags1 = MPFR_FLAGS_INEXACT; 251 1.1.1.7 mrg mpfr_clear_flags (); 252 1.1.1.7 mrg mpfr_exp10 (y2, x1, MPFR_RNDU); 253 1.1.1.7 mrg flags2 = __gmpfr_flags; 254 1.1.1.7 mrg 255 1.1.1.7 mrg if (! (mpfr_lessequal_p (y2, y1) && flags2 == flags1)) 256 1.1.1.7 mrg { 257 1.1.1.7 mrg printf ("Error in bug20230213 for i=%d\n", i); 258 1.1.1.7 mrg printf ("emax = %" MPFR_EXP_FSPEC "d\n", (mpfr_eexp_t) emax); 259 1.1.1.7 mrg printf ("expected "); mpfr_dump (y1); 260 1.1.1.7 mrg printf ("got "); mpfr_dump (y2); 261 1.1.1.7 mrg printf ("expected flags ="); 262 1.1.1.7 mrg flags_out (flags1); 263 1.1.1.7 mrg printf ("got flags ="); 264 1.1.1.7 mrg flags_out (flags2); 265 1.1.1.7 mrg exit (1); 266 1.1.1.7 mrg } 267 1.1.1.7 mrg 268 1.1.1.7 mrg mpfr_clears (x1, x2, y1, y2, (mpfr_ptr) 0); 269 1.1.1.7 mrg } 270 1.1.1.7 mrg 271 1.1.1.7 mrg set_emax (old_emax); 272 1.1.1.7 mrg } 273 1.1.1.7 mrg 274 1.1.1.7 mrg /* Bug in mpfr_pow_general in precision 1 in the particular case of 275 1.1.1.7 mrg rounding to nearest, z * 2^k = 2^(emin - 2) and real result larger 276 1.1.1.7 mrg than this value; fixed in ff5012b61d5e5fee5156c57b8aa8fc1739c2a771 277 1.1.1.7 mrg (which is simplified in 4f5de980be290687ac1409aa02873e9e0dd1a030); 278 1.1.1.7 mrg initially found by ofuf_thresholds (though the test was incorrect). 279 1.1.1.7 mrg With a 32-bit exponent, failure for i=0. 280 1.1.1.7 mrg With a 64-bit exponent, failure for i=1. 281 1.1.1.7 mrg The result was correct, but the underflow flag was missing. 282 1.1.1.7 mrg Note: ofuf_thresholds was added to the master branch, but for the 283 1.1.1.7 mrg time being, there are issues with these tests. 284 1.1.1.7 mrg */ 285 1.1.1.7 mrg static void 286 1.1.1.7 mrg bug20230427 (void) 287 1.1.1.7 mrg { 288 1.1.1.7 mrg const char *s[2] = { 289 1.1.1.7 mrg "-0.1001101000100000100110101000011E29", 290 1.1.1.7 mrg "-0.100110100010000010011010100001001111101111001111111101111001101E61" 291 1.1.1.7 mrg }; 292 1.1.1.7 mrg mpfr_t x, y, z, t1, t2; 293 1.1.1.7 mrg mpfr_exp_t old_emin; 294 1.1.1.7 mrg mpfr_flags_t flags, ex_flags; 295 1.1.1.7 mrg int i, inex; 296 1.1.1.7 mrg 297 1.1.1.7 mrg old_emin = mpfr_get_emin (); 298 1.1.1.7 mrg 299 1.1.1.7 mrg mpfr_init2 (x, 63); 300 1.1.1.7 mrg mpfr_inits2 (1, y, z, (mpfr_ptr) 0); 301 1.1.1.7 mrg mpfr_inits2 (128, t1, t2, (mpfr_ptr) 0); 302 1.1.1.7 mrg 303 1.1.1.7 mrg for (i = 0; i < 2; i++) 304 1.1.1.7 mrg { 305 1.1.1.7 mrg if (i == 0) 306 1.1.1.7 mrg { 307 1.1.1.7 mrg /* Basic check: the default emin should be -2^30 (exactly). */ 308 1.1.1.7 mrg if (mpfr_get_emin () != -1073741823) 309 1.1.1.7 mrg abort (); 310 1.1.1.7 mrg } 311 1.1.1.7 mrg else 312 1.1.1.7 mrg { 313 1.1.1.7 mrg /* This test assumes that MPFR_EMIN_MIN = -2^62 (exactly). 314 1.1.1.7 mrg The "0UL" ensures that the shifts are valid. */ 315 1.1.1.7 mrg if ((((0UL - MPFR_EMIN_MIN) >> 31) >> 30) != 1) 316 1.1.1.7 mrg break; 317 1.1.1.7 mrg 318 1.1.1.7 mrg set_emin (MPFR_EMIN_MIN); 319 1.1.1.7 mrg } 320 1.1.1.7 mrg 321 1.1.1.7 mrg mpfr_set_str_binary (x, s[i]); 322 1.1.1.7 mrg 323 1.1.1.7 mrg /* We will test 10^x rounded to nearest in precision 1. 324 1.1.1.7 mrg Check that 2^(emin - 2) < 10^x < (3/2) * 2^(emin - 2). 325 1.1.1.7 mrg This is approximate, but by outputting the values, one can check 326 1.1.1.7 mrg that one is not too close to the boundaries: 327 1.1.1.7 mrg emin - 2 = -4611686018427387905 328 1.1.1.7 mrg log2(10^x) ~= -4611686018427387904.598 329 1.1.1.7 mrg emin - 2 + log2(3/2) ~= -4611686018427387904.415 330 1.1.1.7 mrg Thus the result should be the smallest positive number 2^(emin - 1) 331 1.1.1.7 mrg because 10^x is closer to this number than to 0, the midpoint being 332 1.1.1.7 mrg 2^(emin - 2). And there should be an underflow in precision 1 because 333 1.1.1.7 mrg the result rounded to nearest in an unbounded exponent range should 334 1.1.1.7 mrg have been 2^(emin - 2), the midpoint being (3/2) * 2^(emin - 2). 335 1.1.1.7 mrg */ 336 1.1.1.7 mrg mpfr_set_ui (t1, 10, MPFR_RNDN); 337 1.1.1.7 mrg mpfr_log2 (t2, t1, MPFR_RNDN); 338 1.1.1.7 mrg mpfr_mul (t1, t2, x, MPFR_RNDN); 339 1.1.1.7 mrg inex = mpfr_set_exp_t (t2, mpfr_get_emin () - 2, MPFR_RNDN); 340 1.1.1.7 mrg MPFR_ASSERTN (inex == 0); 341 1.1.1.7 mrg MPFR_ASSERTN (mpfr_greater_p (t1, t2)); /* log2(10^x) > emin - 2 */ 342 1.1.1.7 mrg inex = mpfr_sub (t1, t1, t2, MPFR_RNDN); 343 1.1.1.7 mrg MPFR_ASSERTN (inex == 0); 344 1.1.1.7 mrg mpfr_set_ui (t2, 3, MPFR_RNDN); 345 1.1.1.7 mrg mpfr_log2 (t2, t2, MPFR_RNDN); 346 1.1.1.7 mrg mpfr_sub_ui (t2, t2, 1, MPFR_RNDN); /* log2(3/2) */ 347 1.1.1.7 mrg MPFR_ASSERTN (mpfr_less_p (t1, t2)); 348 1.1.1.7 mrg 349 1.1.1.7 mrg mpfr_clear_flags (); 350 1.1.1.7 mrg mpfr_exp10 (y, x, MPFR_RNDN); 351 1.1.1.7 mrg flags = __gmpfr_flags; 352 1.1.1.7 mrg ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT; 353 1.1.1.7 mrg 354 1.1.1.7 mrg mpfr_setmin (z, mpfr_get_emin ()); /* z = 0.1@emin */ 355 1.1.1.7 mrg if (! (mpfr_equal_p (y, z) && flags == ex_flags)) 356 1.1.1.7 mrg { 357 1.1.1.7 mrg printf ("Error in bug20230427 for i=%d\n", i); 358 1.1.1.7 mrg printf ("expected "); mpfr_dump (z); 359 1.1.1.7 mrg printf ("got "); mpfr_dump (y); 360 1.1.1.7 mrg printf ("emin = %" MPFR_EXP_FSPEC "d\n", 361 1.1.1.7 mrg (mpfr_eexp_t) mpfr_get_emin ()); 362 1.1.1.7 mrg printf ("expected flags ="); 363 1.1.1.7 mrg flags_out (ex_flags); 364 1.1.1.7 mrg printf ("got flags ="); 365 1.1.1.7 mrg flags_out (flags); 366 1.1.1.7 mrg exit (1); 367 1.1.1.7 mrg } 368 1.1.1.7 mrg } 369 1.1.1.7 mrg 370 1.1.1.7 mrg mpfr_clears (x, y, z, t1, t2, (mpfr_ptr) 0); 371 1.1.1.7 mrg set_emin (old_emin); 372 1.1.1.7 mrg } 373 1.1.1.7 mrg 374 1.1 mrg int 375 1.1 mrg main (int argc, char *argv[]) 376 1.1 mrg { 377 1.1 mrg mpfr_t x, y; 378 1.1 mrg mpfr_exp_t emin, emax; 379 1.1 mrg int inex, ov; 380 1.1 mrg 381 1.1 mrg tests_start_mpfr (); 382 1.1 mrg 383 1.1.1.7 mrg bug20230213 (); 384 1.1.1.7 mrg bug20230427 (); 385 1.1.1.7 mrg 386 1.1 mrg special_overflow (); 387 1.1 mrg emax_m_eps (); 388 1.1 mrg exp_range (); 389 1.1 mrg 390 1.1 mrg mpfr_init (x); 391 1.1 mrg mpfr_init (y); 392 1.1 mrg 393 1.1 mrg mpfr_set_ui (x, 4, MPFR_RNDN); 394 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN); 395 1.1 mrg if (mpfr_cmp_ui (y, 10000) != 0) 396 1.1 mrg { 397 1.1 mrg printf ("Error for 10^4, MPFR_RNDN\n"); 398 1.1 mrg exit (1); 399 1.1 mrg } 400 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDD); 401 1.1 mrg if (mpfr_cmp_ui (y, 10000) != 0) 402 1.1 mrg { 403 1.1 mrg printf ("Error for 10^4, MPFR_RNDD\n"); 404 1.1 mrg exit (1); 405 1.1 mrg } 406 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDU); 407 1.1 mrg if (mpfr_cmp_ui (y, 10000) != 0) 408 1.1 mrg { 409 1.1 mrg printf ("Error for 10^4, MPFR_RNDU\n"); 410 1.1 mrg exit (1); 411 1.1 mrg } 412 1.1 mrg 413 1.1 mrg mpfr_set_prec (x, 10); 414 1.1 mrg mpfr_set_prec (y, 10); 415 1.1 mrg /* save emin */ 416 1.1 mrg emin = mpfr_get_emin (); 417 1.1 mrg set_emin (-11); 418 1.1 mrg mpfr_set_si (x, -4, MPFR_RNDN); 419 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN); 420 1.1.1.4 mrg if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y)) 421 1.1 mrg { 422 1.1 mrg printf ("Error for emin = -11, x = -4, RNDN\n"); 423 1.1 mrg printf ("Expected +0\n"); 424 1.1.1.4 mrg printf ("Got "); mpfr_dump (y); 425 1.1 mrg exit (1); 426 1.1 mrg } 427 1.1 mrg /* restore emin */ 428 1.1 mrg set_emin (emin); 429 1.1 mrg 430 1.1 mrg /* save emax */ 431 1.1 mrg emax = mpfr_get_emax (); 432 1.1 mrg set_emax (13); 433 1.1 mrg mpfr_set_ui (x, 4, MPFR_RNDN); 434 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN); 435 1.1 mrg if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0) 436 1.1 mrg { 437 1.1 mrg printf ("Error for emax = 13, x = 4, RNDN\n"); 438 1.1 mrg printf ("Expected +inf\n"); 439 1.1.1.4 mrg printf ("Got "); mpfr_dump (y); 440 1.1 mrg exit (1); 441 1.1 mrg } 442 1.1 mrg /* restore emax */ 443 1.1 mrg set_emax (emax); 444 1.1 mrg 445 1.1 mrg MPFR_SET_INF (x); 446 1.1 mrg MPFR_SET_POS (x); 447 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN); 448 1.1 mrg if (!MPFR_IS_INF (y)) 449 1.1 mrg { 450 1.1 mrg printf ("evaluation of function in INF does not return INF\n"); 451 1.1 mrg exit (1); 452 1.1 mrg } 453 1.1 mrg 454 1.1 mrg MPFR_CHANGE_SIGN (x); 455 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN); 456 1.1 mrg if (!MPFR_IS_ZERO (y)) 457 1.1 mrg { 458 1.1 mrg printf ("evaluation of function in -INF does not return 0\n"); 459 1.1 mrg exit (1); 460 1.1 mrg } 461 1.1 mrg 462 1.1 mrg MPFR_SET_NAN (x); 463 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN); 464 1.1 mrg if (!MPFR_IS_NAN (y)) 465 1.1 mrg { 466 1.1 mrg printf ("evaluation of function in NaN does not return NaN\n"); 467 1.1 mrg exit (1); 468 1.1 mrg } 469 1.1 mrg 470 1.1 mrg if ((mpfr_uexp_t) 8 << 31 != 0 || 471 1.1 mrg mpfr_get_emax () <= (mpfr_uexp_t) 100000 * 100000) 472 1.1 mrg { 473 1.1 mrg /* emax <= 10000000000 */ 474 1.1 mrg mpfr_set_prec (x, 40); 475 1.1 mrg mpfr_set_prec (y, 40); 476 1.1 mrg mpfr_set_str (x, "3010299957", 10, MPFR_RNDN); 477 1.1 mrg mpfr_clear_flags (); 478 1.1 mrg inex = mpfr_exp10 (y, x, MPFR_RNDN); 479 1.1 mrg ov = mpfr_overflow_p (); 480 1.1 mrg if (!(MPFR_IS_INF (y) && MPFR_IS_POS (y) && ov)) 481 1.1 mrg { 482 1.1 mrg printf ("Overflow error for x = 3010299957, MPFR_RNDN.\n"); 483 1.1 mrg mpfr_dump (y); 484 1.1 mrg printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no "); 485 1.1 mrg exit (1); 486 1.1 mrg } 487 1.1 mrg } 488 1.1 mrg 489 1.1.1.4 mrg test_generic (MPFR_PREC_MIN, 100, 100); 490 1.1 mrg 491 1.1 mrg mpfr_clear (x); 492 1.1 mrg mpfr_clear (y); 493 1.1 mrg 494 1.1 mrg overfl_exp10_0 (); 495 1.1 mrg 496 1.1 mrg data_check ("data/exp10", mpfr_exp10, "mpfr_exp10"); 497 1.1.1.7 mrg bad_cases (mpfr_exp10, mpfr_log10, "mpfr_exp10", 498 1.1.1.7 mrg 0, -256, 255, 4, 128, 800, 50); 499 1.1 mrg 500 1.1 mrg tests_end_mpfr (); 501 1.1 mrg return 0; 502 1.1 mrg } 503