Home | History | Annotate | Line # | Download | only in mpz
      1 /* Test mpz_fits_*_p */
      2 
      3 /*
      4 Copyright 2001 Free Software Foundation, Inc.
      5 
      6 This file is part of the GNU MP Library test suite.
      7 
      8 The GNU MP Library test suite is free software; you can redistribute it
      9 and/or modify it under the terms of the GNU General Public License as
     10 published by the Free Software Foundation; either version 3 of the License,
     11 or (at your option) any later version.
     12 
     13 The GNU MP Library test suite is distributed in the hope that it will be
     14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
     16 Public License for more details.
     17 
     18 You should have received a copy of the GNU General Public License along with
     19 the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
     20 
     21 #include <stdio.h>
     22 #include <stdlib.h>
     23 #include "gmp-impl.h"
     24 #include "tests.h"
     25 
     26 
     27 /* Nothing sophisticated here, just exercise mpz_fits_*_p on a small amount
     28    of data. */
     29 
     30 #define EXPECT_S(fun,name,answer)                                       \
     31   got = fun (z);                                                        \
     32   if (got != answer)                                                    \
     33     {                                                                   \
     34       printf ("%s (%s) got %d want %d\n", name, expr, got, answer);     \
     35       printf (" z size %d\n", SIZ(z));                                  \
     36       printf (" z dec "); mpz_out_str (stdout, 10, z); printf ("\n");   \
     37       printf (" z hex "); mpz_out_str (stdout, 16, z); printf ("\n");   \
     38       error = 1;                                                        \
     39     }
     40 
     41 #define EXPECT(fun,answer)  EXPECT_S(fun,#fun,answer)
     42 
     43 int
     44 main (void)
     45 {
     46   mpz_t       z;
     47   int         got;
     48   const char  *expr;
     49   int         error = 0;
     50 
     51   tests_start ();
     52   mpz_init (z);
     53 
     54   mpz_set_ui (z, 0L);
     55   expr = "0";
     56   EXPECT (mpz_fits_ulong_p, 1);
     57   EXPECT (mpz_fits_uint_p, 1);
     58   EXPECT (mpz_fits_ushort_p, 1);
     59   EXPECT (mpz_fits_slong_p, 1);
     60   EXPECT (mpz_fits_sint_p, 1);
     61   EXPECT (mpz_fits_sshort_p, 1);
     62 
     63   mpz_set_ui (z, 1L);
     64   expr = "1";
     65   EXPECT (mpz_fits_ulong_p, 1);
     66   EXPECT (mpz_fits_uint_p, 1);
     67   EXPECT (mpz_fits_ushort_p, 1);
     68   EXPECT (mpz_fits_slong_p, 1);
     69   EXPECT (mpz_fits_sint_p, 1);
     70   EXPECT (mpz_fits_sshort_p, 1);
     71 
     72   mpz_set_si (z, -1L);
     73   expr = "-1";
     74   EXPECT (mpz_fits_ulong_p, 0);
     75   EXPECT (mpz_fits_uint_p, 0);
     76   EXPECT (mpz_fits_ushort_p, 0);
     77   EXPECT (mpz_fits_slong_p, 1);
     78   EXPECT (mpz_fits_sint_p, 1);
     79   EXPECT (mpz_fits_sshort_p, 1);
     80 
     81   mpz_set_ui (z, 1L);
     82   mpz_mul_2exp (z, z, 5L*GMP_LIMB_BITS);
     83   expr = "2^(5*BPML)";
     84   EXPECT (mpz_fits_ulong_p, 0);
     85   EXPECT (mpz_fits_uint_p, 0);
     86   EXPECT (mpz_fits_ushort_p, 0);
     87   EXPECT (mpz_fits_slong_p, 0);
     88   EXPECT (mpz_fits_sint_p, 0);
     89   EXPECT (mpz_fits_sshort_p, 0);
     90 
     91 
     92   mpz_set_ui (z, (unsigned long) USHRT_MAX);
     93   expr = "USHRT_MAX";
     94   EXPECT (mpz_fits_ulong_p, 1);
     95   EXPECT (mpz_fits_uint_p, 1);
     96   EXPECT (mpz_fits_ushort_p, 1);
     97 
     98   mpz_set_ui (z, (unsigned long) USHRT_MAX);
     99   mpz_add_ui (z, z, 1L);
    100   expr = "USHRT_MAX + 1";
    101   EXPECT (mpz_fits_ushort_p, 0);
    102 
    103 
    104   mpz_set_ui (z, (unsigned long) UINT_MAX);
    105   expr = "UINT_MAX";
    106   EXPECT (mpz_fits_ulong_p, 1);
    107   EXPECT (mpz_fits_uint_p, 1);
    108 
    109   mpz_set_ui (z, (unsigned long) UINT_MAX);
    110   mpz_add_ui (z, z, 1L);
    111   expr = "UINT_MAX + 1";
    112   EXPECT (mpz_fits_uint_p, 0);
    113 
    114 
    115   mpz_set_ui (z, ULONG_MAX);
    116   expr = "ULONG_MAX";
    117   EXPECT (mpz_fits_ulong_p, 1);
    118 
    119   mpz_set_ui (z, ULONG_MAX);
    120   mpz_add_ui (z, z, 1L);
    121   expr = "ULONG_MAX + 1";
    122   EXPECT (mpz_fits_ulong_p, 0);
    123 
    124 
    125   mpz_set_si (z, (long) SHRT_MAX);
    126   expr = "SHRT_MAX";
    127   EXPECT (mpz_fits_slong_p, 1);
    128   EXPECT (mpz_fits_sint_p, 1);
    129   EXPECT (mpz_fits_sshort_p, 1);
    130 
    131   mpz_set_si (z, (long) SHRT_MAX);
    132   mpz_add_ui (z, z, 1L);
    133   expr = "SHRT_MAX + 1";
    134   EXPECT (mpz_fits_sshort_p, 0);
    135 
    136 
    137   mpz_set_si (z, (long) INT_MAX);
    138   expr = "INT_MAX";
    139   EXPECT (mpz_fits_slong_p, 1);
    140   EXPECT (mpz_fits_sint_p, 1);
    141 
    142   mpz_set_si (z, (long) INT_MAX);
    143   mpz_add_ui (z, z, 1L);
    144   expr = "INT_MAX + 1";
    145   EXPECT (mpz_fits_sint_p, 0);
    146 
    147 
    148   mpz_set_si (z, LONG_MAX);
    149   expr = "LONG_MAX";
    150   EXPECT (mpz_fits_slong_p, 1);
    151 
    152   mpz_set_si (z, LONG_MAX);
    153   mpz_add_ui (z, z, 1L);
    154   expr = "LONG_MAX + 1";
    155   EXPECT (mpz_fits_slong_p, 0);
    156 
    157 
    158   mpz_set_si (z, (long) SHRT_MIN);
    159   expr = "SHRT_MIN";
    160   EXPECT (mpz_fits_slong_p, 1);
    161   EXPECT (mpz_fits_sint_p, 1);
    162   EXPECT (mpz_fits_sshort_p, 1);
    163 
    164   mpz_set_si (z, (long) SHRT_MIN);
    165   mpz_sub_ui (z, z, 1L);
    166   expr = "SHRT_MIN + 1";
    167   EXPECT (mpz_fits_sshort_p, 0);
    168 
    169 
    170   mpz_set_si (z, (long) INT_MIN);
    171   expr = "INT_MIN";
    172   EXPECT (mpz_fits_slong_p, 1);
    173   EXPECT (mpz_fits_sint_p, 1);
    174 
    175   mpz_set_si (z, (long) INT_MIN);
    176   mpz_sub_ui (z, z, 1L);
    177   expr = "INT_MIN + 1";
    178   EXPECT (mpz_fits_sint_p, 0);
    179 
    180 
    181   mpz_set_si (z, LONG_MIN);
    182   expr = "LONG_MIN";
    183   EXPECT (mpz_fits_slong_p, 1);
    184 
    185   mpz_set_si (z, LONG_MIN);
    186   mpz_sub_ui (z, z, 1L);
    187   expr = "LONG_MIN + 1";
    188   EXPECT (mpz_fits_slong_p, 0);
    189 
    190 
    191   if (error)
    192     abort ();
    193 
    194   mpz_clear (z);
    195   tests_end ();
    196   exit (0);
    197 }
    198