source:
patches/mpfr-3.1.2-fixes-1.patch@
e680587
Last change on this file since e680587 was d42579b, checked in by , 11 years ago | |
---|---|
|
|
File size: 22.3 KB |
-
mpfr-3.1.2
Submitted By: William Harrington (kb0iic at cross-lfs dot org) Date: 2013-11-11 Initial Package Version: 3.1.2 Origin: Upstream Upstream Status: Applied Description: Contains all upstream patches of mpfr current. diff -Naur mpfr-3.1.2.orig/PATCHES mpfr-3.1.2/PATCHES
old new 1 clang-divby0 2 fits-smallneg 3 exp_2 -
mpfr-3.1.2
diff -Naur mpfr-3.1.2.orig/VERSION mpfr-3.1.2/VERSION
old new 1 3.1.2 1 3.1.2-p3 -
src/exp_2.c
diff -Naur mpfr-3.1.2.orig/src/exp_2.c mpfr-3.1.2/src/exp_2.c
old new 204 204 for (k = 0; k < K; k++) 205 205 { 206 206 mpz_mul (ss, ss, ss); 207 exps <<= 1;207 exps *= 2; 208 208 exps += mpz_normalize (ss, ss, q); 209 209 } 210 210 mpfr_set_z (s, ss, MPFR_RNDN); -
src/fits_u.h
diff -Naur mpfr-3.1.2.orig/src/fits_u.h mpfr-3.1.2/src/fits_u.h
old new 32 32 int res; 33 33 34 34 if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (f))) 35 /* Zero always fit */ 36 return MPFR_IS_ZERO (f) ? 1 : 0; 37 else if (MPFR_IS_NEG (f)) 38 /* Negative numbers don't fit */ 39 return 0; 40 /* now it fits if 41 (a) f <= MAXIMUM 42 (b) round(f, prec(slong), rnd) <= MAXIMUM */ 35 return MPFR_IS_ZERO (f) ? 1 : 0; /* Zero always fits */ 43 36 44 37 e = MPFR_GET_EXP (f); 45 38 39 if (MPFR_IS_NEG (f)) 40 return e >= 1 ? 0 /* f <= -1 does not fit */ 41 : rnd != MPFR_RNDN ? MPFR_IS_LIKE_RNDU (rnd, -1) /* directed mode */ 42 : e < 0 ? 1 /* f > -1/2 fits in MPFR_RNDN */ 43 : mpfr_powerof2_raw(f); /* -1/2 fits, -1 < f < -1/2 don't */ 44 45 /* Now it fits if 46 (a) f <= MAXIMUM 47 (b) round(f, prec(slong), rnd) <= MAXIMUM */ 48 46 49 /* first compute prec(MAXIMUM); fits in an int */ 47 50 for (s = MAXIMUM, prec = 0; s != 0; s /= 2, prec ++); 48 51 -
src/fits_uintmax.c
diff -Naur mpfr-3.1.2.orig/src/fits_uintmax.c mpfr-3.1.2/src/fits_uintmax.c
old new 27 27 #include "mpfr-intmax.h" 28 28 #include "mpfr-impl.h" 29 29 30 #ifdef _MPFR_H_HAVE_INTMAX_T 31 32 /* We can't use fits_u.h <= mpfr_cmp_ui */ 33 int 34 mpfr_fits_uintmax_p (mpfr_srcptr f, mpfr_rnd_t rnd) 35 { 36 mpfr_exp_t e; 37 int prec; 38 uintmax_t s; 39 mpfr_t x; 40 int res; 41 42 if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (f))) 43 /* Zero always fit */ 44 return MPFR_IS_ZERO (f) ? 1 : 0; 45 else if (MPFR_IS_NEG (f)) 46 /* Negative numbers don't fit */ 47 return 0; 48 /* now it fits if 49 (a) f <= MAXIMUM 50 (b) round(f, prec(slong), rnd) <= MAXIMUM */ 51 52 e = MPFR_GET_EXP (f); 30 /* Note: though mpfr-impl.h is included in fits_u.h, we also include it 31 above so that it gets included even when _MPFR_H_HAVE_INTMAX_T is not 32 defined; this is necessary to avoid an empty translation unit, which 33 is forbidden by ISO C. Without this, a failing test can be reproduced 34 by creating an invalid stdint.h somewhere in the default include path 35 and by compiling MPFR with "gcc -ansi -pedantic-errors". */ 53 36 54 /* first compute prec(MAXIMUM); fits in an int */ 55 for (s = MPFR_UINTMAX_MAX, prec = 0; s != 0; s /= 2, prec ++); 56 57 /* MAXIMUM needs prec bits, i.e. MAXIMUM = 2^prec - 1 */ 58 59 /* if e <= prec - 1, then f < 2^(prec-1) < MAXIMUM */ 60 if (e <= prec - 1) 61 return 1; 62 63 /* if e >= prec + 1, then f >= 2^prec > MAXIMUM */ 64 if (e >= prec + 1) 65 return 0; 37 #ifdef _MPFR_H_HAVE_INTMAX_T 66 38 67 MPFR_ASSERTD (e == prec); 39 #define FUNCTION mpfr_fits_uintmax_p 40 #define MAXIMUM MPFR_UINTMAX_MAX 41 #define TYPE uintmax_t 68 42 69 /* hard case: first round to prec bits, then check */ 70 mpfr_init2 (x, prec); 71 mpfr_set (x, f, rnd); 72 res = MPFR_GET_EXP (x) == e; 73 mpfr_clear (x); 74 return res; 75 } 43 #include "fits_u.h" 76 44 77 45 #endif -
src/mpfr-impl.h
diff -Naur mpfr-3.1.2.orig/src/mpfr-impl.h mpfr-3.1.2/src/mpfr-impl.h
old new 468 468 #define MPFR_LIMBS_PER_FLT ((IEEE_FLT_MANT_DIG-1)/GMP_NUMB_BITS+1) 469 469 470 470 /* Visual C++ doesn't support +1.0/0.0, -1.0/0.0 and 0.0/0.0 471 at compile time. */ 472 #if defined(_MSC_VER) && defined(_WIN32) && (_MSC_VER >= 1200) 471 at compile time. 472 Clang with -fsanitize=undefined is a bit similar due to a bug: 473 http://llvm.org/bugs/show_bug.cgi?id=17381 474 but even without its sanitizer, it may be better to use the 475 double_zero version until IEEE 754 division by zero is properly 476 supported: 477 http://llvm.org/bugs/show_bug.cgi?id=17000 478 */ 479 #if (defined(_MSC_VER) && defined(_WIN32) && (_MSC_VER >= 1200)) || \ 480 defined(__clang__) 473 481 static double double_zero = 0.0; 474 482 # define DBL_NAN (double_zero/double_zero) 475 483 # define DBL_POS_INF ((double) 1.0/double_zero) … … 501 509 (with Xcode 2.4.1, i.e. the latest one). */ 502 510 #define LVALUE(x) (&(x) == &(x) || &(x) != &(x)) 503 511 #define DOUBLE_ISINF(x) (LVALUE(x) && ((x) > DBL_MAX || (x) < -DBL_MAX)) 512 /* The DOUBLE_ISNAN(x) macro is also valid on long double x 513 (assuming that the compiler isn't too broken). */ 504 514 #ifdef MPFR_NANISNAN 505 515 /* Avoid MIPSpro / IRIX64 / gcc -ffast-math (incorrect) optimizations. 506 516 The + must not be replaced by a ||. With gcc -ffast-math, NaN is -
src/mpfr.h
diff -Naur mpfr-3.1.2.orig/src/mpfr.h mpfr-3.1.2/src/mpfr.h
old new 27 27 #define MPFR_VERSION_MAJOR 3 28 28 #define MPFR_VERSION_MINOR 1 29 29 #define MPFR_VERSION_PATCHLEVEL 2 30 #define MPFR_VERSION_STRING "3.1.2 "30 #define MPFR_VERSION_STRING "3.1.2-p3" 31 31 32 32 /* Macros dealing with MPFR VERSION */ 33 33 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -
src/version.c
diff -Naur mpfr-3.1.2.orig/src/version.c mpfr-3.1.2/src/version.c
old new 25 25 const char * 26 26 mpfr_get_version (void) 27 27 { 28 return "3.1.2 ";28 return "3.1.2-p3"; 29 29 } -
tests/tfits.c
diff -Naur mpfr-3.1.2.orig/tests/tfits.c mpfr-3.1.2/tests/tfits.c
old new 33 33 #include "mpfr-intmax.h" 34 34 #include "mpfr-test.h" 35 35 36 #define ERROR1 { printf("Initial error for x="); mpfr_dump(x); exit(1); } 37 #define ERROR2 { printf("Error for x="); mpfr_dump(x); exit(1); } 36 #define ERROR1(N) \ 37 do \ 38 { \ 39 printf("Error %d for rnd = %s and x = ", N, \ 40 mpfr_print_rnd_mode ((mpfr_rnd_t) r)); \ 41 mpfr_dump(x); \ 42 exit(1); \ 43 } \ 44 while (0) 38 45 39 46 static void check_intmax (void); 40 47 41 48 int 42 49 main (void) 43 50 { 44 mpfr_t x; 51 mpfr_t x, y; 52 int i, r; 45 53 46 54 tests_start_mpfr (); 47 55 48 56 mpfr_init2 (x, 256); 57 mpfr_init2 (y, 8); 49 58 50 /* Check NAN */ 51 mpfr_set_nan (x); 52 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 53 ERROR1; 54 if (mpfr_fits_slong_p (x, MPFR_RNDN)) 55 ERROR1; 56 if (mpfr_fits_uint_p (x, MPFR_RNDN)) 57 ERROR1; 58 if (mpfr_fits_sint_p (x, MPFR_RNDN)) 59 ERROR1; 60 if (mpfr_fits_ushort_p (x, MPFR_RNDN)) 61 ERROR1; 62 if (mpfr_fits_sshort_p (x, MPFR_RNDN)) 63 ERROR1; 64 65 /* Check INF */ 66 mpfr_set_inf (x, 1); 67 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 68 ERROR1; 69 if (mpfr_fits_slong_p (x, MPFR_RNDN)) 70 ERROR1; 71 if (mpfr_fits_uint_p (x, MPFR_RNDN)) 72 ERROR1; 73 if (mpfr_fits_sint_p (x, MPFR_RNDN)) 74 ERROR1; 75 if (mpfr_fits_ushort_p (x, MPFR_RNDN)) 76 ERROR1; 77 if (mpfr_fits_sshort_p (x, MPFR_RNDN)) 78 ERROR1; 79 80 /* Check Zero */ 81 MPFR_SET_ZERO (x); 82 if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) 83 ERROR2; 84 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 85 ERROR2; 86 if (!mpfr_fits_uint_p (x, MPFR_RNDN)) 87 ERROR2; 88 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 89 ERROR2; 90 if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) 91 ERROR2; 92 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 93 ERROR2; 94 95 /* Check small op */ 96 mpfr_set_str1 (x, "1@-1"); 97 if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) 98 ERROR2; 99 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 100 ERROR2; 101 if (!mpfr_fits_uint_p (x, MPFR_RNDN)) 102 ERROR2; 103 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 104 ERROR2; 105 if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) 106 ERROR2; 107 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 108 ERROR2; 109 110 /* Check 17 */ 111 mpfr_set_ui (x, 17, MPFR_RNDN); 112 if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) 113 ERROR2; 114 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 115 ERROR2; 116 if (!mpfr_fits_uint_p (x, MPFR_RNDN)) 117 ERROR2; 118 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 119 ERROR2; 120 if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) 121 ERROR2; 122 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 123 ERROR2; 124 125 /* Check all other values */ 126 mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); 127 mpfr_mul_2exp (x, x, 1, MPFR_RNDN); 128 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 129 ERROR1; 130 if (mpfr_fits_slong_p (x, MPFR_RNDN)) 131 ERROR1; 132 mpfr_mul_2exp (x, x, 40, MPFR_RNDN); 133 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 134 ERROR1; 135 if (mpfr_fits_uint_p (x, MPFR_RNDN)) 136 ERROR1; 137 if (mpfr_fits_sint_p (x, MPFR_RNDN)) 138 ERROR1; 139 if (mpfr_fits_ushort_p (x, MPFR_RNDN)) 140 ERROR1; 141 if (mpfr_fits_sshort_p (x, MPFR_RNDN)) 142 ERROR1; 143 144 mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); 145 if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) 146 ERROR2; 147 mpfr_set_ui (x, LONG_MAX, MPFR_RNDN); 148 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 149 ERROR2; 150 mpfr_set_ui (x, UINT_MAX, MPFR_RNDN); 151 if (!mpfr_fits_uint_p (x, MPFR_RNDN)) 152 ERROR2; 153 mpfr_set_ui (x, INT_MAX, MPFR_RNDN); 154 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 155 ERROR2; 156 mpfr_set_ui (x, USHRT_MAX, MPFR_RNDN); 157 if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) 158 ERROR2; 159 mpfr_set_ui (x, SHRT_MAX, MPFR_RNDN); 160 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 161 ERROR2; 162 163 mpfr_set_si (x, 1, MPFR_RNDN); 164 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 165 ERROR2; 166 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 167 ERROR2; 168 169 /* Check negative value */ 170 mpfr_set_si (x, -1, MPFR_RNDN); 171 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 172 ERROR2; 173 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 174 ERROR2; 175 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 176 ERROR2; 177 if (mpfr_fits_uint_p (x, MPFR_RNDN)) 178 ERROR1; 179 if (mpfr_fits_ushort_p (x, MPFR_RNDN)) 180 ERROR1; 181 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 182 ERROR1; 59 RND_LOOP (r) 60 { 61 62 /* Check NAN */ 63 mpfr_set_nan (x); 64 if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) 65 ERROR1 (1); 66 if (mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) 67 ERROR1 (2); 68 if (mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) 69 ERROR1 (3); 70 if (mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) 71 ERROR1 (4); 72 if (mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) 73 ERROR1 (5); 74 if (mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) 75 ERROR1 (6); 76 77 /* Check INF */ 78 mpfr_set_inf (x, 1); 79 if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) 80 ERROR1 (7); 81 if (mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) 82 ERROR1 (8); 83 if (mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) 84 ERROR1 (9); 85 if (mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) 86 ERROR1 (10); 87 if (mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) 88 ERROR1 (11); 89 if (mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) 90 ERROR1 (12); 91 92 /* Check Zero */ 93 MPFR_SET_ZERO (x); 94 if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) 95 ERROR1 (13); 96 if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) 97 ERROR1 (14); 98 if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) 99 ERROR1 (15); 100 if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) 101 ERROR1 (16); 102 if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) 103 ERROR1 (17); 104 if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) 105 ERROR1 (18); 106 107 /* Check small positive op */ 108 mpfr_set_str1 (x, "1@-1"); 109 if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) 110 ERROR1 (19); 111 if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) 112 ERROR1 (20); 113 if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) 114 ERROR1 (21); 115 if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) 116 ERROR1 (22); 117 if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) 118 ERROR1 (23); 119 if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) 120 ERROR1 (24); 121 122 /* Check 17 */ 123 mpfr_set_ui (x, 17, MPFR_RNDN); 124 if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) 125 ERROR1 (25); 126 if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) 127 ERROR1 (26); 128 if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) 129 ERROR1 (27); 130 if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) 131 ERROR1 (28); 132 if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) 133 ERROR1 (29); 134 if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) 135 ERROR1 (30); 136 137 /* Check all other values */ 138 mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); 139 mpfr_mul_2exp (x, x, 1, MPFR_RNDN); 140 if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) 141 ERROR1 (31); 142 if (mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) 143 ERROR1 (32); 144 mpfr_mul_2exp (x, x, 40, MPFR_RNDN); 145 if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) 146 ERROR1 (33); 147 if (mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) 148 ERROR1 (34); 149 if (mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) 150 ERROR1 (35); 151 if (mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) 152 ERROR1 (36); 153 if (mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) 154 ERROR1 (37); 155 156 mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); 157 if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r)) 158 ERROR1 (38); 159 mpfr_set_ui (x, LONG_MAX, MPFR_RNDN); 160 if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) 161 ERROR1 (39); 162 mpfr_set_ui (x, UINT_MAX, MPFR_RNDN); 163 if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r)) 164 ERROR1 (40); 165 mpfr_set_ui (x, INT_MAX, MPFR_RNDN); 166 if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) 167 ERROR1 (41); 168 mpfr_set_ui (x, USHRT_MAX, MPFR_RNDN); 169 if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r)) 170 ERROR1 (42); 171 mpfr_set_ui (x, SHRT_MAX, MPFR_RNDN); 172 if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) 173 ERROR1 (43); 174 175 mpfr_set_si (x, 1, MPFR_RNDN); 176 if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) 177 ERROR1 (44); 178 if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) 179 ERROR1 (45); 180 181 /* Check negative op */ 182 for (i = 1; i <= 4; i++) 183 { 184 int inv; 185 186 mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN); 187 mpfr_rint (y, x, (mpfr_rnd_t) r); 188 inv = MPFR_NOTZERO (y); 189 if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r) ^ inv) 190 ERROR1 (46); 191 if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r)) 192 ERROR1 (47); 193 if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r) ^ inv) 194 ERROR1 (48); 195 if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r)) 196 ERROR1 (49); 197 if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r) ^ inv) 198 ERROR1 (50); 199 if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r)) 200 ERROR1 (51); 201 } 202 } 183 203 184 204 mpfr_clear (x); 205 mpfr_clear (y); 185 206 186 207 check_intmax (); 187 208 … … 189 210 return 0; 190 211 } 191 212 192 static void check_intmax (void) 213 static void 214 check_intmax (void) 193 215 { 194 216 #ifdef _MPFR_H_HAVE_INTMAX_T 195 mpfr_t x; 217 mpfr_t x, y; 218 int i, r; 196 219 197 mpfr_init2 (x, sizeof (uintmax_t)*CHAR_BIT); 220 mpfr_init2 (x, sizeof (uintmax_t) * CHAR_BIT); 221 mpfr_init2 (y, 8); 198 222 199 /* Check NAN */ 200 mpfr_set_nan (x); 201 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 202 ERROR1; 203 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 204 ERROR1; 205 206 /* Check INF */ 207 mpfr_set_inf (x, 1); 208 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 209 ERROR1; 210 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 211 ERROR1; 212 213 /* Check Zero */ 214 MPFR_SET_ZERO (x); 215 if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) 216 ERROR2; 217 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 218 ERROR2; 219 220 /* Check small op */ 221 mpfr_set_str1 (x, "1@-1"); 222 if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) 223 ERROR2; 224 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 225 ERROR2; 226 227 /* Check 17 */ 228 mpfr_set_ui (x, 17, MPFR_RNDN); 229 if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) 230 ERROR2; 231 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 232 ERROR2; 233 234 /* Check hugest */ 235 mpfr_set_ui_2exp (x, 42, sizeof (uintmax_t) * 32, MPFR_RNDN); 236 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 237 ERROR1; 238 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 239 ERROR1; 240 241 /* Check all other values */ 242 mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); 243 mpfr_add_ui (x, x, 1, MPFR_RNDN); 244 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 245 ERROR1; 246 mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); 247 if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) 248 ERROR2; 249 mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); 250 mpfr_add_ui (x, x, 1, MPFR_RNDN); 251 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 252 ERROR1; 253 mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); 254 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 255 ERROR2; 256 mpfr_set_sj (x, MPFR_INTMAX_MIN, MPFR_RNDN); 257 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 258 ERROR2; 259 mpfr_sub_ui (x, x, 1, MPFR_RNDN); 260 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 261 ERROR1; 262 263 /* Check negative value */ 264 mpfr_set_si (x, -1, MPFR_RNDN); 265 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 266 ERROR2; 267 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 268 ERROR1; 223 RND_LOOP (r) 224 { 225 /* Check NAN */ 226 mpfr_set_nan (x); 227 if (mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) 228 ERROR1 (52); 229 if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 230 ERROR1 (53); 231 232 /* Check INF */ 233 mpfr_set_inf (x, 1); 234 if (mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) 235 ERROR1 (54); 236 if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 237 ERROR1 (55); 238 239 /* Check Zero */ 240 MPFR_SET_ZERO (x); 241 if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) 242 ERROR1 (56); 243 if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 244 ERROR1 (57); 245 246 /* Check positive small op */ 247 mpfr_set_str1 (x, "1@-1"); 248 if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) 249 ERROR1 (58); 250 if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 251 ERROR1 (59); 252 253 /* Check 17 */ 254 mpfr_set_ui (x, 17, MPFR_RNDN); 255 if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) 256 ERROR1 (60); 257 if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 258 ERROR1 (61); 259 260 /* Check hugest */ 261 mpfr_set_ui_2exp (x, 42, sizeof (uintmax_t) * 32, MPFR_RNDN); 262 if (mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) 263 ERROR1 (62); 264 if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 265 ERROR1 (63); 266 267 /* Check all other values */ 268 mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); 269 mpfr_add_ui (x, x, 1, MPFR_RNDN); 270 if (mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) 271 ERROR1 (64); 272 mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); 273 if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r)) 274 ERROR1 (65); 275 mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); 276 mpfr_add_ui (x, x, 1, MPFR_RNDN); 277 if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 278 ERROR1 (66); 279 mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); 280 if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 281 ERROR1 (67); 282 mpfr_set_sj (x, MPFR_INTMAX_MIN, MPFR_RNDN); 283 if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 284 ERROR1 (68); 285 mpfr_sub_ui (x, x, 1, MPFR_RNDN); 286 if (mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 287 ERROR1 (69); 288 289 /* Check negative op */ 290 for (i = 1; i <= 4; i++) 291 { 292 int inv; 293 294 mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN); 295 mpfr_rint (y, x, (mpfr_rnd_t) r); 296 inv = MPFR_NOTZERO (y); 297 if (!mpfr_fits_uintmax_p (x, (mpfr_rnd_t) r) ^ inv) 298 ERROR1 (70); 299 if (!mpfr_fits_intmax_p (x, (mpfr_rnd_t) r)) 300 ERROR1 (71); 301 } 302 } 269 303 270 304 mpfr_clear (x); 305 mpfr_clear (y); 271 306 #endif 272 307 } 273 -
tests/tget_flt.c
diff -Naur mpfr-3.1.2.orig/tests/tget_flt.c mpfr-3.1.2/tests/tget_flt.c
old new 28 28 main (void) 29 29 { 30 30 mpfr_t x, y; 31 float f, g , infp;31 float f, g; 32 32 int i; 33 #if !defined(MPFR_ERRDIVZERO) 34 float infp; 35 #endif 33 36 37 tests_start_mpfr (); 38 39 #if !defined(MPFR_ERRDIVZERO) 40 /* The definition of DBL_POS_INF involves a division by 0. This makes 41 "clang -O2 -fsanitize=undefined -fno-sanitize-recover" fail. */ 34 42 infp = (float) DBL_POS_INF; 35 43 if (infp * 0.5 != infp) 36 44 { … … 38 46 fprintf (stderr, "(this is probably a compiler bug, please report)\n"); 39 47 exit (1); 40 48 } 41 42 tests_start_mpfr (); 49 #endif 43 50 44 51 mpfr_init2 (x, 24); 45 52 mpfr_init2 (y, 24); … … 353 360 printf ("expected %.8e, got %.8e\n", g, f); 354 361 exit (1); 355 362 } 363 #if !defined(MPFR_ERRDIVZERO) 356 364 f = mpfr_get_flt (x, MPFR_RNDN); /* first round to 2^128 (even rule), 357 365 thus we should get +Inf */ 358 366 g = infp; … … 376 384 printf ("expected %.8e, got %.8e\n", g, f); 377 385 exit (1); 378 386 } 387 #endif 379 388 380 389 mpfr_clear (x); 381 390 mpfr_clear (y); -
tests/tset_ld.c
diff -Naur mpfr-3.1.2.orig/tests/tset_ld.c mpfr-3.1.2/tests/tset_ld.c
old new 47 47 static int 48 48 Isnan_ld (long double d) 49 49 { 50 double e = (double) d; 51 if (DOUBLE_ISNAN (e)) 50 /* Do not convert d to double as this can give an overflow, which 51 may confuse compilers without IEEE 754 support (such as clang 52 -fsanitize=undefined), or trigger a trap if enabled. 53 The DOUBLE_ISNAN macro should work fine on long double. */ 54 if (DOUBLE_ISNAN (d)) 52 55 return 1; 53 56 LONGDOUBLE_NAN_ACTION (d, goto yes); 54 57 return 0;
Note:
See TracBrowser
for help on using the repository browser.