Home | History | Annotate | Line # | Download | only in mpcheck
      1  1.1  mrg /* mpcheck-double -- compare mpc functions against "double complex"
      2  1.1  mrg                      from the GNU libc implementation
      3  1.1  mrg 
      4  1.1  mrg Copyright (C) 2020 INRIA
      5  1.1  mrg 
      6  1.1  mrg This file is part of GNU MPC.
      7  1.1  mrg 
      8  1.1  mrg GNU MPC is free software; you can redistribute it and/or modify it under
      9  1.1  mrg the terms of the GNU Lesser General Public License as published by the
     10  1.1  mrg 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 GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
     14  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
     15  1.1  mrg FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
     16  1.1  mrg 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 this program. If not, see http://www.gnu.org/licenses/ .
     20  1.1  mrg */
     21  1.1  mrg 
     22  1.1  mrg /* the GNU libc provides the following functions (as of 2.31),
     23  1.1  mrg    with 'f' suffix for the float/binary32 version, with no suffix
     24  1.1  mrg    for the double/binary64 version, with 'l' suffix for the long double
     25  1.1  mrg    version, and with 'f128' suffix for the __float128 version:
     26  1.1  mrg 
     27  1.1  mrg    cabs     casinh    cexp      csinh
     28  1.1  mrg    cacos    catan     clog      csqrt
     29  1.1  mrg    cacosh   catanh    clog10    ctan
     30  1.1  mrg    carg     ccos      cpow      ctanh
     31  1.1  mrg    casin    ccosh     csin
     32  1.1  mrg */
     33  1.1  mrg 
     34  1.1  mrg #define _GNU_SOURCE /* for clog10 */
     35  1.1  mrg #include <stdio.h>
     36  1.1  mrg #include <stdlib.h>
     37  1.1  mrg #include <string.h>
     38  1.1  mrg #include <complex.h>
     39  1.1  mrg #include <sys/types.h>
     40  1.1  mrg #include <unistd.h>
     41  1.1  mrg #include <assert.h>
     42  1.1  mrg #ifdef __GNUC__
     43  1.1  mrg #include <gnu/libc-version.h>
     44  1.1  mrg #endif
     45  1.1  mrg #include "mpc.h"
     46  1.1  mrg 
     47  1.1  mrg #define PRECISION 53
     48  1.1  mrg #define EMAX 1024
     49  1.1  mrg #define TYPE double
     50  1.1  mrg #define SUFFIX
     51  1.1  mrg 
     52  1.1  mrg #define mpc_get_type mpc_get_dc
     53  1.1  mrg #define mpc_set_type mpc_set_dc
     54  1.1  mrg #define mpfr_set_type mpfr_set_d
     55  1.1  mrg 
     56  1.1  mrg gmp_randstate_t state;
     57  1.1  mrg mpz_t expz; /* global variable used in mpcheck_random */
     58  1.1  mrg unsigned long seed = 0;
     59  1.1  mrg int verbose = 0;
     60  1.1  mrg mpfr_exp_t emin, emax;
     61  1.1  mrg 
     62  1.1  mrg #include "mpcheck-common.c"
     63  1.1  mrg 
     64  1.1  mrg #define FOO add
     65  1.1  mrg #define CFOO(x,y) (x+y)
     66  1.1  mrg #include "mpcheck-template3.c"
     67  1.1  mrg 
     68  1.1  mrg #define FOO sub
     69  1.1  mrg #define CFOO(x,y) (x-y)
     70  1.1  mrg #include "mpcheck-template3.c"
     71  1.1  mrg 
     72  1.1  mrg #define FOO mul
     73  1.1  mrg #define CFOO(x,y) (x*y)
     74  1.1  mrg #include "mpcheck-template3.c"
     75  1.1  mrg 
     76  1.1  mrg #define FOO div
     77  1.1  mrg #define CFOO(x,y) (x/y)
     78  1.1  mrg #include "mpcheck-template3.c"
     79  1.1  mrg 
     80  1.1  mrg #define FOO pow
     81  1.1  mrg #include "mpcheck-template3.c"
     82  1.1  mrg 
     83  1.1  mrg #define FOO abs
     84  1.1  mrg #include "mpcheck-template2.c"
     85  1.1  mrg 
     86  1.1  mrg #define FOO arg
     87  1.1  mrg #include "mpcheck-template2.c"
     88  1.1  mrg 
     89  1.1  mrg #define FOO sqrt
     90  1.1  mrg #include "mpcheck-template1.c"
     91  1.1  mrg 
     92  1.1  mrg #define FOO acos
     93  1.1  mrg #include "mpcheck-template1.c"
     94  1.1  mrg 
     95  1.1  mrg #define FOO acosh
     96  1.1  mrg #include "mpcheck-template1.c"
     97  1.1  mrg 
     98  1.1  mrg #define FOO asin
     99  1.1  mrg #include "mpcheck-template1.c"
    100  1.1  mrg 
    101  1.1  mrg #define FOO asinh
    102  1.1  mrg #include "mpcheck-template1.c"
    103  1.1  mrg 
    104  1.1  mrg #define FOO atan
    105  1.1  mrg #include "mpcheck-template1.c"
    106  1.1  mrg 
    107  1.1  mrg #define FOO atanh
    108  1.1  mrg #include "mpcheck-template1.c"
    109  1.1  mrg 
    110  1.1  mrg #define FOO cos
    111  1.1  mrg #include "mpcheck-template1.c"
    112  1.1  mrg 
    113  1.1  mrg #define FOO cosh
    114  1.1  mrg #include "mpcheck-template1.c"
    115  1.1  mrg 
    116  1.1  mrg #define FOO exp
    117  1.1  mrg #include "mpcheck-template1.c"
    118  1.1  mrg 
    119  1.1  mrg #define FOO log
    120  1.1  mrg #include "mpcheck-template1.c"
    121  1.1  mrg 
    122  1.1  mrg #define FOO log10
    123  1.1  mrg #include "mpcheck-template1.c"
    124  1.1  mrg 
    125  1.1  mrg #define FOO sin
    126  1.1  mrg #include "mpcheck-template1.c"
    127  1.1  mrg 
    128  1.1  mrg #define FOO sinh
    129  1.1  mrg #include "mpcheck-template1.c"
    130  1.1  mrg 
    131  1.1  mrg /* use reduced exponent range for tan and tanh */
    132  1.1  mrg #define FOO_EMIN -8
    133  1.1  mrg #define FOO_EMAX  8
    134  1.1  mrg 
    135  1.1  mrg #define FOO tan
    136  1.1  mrg #include "mpcheck-template1.c"
    137  1.1  mrg 
    138  1.1  mrg #define FOO tanh
    139  1.1  mrg #include "mpcheck-template1.c"
    140  1.1  mrg 
    141  1.1  mrg #undef FOO_EMIN
    142  1.1  mrg #undef FOO_EMAX
    143  1.1  mrg 
    144  1.1  mrg int
    145  1.1  mrg main (int argc, char *argv[])
    146  1.1  mrg {
    147  1.1  mrg   mpfr_prec_t p = PRECISION; /* precision of 'double' */
    148  1.1  mrg   unsigned long n = 1000000; /* default number of random tests per function */
    149  1.1  mrg 
    150  1.1  mrg   while (argc >= 2 && argv[1][0] == '-')
    151  1.1  mrg     {
    152  1.1  mrg       if (argc >= 3 && strcmp (argv[1], "-p") == 0)
    153  1.1  mrg         {
    154  1.1  mrg           p = atoi (argv[2]);
    155  1.1  mrg           argc -= 2;
    156  1.1  mrg           argv += 2;
    157  1.1  mrg         }
    158  1.1  mrg       else if (argc >= 3 && strcmp (argv[1], "-seed") == 0)
    159  1.1  mrg         {
    160  1.1  mrg           seed = atoi (argv[2]);
    161  1.1  mrg           argc -= 2;
    162  1.1  mrg           argv += 2;
    163  1.1  mrg         }
    164  1.1  mrg       else if (argc >= 3 && strcmp (argv[1], "-num") == 0)
    165  1.1  mrg         {
    166  1.1  mrg           n = atoi (argv[2]);
    167  1.1  mrg           argc -= 2;
    168  1.1  mrg           argv += 2;
    169  1.1  mrg         }
    170  1.1  mrg       else if (strcmp (argv[1], "-v") == 0)
    171  1.1  mrg         {
    172  1.1  mrg           verbose ++;
    173  1.1  mrg           argc --;
    174  1.1  mrg           argv ++;
    175  1.1  mrg         }
    176  1.1  mrg       else if (strcmp (argv[1], "-check") == 0)
    177  1.1  mrg         {
    178  1.1  mrg           recheck = 1;
    179  1.1  mrg           argc --;
    180  1.1  mrg           argv ++;
    181  1.1  mrg         }
    182  1.1  mrg       else
    183  1.1  mrg         {
    184  1.1  mrg           fprintf (stderr, "Unknown option %s\n", argv[1]);
    185  1.1  mrg           exit (1);
    186  1.1  mrg         }
    187  1.1  mrg     }
    188  1.1  mrg 
    189  1.1  mrg   /* set exponent range */
    190  1.1  mrg   emin = -EMAX - PRECISION + 4; /* should be -1073 */
    191  1.1  mrg   emax = EMAX;
    192  1.1  mrg   mpfr_set_emin (emin);
    193  1.1  mrg   mpfr_set_emax (emax);
    194  1.1  mrg 
    195  1.1  mrg   gmp_randinit_default (state);
    196  1.1  mrg   mpz_init (expz);
    197  1.1  mrg 
    198  1.1  mrg   printf ("Using GMP %s, MPFR %s\n", gmp_version, mpfr_get_version ());
    199  1.1  mrg 
    200  1.1  mrg #ifdef __GNUC__
    201  1.1  mrg   printf ("GNU libc version: %s\n", gnu_get_libc_version ());
    202  1.1  mrg   printf ("GNU libc release: %s\n", gnu_get_libc_release ());
    203  1.1  mrg #endif
    204  1.1  mrg 
    205  1.1  mrg   if (seed == 0)
    206  1.1  mrg     seed = getpid ();
    207  1.1  mrg   printf ("Using random seed %lu\n", seed);
    208  1.1  mrg 
    209  1.1  mrg   /* (complex,complex) -> complex */
    210  1.1  mrg   test_add (p, n);
    211  1.1  mrg   test_sub (p, n);
    212  1.1  mrg   test_mul (p, n);
    213  1.1  mrg   test_div (p, n);
    214  1.1  mrg   test_pow (p, n);
    215  1.1  mrg 
    216  1.1  mrg   /* complex -> real */
    217  1.1  mrg   test_abs (p, n);
    218  1.1  mrg   test_arg (p, n);
    219  1.1  mrg 
    220  1.1  mrg   /* complex -> complex */
    221  1.1  mrg   test_sqrt (p, n);
    222  1.1  mrg   test_acos (p, n);
    223  1.1  mrg   test_acosh (p, n);
    224  1.1  mrg   test_asin (p, n);
    225  1.1  mrg   test_asinh (p, n);
    226  1.1  mrg   test_atan (p, n);
    227  1.1  mrg   test_atanh (p, n);
    228  1.1  mrg   test_cos (p, n);
    229  1.1  mrg   test_cosh (p, n);
    230  1.1  mrg   test_exp (p, n);
    231  1.1  mrg   test_log (p, n);
    232  1.1  mrg   test_log10 (p, n);
    233  1.1  mrg   test_sin (p, n);
    234  1.1  mrg   test_sinh (p, n);
    235  1.1  mrg   test_tan (p, n);
    236  1.1  mrg   test_tanh (p, n);
    237  1.1  mrg 
    238  1.1  mrg   gmp_randclear (state);
    239  1.1  mrg   mpz_clear (expz);
    240  1.1  mrg 
    241  1.1  mrg   report_maximal_errors ();
    242  1.1  mrg 
    243  1.1  mrg   return 0;
    244  1.1  mrg }
    245