1 /* Test mpf_fits_*_p 2 3 Copyright 2001, 2002 Free Software Foundation, Inc. 4 5 This file is part of the GNU MP Library test suite. 6 7 The GNU MP Library test suite is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 3 of the License, 10 or (at your option) any later version. 11 12 The GNU MP Library test suite is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15 Public License for more details. 16 17 You should have received a copy of the GNU General Public License along with 18 the GNU MP Library test suite. If not, see http://www.gnu.org/licenses/. */ 19 20 #include <stdio.h> 21 #include <stdlib.h> 22 #include "gmp.h" 23 #include "gmp-impl.h" 24 #include "tests.h" 25 26 27 /* Nothing sophisticated here, just exercise mpf_fits_*_p on a small amount 28 of data. */ 29 30 #define EXPECT_S(fun,name,answer) \ 31 got = fun (f); \ 32 if (got != answer) \ 33 { \ 34 printf ("%s (%s) got %d want %d\n", name, expr, got, answer); \ 35 printf (" f size %d exp %ld\n", SIZ(f), EXP(f)); \ 36 printf (" f dec "); mpf_out_str (stdout, 10, 0, f); printf ("\n"); \ 37 printf (" f hex "); mpf_out_str (stdout, 16, 0, f); printf ("\n"); \ 38 error = 1; \ 39 } 40 41 #if HAVE_STRINGIZE 42 #define EXPECT(fun,answer) EXPECT_S(fun,#fun,answer) 43 #else 44 #define EXPECT(fun,answer) EXPECT_S(fun,"fun",answer) 45 #endif 46 47 int 48 main (void) 49 { 50 mpf_t f, f0p5; 51 int got; 52 const char *expr; 53 int error = 0; 54 55 tests_start (); 56 mpf_init2 (f, 200L); 57 mpf_init2 (f0p5, 200L); 58 59 /* 0.5 */ 60 mpf_set_ui (f0p5, 1L); 61 mpf_div_2exp (f0p5, f0p5, 1L); 62 63 mpf_set_ui (f, 0L); 64 expr = "0"; 65 EXPECT (mpf_fits_ulong_p, 1); 66 EXPECT (mpf_fits_uint_p, 1); 67 EXPECT (mpf_fits_ushort_p, 1); 68 EXPECT (mpf_fits_slong_p, 1); 69 EXPECT (mpf_fits_sint_p, 1); 70 EXPECT (mpf_fits_sshort_p, 1); 71 72 mpf_set_ui (f, 1L); 73 expr = "1"; 74 EXPECT (mpf_fits_ulong_p, 1); 75 EXPECT (mpf_fits_uint_p, 1); 76 EXPECT (mpf_fits_ushort_p, 1); 77 EXPECT (mpf_fits_slong_p, 1); 78 EXPECT (mpf_fits_sint_p, 1); 79 EXPECT (mpf_fits_sshort_p, 1); 80 81 mpf_set_si (f, -1L); 82 expr = "-1"; 83 EXPECT (mpf_fits_ulong_p, 0); 84 EXPECT (mpf_fits_uint_p, 0); 85 EXPECT (mpf_fits_ushort_p, 0); 86 EXPECT (mpf_fits_slong_p, 1); 87 EXPECT (mpf_fits_sint_p, 1); 88 EXPECT (mpf_fits_sshort_p, 1); 89 90 91 mpf_set_ui (f, (unsigned long) USHRT_MAX); 92 expr = "USHRT_MAX"; 93 EXPECT (mpf_fits_ulong_p, 1); 94 EXPECT (mpf_fits_uint_p, 1); 95 EXPECT (mpf_fits_ushort_p, 1); 96 97 mpf_set_ui (f, (unsigned long) USHRT_MAX); 98 mpf_add (f, f, f0p5); 99 expr = "USHRT_MAX + 0.5"; 100 EXPECT (mpf_fits_ulong_p, 1); 101 EXPECT (mpf_fits_uint_p, 1); 102 EXPECT (mpf_fits_ushort_p, 1); 103 104 mpf_set_ui (f, (unsigned long) USHRT_MAX); 105 mpf_add_ui (f, f, 1L); 106 expr = "USHRT_MAX + 1"; 107 EXPECT (mpf_fits_ushort_p, 0); 108 109 110 mpf_set_ui (f, (unsigned long) UINT_MAX); 111 expr = "UINT_MAX"; 112 EXPECT (mpf_fits_ulong_p, 1); 113 EXPECT (mpf_fits_uint_p, 1); 114 115 mpf_set_ui (f, (unsigned long) UINT_MAX); 116 mpf_add (f, f, f0p5); 117 expr = "UINT_MAX + 0.5"; 118 EXPECT (mpf_fits_ulong_p, 1); 119 EXPECT (mpf_fits_uint_p, 1); 120 121 mpf_set_ui (f, (unsigned long) UINT_MAX); 122 mpf_add_ui (f, f, 1L); 123 expr = "UINT_MAX + 1"; 124 EXPECT (mpf_fits_uint_p, 0); 125 126 127 mpf_set_ui (f, ULONG_MAX); 128 expr = "ULONG_MAX"; 129 EXPECT (mpf_fits_ulong_p, 1); 130 131 mpf_set_ui (f, ULONG_MAX); 132 mpf_add (f, f, f0p5); 133 expr = "ULONG_MAX + 0.5"; 134 EXPECT (mpf_fits_ulong_p, 1); 135 136 mpf_set_ui (f, ULONG_MAX); 137 mpf_add_ui (f, f, 1L); 138 expr = "ULONG_MAX + 1"; 139 EXPECT (mpf_fits_ulong_p, 0); 140 141 142 mpf_set_si (f, (long) SHRT_MAX); 143 expr = "SHRT_MAX"; 144 EXPECT (mpf_fits_slong_p, 1); 145 EXPECT (mpf_fits_sint_p, 1); 146 EXPECT (mpf_fits_sshort_p, 1); 147 148 mpf_set_si (f, (long) SHRT_MAX); 149 expr = "SHRT_MAX + 0.5"; 150 mpf_add (f, f, f0p5); 151 EXPECT (mpf_fits_slong_p, 1); 152 EXPECT (mpf_fits_sint_p, 1); 153 EXPECT (mpf_fits_sshort_p, 1); 154 155 mpf_set_si (f, (long) SHRT_MAX); 156 mpf_add_ui (f, f, 1L); 157 expr = "SHRT_MAX + 1"; 158 EXPECT (mpf_fits_sshort_p, 0); 159 160 161 mpf_set_si (f, (long) INT_MAX); 162 expr = "INT_MAX"; 163 EXPECT (mpf_fits_slong_p, 1); 164 EXPECT (mpf_fits_sint_p, 1); 165 166 mpf_set_si (f, (long) INT_MAX); 167 mpf_add (f, f, f0p5); 168 expr = "INT_MAX + 0.5"; 169 EXPECT (mpf_fits_slong_p, 1); 170 EXPECT (mpf_fits_sint_p, 1); 171 172 mpf_set_si (f, (long) INT_MAX); 173 mpf_add_ui (f, f, 1L); 174 expr = "INT_MAX + 1"; 175 EXPECT (mpf_fits_sint_p, 0); 176 177 178 mpf_set_si (f, LONG_MAX); 179 expr = "LONG_MAX"; 180 EXPECT (mpf_fits_slong_p, 1); 181 182 mpf_set_si (f, LONG_MAX); 183 mpf_add (f, f, f0p5); 184 expr = "LONG_MAX + 0.5"; 185 EXPECT (mpf_fits_slong_p, 1); 186 187 mpf_set_si (f, LONG_MAX); 188 mpf_add_ui (f, f, 1L); 189 expr = "LONG_MAX + 1"; 190 EXPECT (mpf_fits_slong_p, 0); 191 192 193 mpf_set_si (f, (long) SHRT_MIN); 194 expr = "SHRT_MIN"; 195 EXPECT (mpf_fits_slong_p, 1); 196 EXPECT (mpf_fits_sint_p, 1); 197 EXPECT (mpf_fits_sshort_p, 1); 198 199 mpf_set_si (f, (long) SHRT_MIN); 200 mpf_sub (f, f, f0p5); 201 expr = "SHRT_MIN - 0.5"; 202 EXPECT (mpf_fits_slong_p, 1); 203 EXPECT (mpf_fits_sint_p, 1); 204 EXPECT (mpf_fits_sshort_p, 1); 205 206 mpf_set_si (f, (long) SHRT_MIN); 207 mpf_sub_ui (f, f, 1L); 208 expr = "SHRT_MIN + 1"; 209 EXPECT (mpf_fits_sshort_p, 0); 210 211 212 mpf_set_si (f, (long) INT_MIN); 213 expr = "INT_MIN"; 214 EXPECT (mpf_fits_slong_p, 1); 215 EXPECT (mpf_fits_sint_p, 1); 216 217 mpf_set_si (f, (long) INT_MIN); 218 mpf_sub (f, f, f0p5); 219 expr = "INT_MIN - 0.5"; 220 EXPECT (mpf_fits_slong_p, 1); 221 EXPECT (mpf_fits_sint_p, 1); 222 223 mpf_set_si (f, (long) INT_MIN); 224 mpf_sub_ui (f, f, 1L); 225 expr = "INT_MIN + 1"; 226 EXPECT (mpf_fits_sint_p, 0); 227 228 229 mpf_set_si (f, LONG_MIN); 230 expr = "LONG_MIN"; 231 EXPECT (mpf_fits_slong_p, 1); 232 233 mpf_set_si (f, LONG_MIN); 234 mpf_sub (f, f, f0p5); 235 expr = "LONG_MIN - 0.5"; 236 EXPECT (mpf_fits_slong_p, 1); 237 238 mpf_set_si (f, LONG_MIN); 239 mpf_sub_ui (f, f, 1L); 240 expr = "LONG_MIN + 1"; 241 EXPECT (mpf_fits_slong_p, 0); 242 243 244 mpf_set_str_or_abort (f, "0.5", 10); 245 expr = "0.5"; 246 EXPECT (mpf_fits_ulong_p, 1); 247 EXPECT (mpf_fits_uint_p, 1); 248 EXPECT (mpf_fits_ushort_p, 1); 249 EXPECT (mpf_fits_slong_p, 1); 250 EXPECT (mpf_fits_sint_p, 1); 251 EXPECT (mpf_fits_sshort_p, 1); 252 253 mpf_set_str_or_abort (f, "-0.5", 10); 254 expr = "-0.5"; 255 EXPECT (mpf_fits_ulong_p, 0); 256 EXPECT (mpf_fits_uint_p, 0); 257 EXPECT (mpf_fits_ushort_p, 0); 258 EXPECT (mpf_fits_slong_p, 1); 259 EXPECT (mpf_fits_sint_p, 1); 260 EXPECT (mpf_fits_sshort_p, 1); 261 262 263 mpf_set_str_or_abort (f, "1.000000000000000000000000000000000001", 16); 264 expr = "1.000000000000000000000000000000000001 base 16"; 265 EXPECT (mpf_fits_ulong_p, 1); 266 EXPECT (mpf_fits_uint_p, 1); 267 EXPECT (mpf_fits_ushort_p, 1); 268 EXPECT (mpf_fits_slong_p, 1); 269 EXPECT (mpf_fits_sint_p, 1); 270 EXPECT (mpf_fits_sshort_p, 1); 271 272 mpf_set_str_or_abort (f, "1@1000", 16); 273 expr = "1@1000 base 16"; 274 EXPECT (mpf_fits_ulong_p, 0); 275 EXPECT (mpf_fits_uint_p, 0); 276 EXPECT (mpf_fits_ushort_p, 0); 277 EXPECT (mpf_fits_slong_p, 0); 278 EXPECT (mpf_fits_sint_p, 0); 279 EXPECT (mpf_fits_sshort_p, 0); 280 281 282 mpf_set_ui (f, 1L); 283 mpf_mul_2exp (f, f, BITS_PER_ULONG + 1); 284 mpf_sub_ui (f, f, 1L); 285 expr = "2^(BITS_PER_ULONG+1) - 1"; 286 EXPECT (mpf_fits_ulong_p, 0); 287 EXPECT (mpf_fits_uint_p, 0); 288 EXPECT (mpf_fits_ushort_p, 0); 289 EXPECT (mpf_fits_slong_p, 0); 290 EXPECT (mpf_fits_sint_p, 0); 291 EXPECT (mpf_fits_sshort_p, 0); 292 293 mpf_set_ui (f, 1L); 294 mpf_mul_2exp (f, f, BITS_PER_ULONG + 1); 295 mpf_sub_ui (f, f, 1L); 296 mpf_neg (f, f); 297 expr = "- (2^(BITS_PER_ULONG+1) - 1)"; 298 EXPECT (mpf_fits_ulong_p, 0); 299 EXPECT (mpf_fits_uint_p, 0); 300 EXPECT (mpf_fits_ushort_p, 0); 301 EXPECT (mpf_fits_slong_p, 0); 302 EXPECT (mpf_fits_sint_p, 0); 303 EXPECT (mpf_fits_sshort_p, 0); 304 305 mpf_set_ui (f, 1L); 306 mpf_mul_2exp (f, f, BITS_PER_ULONG + 5); 307 mpf_sub_ui (f, f, 1L); 308 expr = "2^(BITS_PER_ULONG+5) - 1"; 309 EXPECT (mpf_fits_ulong_p, 0); 310 EXPECT (mpf_fits_uint_p, 0); 311 EXPECT (mpf_fits_ushort_p, 0); 312 EXPECT (mpf_fits_slong_p, 0); 313 EXPECT (mpf_fits_sint_p, 0); 314 EXPECT (mpf_fits_sshort_p, 0); 315 316 317 if (error) 318 abort (); 319 320 mpf_clear (f); 321 mpf_clear (f0p5); 322 tests_end (); 323 exit (0); 324 } 325