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