Home | History | Annotate | Line # | Download | only in mpcheck
      1  1.1  mrg /* mpcheck-float128 -- compare mpc functions against "__float128 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 #define MPFR_WANT_FLOAT128
     43  1.1  mrg #include "mpc.h"
     44  1.1  mrg #ifdef __GNUC__
     45  1.1  mrg #include <gnu/libc-version.h>
     46  1.1  mrg #endif
     47  1.1  mrg 
     48  1.1  mrg #define PRECISION 113
     49  1.1  mrg #define EMAX 16384
     50  1.1  mrg #define TYPE _Float128
     51  1.1  mrg #define SUFFIX f128
     52  1.1  mrg 
     53  1.1  mrg #define mpfr_set_type mpfr_set_float128
     54  1.1  mrg 
     55  1.1  mrg static TYPE complex
     56  1.1  mrg mpc_get_type (mpc_t z, mpc_rnd_t rnd)
     57  1.1  mrg {
     58  1.1  mrg   TYPE x, y;
     59  1.1  mrg   /* there is no mpc_get_float128c function */
     60  1.1  mrg   x = mpfr_get_float128 (mpc_realref (z), MPC_RND_RE(rnd));
     61  1.1  mrg   y = mpfr_get_float128 (mpc_imagref (z), MPC_RND_IM(rnd));
     62  1.1  mrg   return x + I * y;
     63  1.1  mrg }
     64  1.1  mrg 
     65  1.1  mrg static int
     66  1.1  mrg mpc_set_type (mpc_t x, TYPE complex y, mpc_rnd_t rnd)
     67  1.1  mrg {
     68  1.1  mrg   /* there is no mpc_set_float128c function */
     69  1.1  mrg   mpfr_set_float128 (mpc_realref (x), crealf128 (y), MPC_RND_RE(rnd));
     70  1.1  mrg   mpfr_set_float128 (mpc_imagref (x), cimagf128 (y), MPC_RND_IM(rnd));
     71  1.1  mrg }
     72  1.1  mrg 
     73  1.1  mrg gmp_randstate_t state;
     74  1.1  mrg mpz_t expz; /* global variable used in mpcheck_random */
     75  1.1  mrg unsigned long seed = 0;
     76  1.1  mrg int verbose = 0;
     77  1.1  mrg mpfr_exp_t emin, emax;
     78  1.1  mrg 
     79  1.1  mrg #include "mpcheck-common.c"
     80  1.1  mrg 
     81  1.1  mrg #define FOO add
     82  1.1  mrg #define CFOO(x,y) (x+y)
     83  1.1  mrg #include "mpcheck-template3.c"
     84  1.1  mrg 
     85  1.1  mrg #define FOO sub
     86  1.1  mrg #define CFOO(x,y) (x-y)
     87  1.1  mrg #include "mpcheck-template3.c"
     88  1.1  mrg 
     89  1.1  mrg #define FOO mul
     90  1.1  mrg #define CFOO(x,y) (x*y)
     91  1.1  mrg #include "mpcheck-template3.c"
     92  1.1  mrg 
     93  1.1  mrg #define FOO div
     94  1.1  mrg #define CFOO(x,y) (x/y)
     95  1.1  mrg #include "mpcheck-template3.c"
     96  1.1  mrg 
     97  1.1  mrg #define FOO pow
     98  1.1  mrg #include "mpcheck-template3.c"
     99  1.1  mrg 
    100  1.1  mrg #define FOO abs
    101  1.1  mrg #include "mpcheck-template2.c"
    102  1.1  mrg 
    103  1.1  mrg #define FOO arg
    104  1.1  mrg #include "mpcheck-template2.c"
    105  1.1  mrg 
    106  1.1  mrg #define FOO sqrt
    107  1.1  mrg #include "mpcheck-template1.c"
    108  1.1  mrg 
    109  1.1  mrg #define FOO acos
    110  1.1  mrg #include "mpcheck-template1.c"
    111  1.1  mrg 
    112  1.1  mrg #define FOO acosh
    113  1.1  mrg #include "mpcheck-template1.c"
    114  1.1  mrg 
    115  1.1  mrg #define FOO asin
    116  1.1  mrg #include "mpcheck-template1.c"
    117  1.1  mrg 
    118  1.1  mrg #define FOO asinh
    119  1.1  mrg #include "mpcheck-template1.c"
    120  1.1  mrg 
    121  1.1  mrg #define FOO atan
    122  1.1  mrg #include "mpcheck-template1.c"
    123  1.1  mrg 
    124  1.1  mrg #define FOO atanh
    125  1.1  mrg #include "mpcheck-template1.c"
    126  1.1  mrg 
    127  1.1  mrg #define FOO cos
    128  1.1  mrg #include "mpcheck-template1.c"
    129  1.1  mrg 
    130  1.1  mrg #define FOO cosh
    131  1.1  mrg #include "mpcheck-template1.c"
    132  1.1  mrg 
    133  1.1  mrg #define FOO exp
    134  1.1  mrg #include "mpcheck-template1.c"
    135  1.1  mrg 
    136  1.1  mrg #define FOO log
    137  1.1  mrg #include "mpcheck-template1.c"
    138  1.1  mrg 
    139  1.1  mrg #define FOO log10
    140  1.1  mrg #include "mpcheck-template1.c"
    141  1.1  mrg 
    142  1.1  mrg #define FOO sin
    143  1.1  mrg #include "mpcheck-template1.c"
    144  1.1  mrg 
    145  1.1  mrg #define FOO sinh
    146  1.1  mrg #include "mpcheck-template1.c"
    147  1.1  mrg 
    148  1.1  mrg #define FOO tan
    149  1.1  mrg #include "mpcheck-template1.c"
    150  1.1  mrg 
    151  1.1  mrg #define FOO tanh
    152  1.1  mrg #include "mpcheck-template1.c"
    153  1.1  mrg 
    154  1.1  mrg int
    155  1.1  mrg main (int argc, char *argv[])
    156  1.1  mrg {
    157  1.1  mrg   mpfr_prec_t p = PRECISION; /* precision of 'double' */
    158  1.1  mrg   unsigned long n = 1000000; /* default number of random tests per function */
    159  1.1  mrg 
    160  1.1  mrg   while (argc >= 2 && argv[1][0] == '-')
    161  1.1  mrg     {
    162  1.1  mrg       if (argc >= 3 && strcmp (argv[1], "-p") == 0)
    163  1.1  mrg         {
    164  1.1  mrg           p = atoi (argv[2]);
    165  1.1  mrg           argc -= 2;
    166  1.1  mrg           argv += 2;
    167  1.1  mrg         }
    168  1.1  mrg       else if (argc >= 3 && strcmp (argv[1], "-seed") == 0)
    169  1.1  mrg         {
    170  1.1  mrg           seed = atoi (argv[2]);
    171  1.1  mrg           argc -= 2;
    172  1.1  mrg           argv += 2;
    173  1.1  mrg         }
    174  1.1  mrg       else if (argc >= 3 && strcmp (argv[1], "-num") == 0)
    175  1.1  mrg         {
    176  1.1  mrg           n = atoi (argv[2]);
    177  1.1  mrg           argc -= 2;
    178  1.1  mrg           argv += 2;
    179  1.1  mrg         }
    180  1.1  mrg       else if (strcmp (argv[1], "-v") == 0)
    181  1.1  mrg         {
    182  1.1  mrg           verbose ++;
    183  1.1  mrg           argc --;
    184  1.1  mrg           argv ++;
    185  1.1  mrg         }
    186  1.1  mrg       else if (strcmp (argv[1], "-check") == 0)
    187  1.1  mrg         {
    188  1.1  mrg           recheck = 1;
    189  1.1  mrg           argc --;
    190  1.1  mrg           argv ++;
    191  1.1  mrg         }
    192  1.1  mrg       else
    193  1.1  mrg         {
    194  1.1  mrg           fprintf (stderr, "Unknown option %s\n", argv[1]);
    195  1.1  mrg           exit (1);
    196  1.1  mrg         }
    197  1.1  mrg     }
    198  1.1  mrg 
    199  1.1  mrg   /* set exponent range */
    200  1.1  mrg   emin = -EMAX - 64 + 4; /* should be -16444 like for long double */
    201  1.1  mrg   emax = EMAX;
    202  1.1  mrg   mpfr_set_emin (emin);
    203  1.1  mrg   mpfr_set_emax (emax);
    204  1.1  mrg 
    205  1.1  mrg   gmp_randinit_default (state);
    206  1.1  mrg   mpz_init (expz);
    207  1.1  mrg 
    208  1.1  mrg   printf ("Using GMP %s, MPFR %s\n", gmp_version, mpfr_get_version ());
    209  1.1  mrg 
    210  1.1  mrg #ifdef __GNUC__
    211  1.1  mrg   printf ("GNU libc version: %s\n", gnu_get_libc_version ());
    212  1.1  mrg   printf ("GNU libc release: %s\n", gnu_get_libc_release ());
    213  1.1  mrg #endif
    214  1.1  mrg 
    215  1.1  mrg   if (seed == 0)
    216  1.1  mrg     seed = getpid ();
    217  1.1  mrg   printf ("Using random seed %lu\n", seed);
    218  1.1  mrg 
    219  1.1  mrg   /* (complex,complex) -> complex */
    220  1.1  mrg   test_add (p, n);
    221  1.1  mrg   test_sub (p, n);
    222  1.1  mrg   test_mul (p, n);
    223  1.1  mrg   test_div (p, n);
    224  1.1  mrg   test_pow (p, n);
    225  1.1  mrg 
    226  1.1  mrg   /* complex -> real */
    227  1.1  mrg   test_abs (p, n);
    228  1.1  mrg   test_arg (p, n);
    229  1.1  mrg 
    230  1.1  mrg   /* complex -> complex */
    231  1.1  mrg   test_sqrt (p, n);
    232  1.1  mrg   test_acos (p, n);
    233  1.1  mrg   test_acosh (p, n);
    234  1.1  mrg   test_asin (p, n);
    235  1.1  mrg   test_asinh (p, n);
    236  1.1  mrg   test_atan (p, n);
    237  1.1  mrg   test_atanh (p, n);
    238  1.1  mrg   test_cos (p, n);
    239  1.1  mrg   test_cosh (p, n);
    240  1.1  mrg   test_exp (p, n);
    241  1.1  mrg   test_log (p, n);
    242  1.1  mrg   test_log10 (p, n);
    243  1.1  mrg   test_sin (p, n);
    244  1.1  mrg   test_sinh (p, n);
    245  1.1  mrg   test_tan (p, n);
    246  1.1  mrg   test_tanh (p, n);
    247  1.1  mrg 
    248  1.1  mrg   gmp_randclear (state);
    249  1.1  mrg   mpz_clear (expz);
    250  1.1  mrg 
    251  1.1  mrg   report_maximal_errors ();
    252  1.1  mrg 
    253  1.1  mrg   return 0;
    254  1.1  mrg }
    255