1/* Test file for: 2 mpfr_fits_sint_p, mpfr_fits_slong_p, mpfr_fits_sshort_p, 3 mpfr_fits_uint_p, mpfr_fits_ulong_p, mpfr_fits_ushort_p 4 5Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 6Contributed by the Arenaire and Cacao projects, INRIA. 7 8This file is part of the GNU MPFR Library. 9 10The GNU MPFR Library is free software; you can redistribute it and/or modify 11it under the terms of the GNU Lesser General Public License as published by 12the Free Software Foundation; either version 3 of the License, or (at your 13option) any later version. 14 15The GNU MPFR Library is distributed in the hope that it will be useful, but 16WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 17or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 18License for more details. 19 20You should have received a copy of the GNU Lesser General Public License 21along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 22http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 2351 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 24 25#ifdef HAVE_CONFIG_H 26# include "config.h" /* for a build within gmp */ 27#endif 28 29#include <stdio.h> 30#include <stdlib.h> 31#include <limits.h> 32 33/* The ISO C99 standard specifies that in C++ implementations the 34 INTMAX_MAX, ... macros should only be defined if explicitly requested. */ 35#if defined __cplusplus 36# define __STDC_LIMIT_MACROS 37# define __STDC_CONSTANT_MACROS 38#endif 39 40#if HAVE_INTTYPES_H 41# include <inttypes.h> /* for intmax_t */ 42#else 43# if HAVE_STDINT_H 44# include <stdint.h> 45# endif 46#endif 47 48#include "mpfr-test.h" 49 50#define ERROR1 { printf("Initial error for x="); mpfr_dump(x); exit(1); } 51#define ERROR2 { printf("Error for x="); mpfr_dump(x); exit(1); } 52 53static void check_intmax (void); 54 55int 56main (void) 57{ 58 mpfr_t x; 59 60 tests_start_mpfr (); 61 62 mpfr_init2 (x, 256); 63 64 /* Check NAN */ 65 mpfr_set_nan (x); 66 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 67 ERROR1; 68 if (mpfr_fits_slong_p (x, MPFR_RNDN)) 69 ERROR1; 70 if (mpfr_fits_uint_p (x, MPFR_RNDN)) 71 ERROR1; 72 if (mpfr_fits_sint_p (x, MPFR_RNDN)) 73 ERROR1; 74 if (mpfr_fits_ushort_p (x, MPFR_RNDN)) 75 ERROR1; 76 if (mpfr_fits_sshort_p (x, MPFR_RNDN)) 77 ERROR1; 78 79 /* Check INF */ 80 mpfr_set_inf (x, 1); 81 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 82 ERROR1; 83 if (mpfr_fits_slong_p (x, MPFR_RNDN)) 84 ERROR1; 85 if (mpfr_fits_uint_p (x, MPFR_RNDN)) 86 ERROR1; 87 if (mpfr_fits_sint_p (x, MPFR_RNDN)) 88 ERROR1; 89 if (mpfr_fits_ushort_p (x, MPFR_RNDN)) 90 ERROR1; 91 if (mpfr_fits_sshort_p (x, MPFR_RNDN)) 92 ERROR1; 93 94 /* Check Zero */ 95 MPFR_SET_ZERO (x); 96 if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) 97 ERROR2; 98 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 99 ERROR2; 100 if (!mpfr_fits_uint_p (x, MPFR_RNDN)) 101 ERROR2; 102 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 103 ERROR2; 104 if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) 105 ERROR2; 106 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 107 ERROR2; 108 109 /* Check small op */ 110 mpfr_set_str1 (x, "1@-1"); 111 if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) 112 ERROR2; 113 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 114 ERROR2; 115 if (!mpfr_fits_uint_p (x, MPFR_RNDN)) 116 ERROR2; 117 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 118 ERROR2; 119 if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) 120 ERROR2; 121 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 122 ERROR2; 123 124 /* Check 17 */ 125 mpfr_set_ui (x, 17, MPFR_RNDN); 126 if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) 127 ERROR2; 128 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 129 ERROR2; 130 if (!mpfr_fits_uint_p (x, MPFR_RNDN)) 131 ERROR2; 132 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 133 ERROR2; 134 if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) 135 ERROR2; 136 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 137 ERROR2; 138 139 /* Check all other values */ 140 mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); 141 mpfr_mul_2exp (x, x, 1, MPFR_RNDN); 142 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 143 ERROR1; 144 if (mpfr_fits_slong_p (x, MPFR_RNDN)) 145 ERROR1; 146 mpfr_mul_2exp (x, x, 40, MPFR_RNDN); 147 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 148 ERROR1; 149 if (mpfr_fits_uint_p (x, MPFR_RNDN)) 150 ERROR1; 151 if (mpfr_fits_sint_p (x, MPFR_RNDN)) 152 ERROR1; 153 if (mpfr_fits_ushort_p (x, MPFR_RNDN)) 154 ERROR1; 155 if (mpfr_fits_sshort_p (x, MPFR_RNDN)) 156 ERROR1; 157 158 mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); 159 if (!mpfr_fits_ulong_p (x, MPFR_RNDN)) 160 ERROR2; 161 mpfr_set_ui (x, LONG_MAX, MPFR_RNDN); 162 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 163 ERROR2; 164 mpfr_set_ui (x, UINT_MAX, MPFR_RNDN); 165 if (!mpfr_fits_uint_p (x, MPFR_RNDN)) 166 ERROR2; 167 mpfr_set_ui (x, INT_MAX, MPFR_RNDN); 168 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 169 ERROR2; 170 mpfr_set_ui (x, USHRT_MAX, MPFR_RNDN); 171 if (!mpfr_fits_ushort_p (x, MPFR_RNDN)) 172 ERROR2; 173 mpfr_set_ui (x, SHRT_MAX, MPFR_RNDN); 174 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 175 ERROR2; 176 177 mpfr_set_si (x, 1, MPFR_RNDN); 178 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 179 ERROR2; 180 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 181 ERROR2; 182 183 /* Check negative value */ 184 mpfr_set_si (x, -1, MPFR_RNDN); 185 if (!mpfr_fits_sint_p (x, MPFR_RNDN)) 186 ERROR2; 187 if (!mpfr_fits_sshort_p (x, MPFR_RNDN)) 188 ERROR2; 189 if (!mpfr_fits_slong_p (x, MPFR_RNDN)) 190 ERROR2; 191 if (mpfr_fits_uint_p (x, MPFR_RNDN)) 192 ERROR1; 193 if (mpfr_fits_ushort_p (x, MPFR_RNDN)) 194 ERROR1; 195 if (mpfr_fits_ulong_p (x, MPFR_RNDN)) 196 ERROR1; 197 198 mpfr_clear (x); 199 200 check_intmax (); 201 202 tests_end_mpfr (); 203 return 0; 204} 205 206static void check_intmax (void) 207{ 208#ifdef _MPFR_H_HAVE_INTMAX_T 209 mpfr_t x; 210 211 mpfr_init2 (x, sizeof (uintmax_t)*CHAR_BIT); 212 213 /* Check NAN */ 214 mpfr_set_nan (x); 215 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 216 ERROR1; 217 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 218 ERROR1; 219 220 /* Check INF */ 221 mpfr_set_inf (x, 1); 222 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 223 ERROR1; 224 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 225 ERROR1; 226 227 /* Check Zero */ 228 MPFR_SET_ZERO (x); 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 small op */ 235 mpfr_set_str1 (x, "1@-1"); 236 if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) 237 ERROR2; 238 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 239 ERROR2; 240 241 /* Check 17 */ 242 mpfr_set_ui (x, 17, MPFR_RNDN); 243 if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) 244 ERROR2; 245 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 246 ERROR2; 247 248 /* Check hugest */ 249 mpfr_set_ui_2exp (x, 42, sizeof (uintmax_t) * 32, MPFR_RNDN); 250 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 251 ERROR1; 252 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 253 ERROR1; 254 255 /* Check all other values */ 256 mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); 257 mpfr_add_ui (x, x, 1, MPFR_RNDN); 258 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 259 ERROR1; 260 mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN); 261 if (!mpfr_fits_uintmax_p (x, MPFR_RNDN)) 262 ERROR2; 263 mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); 264 mpfr_add_ui (x, x, 1, MPFR_RNDN); 265 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 266 ERROR1; 267 mpfr_set_sj (x, MPFR_INTMAX_MAX, MPFR_RNDN); 268 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 269 ERROR2; 270 mpfr_set_sj (x, MPFR_INTMAX_MIN, MPFR_RNDN); 271 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 272 ERROR2; 273 mpfr_sub_ui (x, x, 1, MPFR_RNDN); 274 if (mpfr_fits_intmax_p (x, MPFR_RNDN)) 275 ERROR1; 276 277 /* Check negative value */ 278 mpfr_set_si (x, -1, MPFR_RNDN); 279 if (!mpfr_fits_intmax_p (x, MPFR_RNDN)) 280 ERROR2; 281 if (mpfr_fits_uintmax_p (x, MPFR_RNDN)) 282 ERROR1; 283 284 mpfr_clear (x); 285#endif 286} 287 288