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