Home | History | Annotate | Line # | Download | only in mpf
      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