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