Home | History | Annotate | Line # | Download | only in mpf
t-fits.c revision 1.1.1.3
      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.h"
     23      1.1  mrg #include "gmp-impl.h"
     24      1.1  mrg #include "tests.h"
     25      1.1  mrg 
     26      1.1  mrg 
     27      1.1  mrg /* Nothing sophisticated here, just exercise mpf_fits_*_p on a small amount
     28      1.1  mrg    of data. */
     29      1.1  mrg 
     30      1.1  mrg #define EXPECT_S(fun,name,answer)                                        \
     31      1.1  mrg   got = fun (f);                                                         \
     32      1.1  mrg   if (got != answer)                                                     \
     33      1.1  mrg     {                                                                    \
     34      1.1  mrg       printf ("%s (%s) got %d want %d\n", name, expr, got, answer);      \
     35      1.1  mrg       printf (" f size %d exp %ld\n", SIZ(f), EXP(f));                   \
     36      1.1  mrg       printf (" f dec "); mpf_out_str (stdout, 10, 0, f); printf ("\n"); \
     37      1.1  mrg       printf (" f hex "); mpf_out_str (stdout, 16, 0, f); printf ("\n"); \
     38      1.1  mrg       error = 1;                                                         \
     39      1.1  mrg     }
     40      1.1  mrg 
     41      1.1  mrg #define EXPECT(fun,answer)  EXPECT_S(fun,#fun,answer)
     42      1.1  mrg 
     43      1.1  mrg int
     44      1.1  mrg main (void)
     45      1.1  mrg {
     46      1.1  mrg   mpf_t       f, f0p5;
     47      1.1  mrg   int         got;
     48      1.1  mrg   const char  *expr;
     49      1.1  mrg   int         error = 0;
     50      1.1  mrg 
     51      1.1  mrg   tests_start ();
     52      1.1  mrg   mpf_init2 (f, 200L);
     53      1.1  mrg   mpf_init2 (f0p5, 200L);
     54      1.1  mrg 
     55      1.1  mrg   /* 0.5 */
     56      1.1  mrg   mpf_set_ui (f0p5, 1L);
     57      1.1  mrg   mpf_div_2exp (f0p5, f0p5, 1L);
     58      1.1  mrg 
     59      1.1  mrg   mpf_set_ui (f, 0L);
     60      1.1  mrg   expr = "0";
     61      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
     62      1.1  mrg   EXPECT (mpf_fits_uint_p, 1);
     63      1.1  mrg   EXPECT (mpf_fits_ushort_p, 1);
     64      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
     65      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
     66      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
     67      1.1  mrg 
     68      1.1  mrg   mpf_set_ui (f, 1L);
     69      1.1  mrg   expr = "1";
     70      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
     71      1.1  mrg   EXPECT (mpf_fits_uint_p, 1);
     72      1.1  mrg   EXPECT (mpf_fits_ushort_p, 1);
     73      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
     74      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
     75      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
     76      1.1  mrg 
     77      1.1  mrg   mpf_set_si (f, -1L);
     78      1.1  mrg   expr = "-1";
     79      1.1  mrg   EXPECT (mpf_fits_ulong_p, 0);
     80      1.1  mrg   EXPECT (mpf_fits_uint_p, 0);
     81      1.1  mrg   EXPECT (mpf_fits_ushort_p, 0);
     82      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
     83      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
     84      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
     85      1.1  mrg 
     86      1.1  mrg 
     87      1.1  mrg   mpf_set_ui (f, (unsigned long) USHRT_MAX);
     88      1.1  mrg   expr = "USHRT_MAX";
     89      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
     90      1.1  mrg   EXPECT (mpf_fits_uint_p, 1);
     91      1.1  mrg   EXPECT (mpf_fits_ushort_p, 1);
     92      1.1  mrg 
     93      1.1  mrg   mpf_set_ui (f, (unsigned long) USHRT_MAX);
     94      1.1  mrg   mpf_add (f, f, f0p5);
     95      1.1  mrg   expr = "USHRT_MAX + 0.5";
     96      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
     97      1.1  mrg   EXPECT (mpf_fits_uint_p, 1);
     98      1.1  mrg   EXPECT (mpf_fits_ushort_p, 1);
     99      1.1  mrg 
    100      1.1  mrg   mpf_set_ui (f, (unsigned long) USHRT_MAX);
    101      1.1  mrg   mpf_add_ui (f, f, 1L);
    102      1.1  mrg   expr = "USHRT_MAX + 1";
    103      1.1  mrg   EXPECT (mpf_fits_ushort_p, 0);
    104      1.1  mrg 
    105      1.1  mrg 
    106      1.1  mrg   mpf_set_ui (f, (unsigned long) UINT_MAX);
    107      1.1  mrg   expr = "UINT_MAX";
    108      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
    109      1.1  mrg   EXPECT (mpf_fits_uint_p, 1);
    110      1.1  mrg 
    111      1.1  mrg   mpf_set_ui (f, (unsigned long) UINT_MAX);
    112      1.1  mrg   mpf_add (f, f, f0p5);
    113      1.1  mrg   expr = "UINT_MAX + 0.5";
    114      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
    115      1.1  mrg   EXPECT (mpf_fits_uint_p, 1);
    116      1.1  mrg 
    117      1.1  mrg   mpf_set_ui (f, (unsigned long) UINT_MAX);
    118      1.1  mrg   mpf_add_ui (f, f, 1L);
    119      1.1  mrg   expr = "UINT_MAX + 1";
    120      1.1  mrg   EXPECT (mpf_fits_uint_p, 0);
    121      1.1  mrg 
    122      1.1  mrg 
    123      1.1  mrg   mpf_set_ui (f, ULONG_MAX);
    124      1.1  mrg   expr = "ULONG_MAX";
    125      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
    126      1.1  mrg 
    127      1.1  mrg   mpf_set_ui (f, ULONG_MAX);
    128      1.1  mrg   mpf_add (f, f, f0p5);
    129      1.1  mrg   expr = "ULONG_MAX + 0.5";
    130      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
    131      1.1  mrg 
    132      1.1  mrg   mpf_set_ui (f, ULONG_MAX);
    133      1.1  mrg   mpf_add_ui (f, f, 1L);
    134      1.1  mrg   expr = "ULONG_MAX + 1";
    135      1.1  mrg   EXPECT (mpf_fits_ulong_p, 0);
    136      1.1  mrg 
    137      1.1  mrg 
    138      1.1  mrg   mpf_set_si (f, (long) SHRT_MAX);
    139      1.1  mrg   expr = "SHRT_MAX";
    140      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    141      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    142      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
    143      1.1  mrg 
    144      1.1  mrg   mpf_set_si (f, (long) SHRT_MAX);
    145      1.1  mrg   expr = "SHRT_MAX + 0.5";
    146      1.1  mrg   mpf_add (f, f, f0p5);
    147      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    148      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    149      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
    150      1.1  mrg 
    151      1.1  mrg   mpf_set_si (f, (long) SHRT_MAX);
    152      1.1  mrg   mpf_add_ui (f, f, 1L);
    153      1.1  mrg   expr = "SHRT_MAX + 1";
    154      1.1  mrg   EXPECT (mpf_fits_sshort_p, 0);
    155      1.1  mrg 
    156      1.1  mrg 
    157      1.1  mrg   mpf_set_si (f, (long) INT_MAX);
    158      1.1  mrg   expr = "INT_MAX";
    159      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    160      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    161      1.1  mrg 
    162      1.1  mrg   mpf_set_si (f, (long) INT_MAX);
    163      1.1  mrg   mpf_add (f, f, f0p5);
    164      1.1  mrg   expr = "INT_MAX + 0.5";
    165      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    166      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    167      1.1  mrg 
    168      1.1  mrg   mpf_set_si (f, (long) INT_MAX);
    169      1.1  mrg   mpf_add_ui (f, f, 1L);
    170      1.1  mrg   expr = "INT_MAX + 1";
    171      1.1  mrg   EXPECT (mpf_fits_sint_p, 0);
    172      1.1  mrg 
    173      1.1  mrg 
    174      1.1  mrg   mpf_set_si (f, LONG_MAX);
    175      1.1  mrg   expr = "LONG_MAX";
    176      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    177      1.1  mrg 
    178      1.1  mrg   mpf_set_si (f, LONG_MAX);
    179      1.1  mrg   mpf_add (f, f, f0p5);
    180      1.1  mrg   expr = "LONG_MAX + 0.5";
    181      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    182      1.1  mrg 
    183      1.1  mrg   mpf_set_si (f, LONG_MAX);
    184      1.1  mrg   mpf_add_ui (f, f, 1L);
    185      1.1  mrg   expr = "LONG_MAX + 1";
    186      1.1  mrg   EXPECT (mpf_fits_slong_p, 0);
    187      1.1  mrg 
    188      1.1  mrg 
    189      1.1  mrg   mpf_set_si (f, (long) SHRT_MIN);
    190      1.1  mrg   expr = "SHRT_MIN";
    191      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    192      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    193      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
    194      1.1  mrg 
    195      1.1  mrg   mpf_set_si (f, (long) SHRT_MIN);
    196      1.1  mrg   mpf_sub (f, f, f0p5);
    197      1.1  mrg   expr = "SHRT_MIN - 0.5";
    198      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    199      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    200      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
    201      1.1  mrg 
    202      1.1  mrg   mpf_set_si (f, (long) SHRT_MIN);
    203      1.1  mrg   mpf_sub_ui (f, f, 1L);
    204  1.1.1.3  mrg   expr = "SHRT_MIN - 1";
    205      1.1  mrg   EXPECT (mpf_fits_sshort_p, 0);
    206      1.1  mrg 
    207      1.1  mrg 
    208      1.1  mrg   mpf_set_si (f, (long) INT_MIN);
    209      1.1  mrg   expr = "INT_MIN";
    210      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    211      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    212      1.1  mrg 
    213      1.1  mrg   mpf_set_si (f, (long) INT_MIN);
    214      1.1  mrg   mpf_sub (f, f, f0p5);
    215      1.1  mrg   expr = "INT_MIN - 0.5";
    216      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    217      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    218      1.1  mrg 
    219      1.1  mrg   mpf_set_si (f, (long) INT_MIN);
    220      1.1  mrg   mpf_sub_ui (f, f, 1L);
    221  1.1.1.3  mrg   expr = "INT_MIN - 1";
    222      1.1  mrg   EXPECT (mpf_fits_sint_p, 0);
    223      1.1  mrg 
    224      1.1  mrg 
    225      1.1  mrg   mpf_set_si (f, LONG_MIN);
    226      1.1  mrg   expr = "LONG_MIN";
    227      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    228      1.1  mrg 
    229      1.1  mrg   mpf_set_si (f, LONG_MIN);
    230      1.1  mrg   mpf_sub (f, f, f0p5);
    231      1.1  mrg   expr = "LONG_MIN - 0.5";
    232      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    233      1.1  mrg 
    234      1.1  mrg   mpf_set_si (f, LONG_MIN);
    235      1.1  mrg   mpf_sub_ui (f, f, 1L);
    236  1.1.1.3  mrg   expr = "LONG_MIN - 1";
    237      1.1  mrg   EXPECT (mpf_fits_slong_p, 0);
    238      1.1  mrg 
    239      1.1  mrg 
    240      1.1  mrg   mpf_set_str_or_abort (f, "0.5", 10);
    241      1.1  mrg   expr = "0.5";
    242      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
    243      1.1  mrg   EXPECT (mpf_fits_uint_p, 1);
    244      1.1  mrg   EXPECT (mpf_fits_ushort_p, 1);
    245      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    246      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    247      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
    248      1.1  mrg 
    249      1.1  mrg   mpf_set_str_or_abort (f, "-0.5", 10);
    250      1.1  mrg   expr = "-0.5";
    251  1.1.1.3  mrg   EXPECT (mpf_fits_ulong_p, 1);
    252  1.1.1.3  mrg   EXPECT (mpf_fits_uint_p, 1);
    253  1.1.1.3  mrg   EXPECT (mpf_fits_ushort_p, 1);
    254  1.1.1.3  mrg   EXPECT (mpf_fits_slong_p, 1);
    255  1.1.1.3  mrg   EXPECT (mpf_fits_sint_p, 1);
    256  1.1.1.3  mrg   EXPECT (mpf_fits_sshort_p, 1);
    257  1.1.1.3  mrg 
    258  1.1.1.3  mrg   mpf_set_str_or_abort (f, "-1.5", 10);
    259  1.1.1.3  mrg   expr = "-1.5";
    260      1.1  mrg   EXPECT (mpf_fits_ulong_p, 0);
    261      1.1  mrg   EXPECT (mpf_fits_uint_p, 0);
    262      1.1  mrg   EXPECT (mpf_fits_ushort_p, 0);
    263      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    264      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    265      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
    266      1.1  mrg 
    267      1.1  mrg 
    268      1.1  mrg   mpf_set_str_or_abort (f, "1.000000000000000000000000000000000001", 16);
    269      1.1  mrg   expr = "1.000000000000000000000000000000000001 base 16";
    270      1.1  mrg   EXPECT (mpf_fits_ulong_p, 1);
    271      1.1  mrg   EXPECT (mpf_fits_uint_p, 1);
    272      1.1  mrg   EXPECT (mpf_fits_ushort_p, 1);
    273      1.1  mrg   EXPECT (mpf_fits_slong_p, 1);
    274      1.1  mrg   EXPECT (mpf_fits_sint_p, 1);
    275      1.1  mrg   EXPECT (mpf_fits_sshort_p, 1);
    276      1.1  mrg 
    277      1.1  mrg   mpf_set_str_or_abort (f, "1@1000", 16);
    278      1.1  mrg   expr = "1@1000 base 16";
    279      1.1  mrg   EXPECT (mpf_fits_ulong_p, 0);
    280      1.1  mrg   EXPECT (mpf_fits_uint_p, 0);
    281      1.1  mrg   EXPECT (mpf_fits_ushort_p, 0);
    282      1.1  mrg   EXPECT (mpf_fits_slong_p, 0);
    283      1.1  mrg   EXPECT (mpf_fits_sint_p, 0);
    284      1.1  mrg   EXPECT (mpf_fits_sshort_p, 0);
    285      1.1  mrg 
    286      1.1  mrg 
    287      1.1  mrg   mpf_set_ui (f, 1L);
    288      1.1  mrg   mpf_mul_2exp (f, f, BITS_PER_ULONG + 1);
    289      1.1  mrg   mpf_sub_ui (f, f, 1L);
    290      1.1  mrg   expr = "2^(BITS_PER_ULONG+1) - 1";
    291      1.1  mrg   EXPECT (mpf_fits_ulong_p, 0);
    292      1.1  mrg   EXPECT (mpf_fits_uint_p, 0);
    293      1.1  mrg   EXPECT (mpf_fits_ushort_p, 0);
    294      1.1  mrg   EXPECT (mpf_fits_slong_p, 0);
    295      1.1  mrg   EXPECT (mpf_fits_sint_p, 0);
    296      1.1  mrg   EXPECT (mpf_fits_sshort_p, 0);
    297      1.1  mrg 
    298      1.1  mrg   mpf_set_ui (f, 1L);
    299      1.1  mrg   mpf_mul_2exp (f, f, BITS_PER_ULONG + 1);
    300  1.1.1.3  mrg   mpf_ui_sub (f, 1L, f);
    301      1.1  mrg   expr = "- (2^(BITS_PER_ULONG+1) - 1)";
    302      1.1  mrg   EXPECT (mpf_fits_ulong_p, 0);
    303      1.1  mrg   EXPECT (mpf_fits_uint_p, 0);
    304      1.1  mrg   EXPECT (mpf_fits_ushort_p, 0);
    305      1.1  mrg   EXPECT (mpf_fits_slong_p, 0);
    306      1.1  mrg   EXPECT (mpf_fits_sint_p, 0);
    307      1.1  mrg   EXPECT (mpf_fits_sshort_p, 0);
    308      1.1  mrg 
    309      1.1  mrg   mpf_set_ui (f, 1L);
    310      1.1  mrg   mpf_mul_2exp (f, f, BITS_PER_ULONG + 5);
    311      1.1  mrg   mpf_sub_ui (f, f, 1L);
    312      1.1  mrg   expr = "2^(BITS_PER_ULONG+5) - 1";
    313      1.1  mrg   EXPECT (mpf_fits_ulong_p, 0);
    314      1.1  mrg   EXPECT (mpf_fits_uint_p, 0);
    315      1.1  mrg   EXPECT (mpf_fits_ushort_p, 0);
    316      1.1  mrg   EXPECT (mpf_fits_slong_p, 0);
    317      1.1  mrg   EXPECT (mpf_fits_sint_p, 0);
    318      1.1  mrg   EXPECT (mpf_fits_sshort_p, 0);
    319      1.1  mrg 
    320      1.1  mrg 
    321      1.1  mrg   if (error)
    322      1.1  mrg     abort ();
    323      1.1  mrg 
    324      1.1  mrg   mpf_clear (f);
    325      1.1  mrg   mpf_clear (f0p5);
    326      1.1  mrg   tests_end ();
    327      1.1  mrg   exit (0);
    328      1.1  mrg }
    329