Home | History | Annotate | Line # | Download | only in tests
      1      1.1  mrg /* Test file for mpfr_grandom
      2      1.1  mrg 
      3  1.1.1.5  mrg Copyright 2011-2023 Free Software Foundation, Inc.
      4  1.1.1.2  mrg Contributed by the AriC and Caramba projects, INRIA.
      5      1.1  mrg 
      6      1.1  mrg This file is part of the GNU MPFR Library.
      7      1.1  mrg 
      8      1.1  mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
      9      1.1  mrg it under the terms of the GNU Lesser General Public License as published by
     10      1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     11      1.1  mrg option) any later version.
     12      1.1  mrg 
     13      1.1  mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     14      1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15      1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     16      1.1  mrg License for more details.
     17      1.1  mrg 
     18      1.1  mrg You should have received a copy of the GNU Lesser General Public License
     19      1.1  mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     20  1.1.1.4  mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     21      1.1  mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     22      1.1  mrg 
     23  1.1.1.3  mrg #define _MPFR_NO_DEPRECATED_GRANDOM
     24      1.1  mrg #include "mpfr-test.h"
     25      1.1  mrg 
     26      1.1  mrg static void
     27      1.1  mrg test_special (mpfr_prec_t p)
     28      1.1  mrg {
     29      1.1  mrg   mpfr_t x;
     30      1.1  mrg   int inexact;
     31      1.1  mrg 
     32      1.1  mrg   mpfr_init2 (x, p);
     33      1.1  mrg 
     34      1.1  mrg   inexact = mpfr_grandom (x, NULL, RANDS, MPFR_RNDN);
     35  1.1.1.3  mrg   if (((unsigned int) inexact & 3) == 0)
     36      1.1  mrg     {
     37      1.1  mrg       printf ("Error: mpfr_grandom() returns a zero ternary value.\n");
     38      1.1  mrg       exit (1);
     39      1.1  mrg     }
     40  1.1.1.3  mrg   if (((unsigned int) inexact & (3 << 2)) != 0)
     41      1.1  mrg     {
     42      1.1  mrg       printf ("Error: the second ternary value of mpfr_grandom(x, NULL, ...)"
     43      1.1  mrg               " must be 0.\n");
     44      1.1  mrg       exit (1);
     45      1.1  mrg     }
     46      1.1  mrg 
     47  1.1.1.3  mrg   mpfr_clear (x);
     48      1.1  mrg }
     49      1.1  mrg 
     50      1.1  mrg 
     51      1.1  mrg static void
     52      1.1  mrg test_grandom (long nbtests, mpfr_prec_t prec, mpfr_rnd_t rnd,
     53      1.1  mrg               int verbose)
     54      1.1  mrg {
     55      1.1  mrg   mpfr_t *t;
     56      1.1  mrg   int i, inexact;
     57      1.1  mrg 
     58      1.1  mrg   nbtests = (nbtests & 1) ? (nbtests + 1) : nbtests;
     59  1.1.1.2  mrg   t = (mpfr_t *) tests_allocate (nbtests * sizeof (mpfr_t));
     60      1.1  mrg 
     61      1.1  mrg   for (i = 0; i < nbtests; ++i)
     62      1.1  mrg     mpfr_init2 (t[i], prec);
     63      1.1  mrg 
     64      1.1  mrg   for (i = 0; i < nbtests; i += 2)
     65      1.1  mrg     {
     66      1.1  mrg       inexact = mpfr_grandom (t[i], t[i + 1], RANDS, MPFR_RNDN);
     67  1.1.1.3  mrg       if (((unsigned int) inexact & 3) == 0 ||
     68  1.1.1.3  mrg           ((unsigned int) inexact & (3 << 2)) == 0)
     69      1.1  mrg         {
     70      1.1  mrg           /* one call in the loop pretended to return an exact number! */
     71      1.1  mrg           printf ("Error: mpfr_grandom() returns a zero ternary value.\n");
     72      1.1  mrg           exit (1);
     73      1.1  mrg         }
     74      1.1  mrg     }
     75      1.1  mrg 
     76  1.1.1.3  mrg #if defined(HAVE_STDARG) && !defined(MPFR_USE_MINI_GMP)
     77      1.1  mrg   if (verbose)
     78      1.1  mrg     {
     79  1.1.1.3  mrg       mpfr_t av, va, tmp;
     80  1.1.1.3  mrg 
     81      1.1  mrg       mpfr_init2 (av, prec);
     82      1.1  mrg       mpfr_init2 (va, prec);
     83      1.1  mrg       mpfr_init2 (tmp, prec);
     84      1.1  mrg 
     85      1.1  mrg       mpfr_set_ui (av, 0, MPFR_RNDN);
     86      1.1  mrg       mpfr_set_ui (va, 0, MPFR_RNDN);
     87      1.1  mrg       for (i = 0; i < nbtests; ++i)
     88      1.1  mrg         {
     89      1.1  mrg           mpfr_add (av, av, t[i], MPFR_RNDN);
     90      1.1  mrg           mpfr_sqr (tmp, t[i], MPFR_RNDN);
     91      1.1  mrg           mpfr_add (va, va, tmp, MPFR_RNDN);
     92      1.1  mrg         }
     93      1.1  mrg       mpfr_div_ui (av, av, nbtests, MPFR_RNDN);
     94      1.1  mrg       mpfr_div_ui (va, va, nbtests, MPFR_RNDN);
     95      1.1  mrg       mpfr_sqr (tmp, av, MPFR_RNDN);
     96      1.1  mrg       mpfr_sub (va, va, av, MPFR_RNDN);
     97      1.1  mrg 
     98      1.1  mrg       mpfr_printf ("Average = %.5Rf\nVariance = %.5Rf\n", av, va);
     99      1.1  mrg       mpfr_clear (av);
    100      1.1  mrg       mpfr_clear (va);
    101      1.1  mrg       mpfr_clear (tmp);
    102      1.1  mrg     }
    103      1.1  mrg #endif /* HAVE_STDARG */
    104      1.1  mrg 
    105      1.1  mrg   for (i = 0; i < nbtests; ++i)
    106      1.1  mrg     mpfr_clear (t[i]);
    107  1.1.1.2  mrg   tests_free (t, nbtests * sizeof (mpfr_t));
    108      1.1  mrg   return;
    109      1.1  mrg }
    110      1.1  mrg 
    111      1.1  mrg 
    112      1.1  mrg int
    113      1.1  mrg main (int argc, char *argv[])
    114      1.1  mrg {
    115      1.1  mrg   long nbtests;
    116      1.1  mrg   int verbose;
    117  1.1.1.4  mrg   int i;
    118  1.1.1.3  mrg 
    119      1.1  mrg   tests_start_mpfr ();
    120      1.1  mrg 
    121      1.1  mrg   verbose = 0;
    122      1.1  mrg   nbtests = 10;
    123      1.1  mrg   if (argc > 1)
    124      1.1  mrg     {
    125      1.1  mrg       long a = atol (argv[1]);
    126      1.1  mrg       verbose = 1;
    127      1.1  mrg       if (a != 0)
    128      1.1  mrg         nbtests = a;
    129      1.1  mrg     }
    130      1.1  mrg 
    131      1.1  mrg   test_grandom (nbtests, 420, MPFR_RNDN, verbose);
    132      1.1  mrg   test_special (2);
    133      1.1  mrg   test_special (42000);
    134  1.1.1.4  mrg   /* the following should exercise the case "Extend by 32 bits" in grandom.c */
    135  1.1.1.4  mrg   for (i = 0; i < 10000; i++)
    136  1.1.1.4  mrg     test_special (1);
    137      1.1  mrg 
    138      1.1  mrg   tests_end_mpfr ();
    139      1.1  mrg   return 0;
    140      1.1  mrg }
    141