Home | History | Annotate | Line # | Download | only in tests
tgrandom.c revision 1.1.1.2
      1      1.1  mrg /* Test file for mpfr_grandom
      2      1.1  mrg 
      3  1.1.1.2  mrg Copyright 2011-2016 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  mrg http://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  mrg #include <stdio.h>
     24      1.1  mrg #include <stdlib.h>
     25      1.1  mrg 
     26      1.1  mrg #include "mpfr-test.h"
     27      1.1  mrg 
     28      1.1  mrg static void
     29      1.1  mrg test_special (mpfr_prec_t p)
     30      1.1  mrg {
     31      1.1  mrg   mpfr_t x;
     32      1.1  mrg   int inexact;
     33      1.1  mrg 
     34      1.1  mrg   mpfr_init2 (x, p);
     35      1.1  mrg 
     36      1.1  mrg   inexact = mpfr_grandom (x, NULL, RANDS, MPFR_RNDN);
     37      1.1  mrg   if ((inexact & 3) == 0)
     38      1.1  mrg     {
     39      1.1  mrg       printf ("Error: mpfr_grandom() returns a zero ternary value.\n");
     40      1.1  mrg       exit (1);
     41      1.1  mrg     }
     42      1.1  mrg   if ((inexact & (3 << 2)) != 0)
     43      1.1  mrg     {
     44      1.1  mrg       printf ("Error: the second ternary value of mpfr_grandom(x, NULL, ...)"
     45      1.1  mrg               " must be 0.\n");
     46      1.1  mrg       exit (1);
     47      1.1  mrg     }
     48      1.1  mrg 
     49      1.1  mrg   mpfr_clear(x);
     50      1.1  mrg }
     51      1.1  mrg 
     52      1.1  mrg 
     53      1.1  mrg static void
     54      1.1  mrg test_grandom (long nbtests, mpfr_prec_t prec, mpfr_rnd_t rnd,
     55      1.1  mrg               int verbose)
     56      1.1  mrg {
     57      1.1  mrg   mpfr_t *t;
     58      1.1  mrg   mpfr_t av, va, tmp;
     59      1.1  mrg   int i, inexact;
     60      1.1  mrg 
     61      1.1  mrg   nbtests = (nbtests & 1) ? (nbtests + 1) : nbtests;
     62  1.1.1.2  mrg   t = (mpfr_t *) tests_allocate (nbtests * sizeof (mpfr_t));
     63      1.1  mrg 
     64      1.1  mrg   for (i = 0; i < nbtests; ++i)
     65      1.1  mrg     mpfr_init2 (t[i], prec);
     66      1.1  mrg 
     67      1.1  mrg   for (i = 0; i < nbtests; i += 2)
     68      1.1  mrg     {
     69      1.1  mrg       inexact = mpfr_grandom (t[i], t[i + 1], RANDS, MPFR_RNDN);
     70      1.1  mrg       if ((inexact & 3) == 0 || (inexact & (3 << 2)) == 0)
     71      1.1  mrg         {
     72      1.1  mrg           /* one call in the loop pretended to return an exact number! */
     73      1.1  mrg           printf ("Error: mpfr_grandom() returns a zero ternary value.\n");
     74      1.1  mrg           exit (1);
     75      1.1  mrg         }
     76      1.1  mrg     }
     77      1.1  mrg 
     78      1.1  mrg #ifdef HAVE_STDARG
     79      1.1  mrg   if (verbose)
     80      1.1  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  mrg   tests_start_mpfr ();
    118      1.1  mrg 
    119      1.1  mrg   verbose = 0;
    120      1.1  mrg   nbtests = 10;
    121      1.1  mrg   if (argc > 1)
    122      1.1  mrg     {
    123      1.1  mrg       long a = atol (argv[1]);
    124      1.1  mrg       verbose = 1;
    125      1.1  mrg       if (a != 0)
    126      1.1  mrg         nbtests = a;
    127      1.1  mrg     }
    128      1.1  mrg 
    129      1.1  mrg   test_grandom (nbtests, 420, MPFR_RNDN, verbose);
    130      1.1  mrg   test_special (2);
    131      1.1  mrg   test_special (42000);
    132      1.1  mrg 
    133      1.1  mrg   tests_end_mpfr ();
    134      1.1  mrg   return 0;
    135      1.1  mrg }
    136