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