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