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