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