1/* Test mpf_fits_*_p 2 3Copyright 2001, 2002 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library. 6 7The GNU MP Library is free software; you can redistribute it and/or modify 8it under the terms of the GNU Lesser General Public License as published by 9the Free Software Foundation; either version 3 of the License, or (at your 10option) any later version. 11 12The GNU MP Library is distributed in the hope that it will be useful, but 13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15License for more details. 16 17You should have received a copy of the GNU Lesser General Public License 18along with the GNU MP Library. 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 47int 48main (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