Home | History | Annotate | Line # | Download | only in tests
tset_sj.c revision 1.1.1.3
      1 /* Test file for
      2    mpfr_set_sj, mpfr_set_uj, mpfr_set_sj_2exp and mpfr_set_uj_2exp.
      3 
      4 Copyright 2004, 2006-2016 Free Software Foundation, Inc.
      5 Contributed by the AriC and Caramba projects, INRIA.
      6 
      7 This file is part of the GNU MPFR Library.
      8 
      9 The GNU MPFR Library is free software; you can redistribute it and/or modify
     10 it under the terms of the GNU Lesser General Public License as published by
     11 the Free Software Foundation; either version 3 of the License, or (at your
     12 option) any later version.
     13 
     14 The GNU MPFR Library is distributed in the hope that it will be useful, but
     15 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     16 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     17 License for more details.
     18 
     19 You should have received a copy of the GNU Lesser General Public License
     20 along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     21 http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     22 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     23 
     24 #ifdef HAVE_CONFIG_H
     25 # include "config.h"       /* for a build within gmp */
     26 #endif
     27 
     28 #include <stdio.h>
     29 #include <stdlib.h>
     30 #include <limits.h>
     31 
     32 #include "mpfr-intmax.h"
     33 #include "mpfr-test.h"
     34 
     35 #ifndef _MPFR_H_HAVE_INTMAX_T
     36 
     37 int
     38 main (void)
     39 {
     40   return 77;
     41 }
     42 
     43 #else
     44 
     45 #define ERROR(str) do { printf ("Error for " str "\n"); exit (1); } while (0)
     46 
     47 static int
     48 inexact_sign (int x)
     49 {
     50   return (x < 0) ? -1 : (x > 0);
     51 }
     52 
     53 static void
     54 check_set_uj (mpfr_prec_t pmin, mpfr_prec_t pmax, int N)
     55 {
     56   mpfr_t x, y;
     57   mpfr_prec_t p;
     58   int inex1, inex2, n;
     59   mp_limb_t limb;
     60 
     61   mpfr_inits2 (pmax, x, y, (mpfr_ptr) 0);
     62 
     63   for ( p = pmin ; p < pmax ; p++)
     64     {
     65       mpfr_set_prec (x, p);
     66       mpfr_set_prec (y, p);
     67       for (n = 0 ; n < N ; n++)
     68         {
     69           /* mp_limb_t may be unsigned long long */
     70           limb = (unsigned long) randlimb ();
     71           inex1 = mpfr_set_uj (x, limb, MPFR_RNDN);
     72           inex2 = mpfr_set_ui (y, limb, MPFR_RNDN);
     73           if (mpfr_cmp (x, y))
     74             {
     75               printf ("ERROR for mpfr_set_uj and j=%lu and p=%lu\n",
     76                       (unsigned long) limb, (unsigned long) p);
     77               printf ("X="); mpfr_dump (x);
     78               printf ("Y="); mpfr_dump (y);
     79               exit (1);
     80             }
     81           if (inexact_sign (inex1) != inexact_sign (inex2))
     82             {
     83               printf ("ERROR for inexact(set_uj): j=%lu p=%lu\n"
     84                       "Inexact1= %d Inexact2= %d\n",
     85                       (unsigned long) limb, (unsigned long) p, inex1, inex2);
     86               exit (1);
     87             }
     88         }
     89     }
     90   /* Special case */
     91   mpfr_set_prec (x, sizeof(uintmax_t)*CHAR_BIT);
     92   inex1 = mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN);
     93   if (inex1 != 0 || mpfr_sgn(x) <= 0)
     94     ERROR ("inexact / UINTMAX_MAX");
     95   inex1 = mpfr_add_ui (x, x, 1, MPFR_RNDN);
     96   if (inex1 != 0 || !mpfr_powerof2_raw (x)
     97       || MPFR_EXP (x) != (sizeof(uintmax_t)*CHAR_BIT+1) )
     98     ERROR ("power of 2");
     99   mpfr_set_uj (x, 0, MPFR_RNDN);
    100   if (!MPFR_IS_ZERO (x))
    101     ERROR ("Setting 0");
    102 
    103   mpfr_clears (x, y, (mpfr_ptr) 0);
    104 }
    105 
    106 static void
    107 check_set_uj_2exp (void)
    108 {
    109   mpfr_t x;
    110   int inex;
    111 
    112   mpfr_init2 (x, sizeof(uintmax_t)*CHAR_BIT);
    113 
    114   inex = mpfr_set_uj_2exp (x, 1, 0, MPFR_RNDN);
    115   if (inex || mpfr_cmp_ui(x, 1))
    116     ERROR("(1U,0)");
    117 
    118   inex = mpfr_set_uj_2exp (x, 1024, -10, MPFR_RNDN);
    119   if (inex || mpfr_cmp_ui(x, 1))
    120     ERROR("(1024U,-10)");
    121 
    122   inex = mpfr_set_uj_2exp (x, 1024, 10, MPFR_RNDN);
    123   if (inex || mpfr_cmp_ui(x, 1024L * 1024L))
    124     ERROR("(1024U,+10)");
    125 
    126   inex = mpfr_set_uj_2exp (x, MPFR_UINTMAX_MAX, 1000, MPFR_RNDN);
    127   inex |= mpfr_div_2ui (x, x, 1000, MPFR_RNDN);
    128   inex |= mpfr_add_ui (x, x, 1, MPFR_RNDN);
    129   if (inex || !mpfr_powerof2_raw (x)
    130       || MPFR_EXP (x) != (sizeof(uintmax_t)*CHAR_BIT+1) )
    131     ERROR("(UINTMAX_MAX)");
    132 
    133   inex = mpfr_set_uj_2exp (x, MPFR_UINTMAX_MAX, MPFR_EMAX_MAX-10, MPFR_RNDN);
    134   if (inex == 0 || !mpfr_inf_p (x))
    135     ERROR ("Overflow");
    136 
    137   inex = mpfr_set_uj_2exp (x, MPFR_UINTMAX_MAX, MPFR_EMIN_MIN-1000, MPFR_RNDN);
    138   if (inex == 0 || !MPFR_IS_ZERO (x))
    139     ERROR ("Underflow");
    140 
    141   mpfr_clear (x);
    142 }
    143 
    144 static void
    145 check_set_sj (void)
    146 {
    147   mpfr_t x;
    148   int inex;
    149 
    150   mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1);
    151 
    152   inex = mpfr_set_sj (x, -MPFR_INTMAX_MAX, MPFR_RNDN);
    153   inex |= mpfr_add_si (x, x, -1, MPFR_RNDN);
    154   if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x)
    155       || MPFR_EXP (x) != (sizeof(intmax_t)*CHAR_BIT) )
    156     ERROR("set_sj (-INTMAX_MAX)");
    157 
    158   inex = mpfr_set_sj (x, 1742, MPFR_RNDN);
    159   if (inex || mpfr_cmp_ui (x, 1742))
    160     ERROR ("set_sj (1742)");
    161 
    162   mpfr_clear (x);
    163 }
    164 
    165 static void
    166 check_set_sj_2exp (void)
    167 {
    168   mpfr_t x;
    169   int inex;
    170 
    171   mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1);
    172 
    173   inex = mpfr_set_sj_2exp (x, MPFR_INTMAX_MIN, 1000, MPFR_RNDN);
    174   if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x)
    175       || MPFR_EXP (x) != (sizeof(intmax_t)*CHAR_BIT+1000) )
    176     ERROR("set_sj_2exp (INTMAX_MIN)");
    177 
    178   mpfr_clear (x);
    179 }
    180 
    181 int
    182 main (int argc, char *argv[])
    183 {
    184   tests_start_mpfr ();
    185 
    186   check_set_uj (2, 128, 50);
    187   check_set_uj_2exp ();
    188   check_set_sj ();
    189   check_set_sj_2exp ();
    190 
    191   tests_end_mpfr ();
    192   return 0;
    193 }
    194 
    195 #endif
    196