1 1.1 mrg /* exceptions -- test file for exceptions 2 1.1 mrg 3 1.1 mrg Copyright (C) 2015, 2022 INRIA 4 1.1 mrg 5 1.1 mrg This file is part of GNU MPC. 6 1.1 mrg 7 1.1 mrg GNU MPC is free software; you can redistribute it and/or modify it under 8 1.1 mrg the terms of the GNU Lesser General Public License as published by the 9 1.1 mrg Free Software Foundation; either version 3 of the License, or (at your 10 1.1 mrg option) any later version. 11 1.1 mrg 12 1.1 mrg GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY 13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14 1.1 mrg FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 15 1.1 mrg more details. 16 1.1 mrg 17 1.1 mrg You should have received a copy of the GNU Lesser General Public License 18 1.1 mrg along with this program. If not, see http://www.gnu.org/licenses/ . 19 1.1 mrg */ 20 1.1 mrg 21 1.1 mrg #include "mpc-tests.h" 22 1.1 mrg 23 1.1 mrg /* Return non-zero if 'rnd' rounds towards zero, for a number of sign 'sgn' */ 24 1.1 mrg #define MPC_IS_LIKE_RNDZ(rnd, sgn) \ 25 1.1 mrg ((rnd==MPFR_RNDZ) || (sgn<0 && rnd==MPFR_RNDU) || (sgn>0 && rnd==MPFR_RNDD)) 26 1.1 mrg 27 1.1 mrg #define MPFR_SGN(x) (mpfr_signbit (x) ? -1 : 1) 28 1.1 mrg 29 1.1 mrg static void 30 1.1 mrg foo (int f(mpc_ptr, mpc_srcptr, mpc_rnd_t), const char *s) 31 1.1 mrg { 32 1.1 mrg mpc_t z, t; 33 1.1 mrg mpfr_rnd_t rnd_re, rnd_im; 34 1.1 mrg mpc_rnd_t rnd; 35 1.1 mrg #define N 5 36 1.1 mrg mpfr_exp_t exy[N][2] = {{200, 800}, {800, 200}, {-50, 50}, {-10, 1000}, 37 1.1 mrg {0, 1000}}; 38 1.1 mrg int n, inex, inex_re, inex_im, sgn; 39 1.1 mrg 40 1.1 mrg mpc_init2 (z, MPFR_PREC_MIN); 41 1.1 mrg mpc_init2 (t, MPFR_PREC_MIN); 42 1.1 mrg for (n = 0; n < N; n++) 43 1.1 mrg for (sgn = 0; sgn < 4; sgn++) 44 1.1 mrg { 45 1.1 mrg if (exy[n][0]) 46 1.1 mrg mpfr_set_ui_2exp (mpc_realref (z), 1, exy[n][0], MPFR_RNDN); 47 1.1 mrg else 48 1.1 mrg mpfr_set_ui (mpc_realref (z), 0, MPFR_RNDN); 49 1.1 mrg if (sgn & 1) 50 1.1 mrg mpfr_neg (mpc_realref (z), mpc_realref (z), MPFR_RNDN); 51 1.1 mrg if (exy[n][1]) 52 1.1 mrg mpfr_set_ui_2exp (mpc_imagref (z), 1, exy[n][1], MPFR_RNDN); 53 1.1 mrg else 54 1.1 mrg mpfr_set_ui (mpc_imagref (z), 0, MPFR_RNDN); 55 1.1 mrg if (sgn & 2) 56 1.1 mrg mpfr_neg (mpc_imagref (z), mpc_imagref (z), MPFR_RNDN); 57 1.1 mrg 58 1.1 mrg inex = f (t, z, MPC_RNDZZ); 59 1.1 mrg inex_re = MPC_INEX_RE(inex); 60 1.1 mrg inex_im = MPC_INEX_IM(inex); 61 1.1 mrg 62 1.1 mrg if (inex_re != 0 && mpfr_inf_p (mpc_realref (t))) 63 1.1 mrg { 64 1.1 mrg fprintf (stderr, "Error, wrong real part with rounding towards zero\n"); 65 1.1 mrg fprintf (stderr, "f = %s\n", s); 66 1.1 mrg fprintf (stderr, "z="); 67 1.1 mrg mpc_out_str (stderr, 2, 0, z, MPC_RNDNN); 68 1.1 mrg fprintf (stderr, "\nt="); 69 1.1 mrg mpc_out_str (stderr, 2, 0, t, MPC_RNDNN); 70 1.1 mrg fprintf (stderr, "\n"); 71 1.1 mrg exit (1); 72 1.1 mrg } 73 1.1 mrg 74 1.1 mrg if (inex_im != 0 && mpfr_inf_p (mpc_imagref (t))) 75 1.1 mrg { 76 1.1 mrg fprintf (stderr, "Error, wrong imag part with rounding towards zero\n"); 77 1.1 mrg fprintf (stderr, "f = %s\n", s); 78 1.1 mrg fprintf (stderr, "z="); 79 1.1 mrg mpc_out_str (stderr, 2, 0, z, MPC_RNDNN); 80 1.1 mrg fprintf (stderr, "\nt="); 81 1.1 mrg mpc_out_str (stderr, 2, 0, t, MPC_RNDNN); 82 1.1 mrg fprintf (stderr, "\n"); 83 1.1 mrg exit (1); 84 1.1 mrg } 85 1.1 mrg 86 1.1 mrg rnd_re = mpfr_signbit (mpc_realref (t)) == 0 ? MPFR_RNDU : MPFR_RNDD; 87 1.1 mrg rnd_im = mpfr_signbit (mpc_imagref (t)) == 0 ? MPFR_RNDU : MPFR_RNDD; 88 1.1 mrg rnd = MPC_RND(rnd_re,rnd_im); /* round away */ 89 1.1 mrg 90 1.1 mrg inex = f (t, z, rnd); 91 1.1 mrg inex_re = MPC_INEX_RE(inex); 92 1.1 mrg inex_im = MPC_INEX_IM(inex); 93 1.1 mrg 94 1.1 mrg if (inex_re != 0 && mpfr_zero_p (mpc_realref (t))) 95 1.1 mrg { 96 1.1 mrg fprintf (stderr, "Error, wrong real part with rounding away from zero\n"); 97 1.1 mrg fprintf (stderr, "f = %s\n", s); 98 1.1 mrg fprintf (stderr, "z="); 99 1.1 mrg mpc_out_str (stderr, 2, 0, z, MPC_RNDNN); 100 1.1 mrg fprintf (stderr, "\nt="); 101 1.1 mrg mpc_out_str (stderr, 2, 0, t, MPC_RNDNN); 102 1.1 mrg fprintf (stderr, "\n"); 103 1.1 mrg fprintf (stderr, "rnd=%s\n", mpfr_print_rnd_mode (rnd_re)); 104 1.1 mrg exit (1); 105 1.1 mrg } 106 1.1 mrg 107 1.1 mrg if (inex_im != 0 && mpfr_zero_p (mpc_imagref (t))) 108 1.1 mrg { 109 1.1 mrg fprintf (stderr, "Error, wrong imag part with rounding away from zero\n"); 110 1.1 mrg fprintf (stderr, "f = %s\n", s); 111 1.1 mrg fprintf (stderr, "z="); 112 1.1 mrg mpc_out_str (stderr, 2, 0, z, MPC_RNDNN); 113 1.1 mrg fprintf (stderr, "\nt="); 114 1.1 mrg mpc_out_str (stderr, 2, 0, t, MPC_RNDNN); 115 1.1 mrg fprintf (stderr, "\n"); 116 1.1 mrg fprintf (stderr, "rnd=%s\n", mpfr_print_rnd_mode (rnd_im)); 117 1.1 mrg exit (1); 118 1.1 mrg } 119 1.1 mrg } 120 1.1 mrg 121 1.1 mrg mpc_clear (z); 122 1.1 mrg mpc_clear (t); 123 1.1 mrg } 124 1.1 mrg 125 1.1 mrg int 126 1.1 mrg main (void) 127 1.1 mrg { 128 1.1 mrg test_start (); 129 1.1 mrg 130 1.1 mrg foo (mpc_sqr, "sqr"); 131 1.1 mrg foo (mpc_conj, "conj"); 132 1.1 mrg foo (mpc_neg, "neg"); 133 1.1 mrg foo (mpc_sqrt, "sqrt"); 134 1.1 mrg foo (mpc_set, "set"); 135 1.1 mrg foo (mpc_proj, "proj"); 136 1.1 mrg foo (mpc_exp, "exp"); 137 1.1 mrg foo (mpc_exp, "exp"); 138 1.1 mrg foo (mpc_log, "log"); 139 1.1 mrg foo (mpc_log10, "log10"); 140 1.1 mrg foo (mpc_sin, "sin"); 141 1.1 mrg foo (mpc_cos, "cos"); 142 1.1 mrg foo (mpc_tan, "tan"); 143 1.1 mrg foo (mpc_sinh, "sinh"); 144 1.1 mrg foo (mpc_cosh, "cosh"); 145 1.1 mrg foo (mpc_tanh, "tanh"); 146 1.1 mrg foo (mpc_asin, "asin"); 147 1.1 mrg foo (mpc_acos, "acos"); 148 1.1 mrg foo (mpc_atan, "atan"); 149 1.1 mrg foo (mpc_asinh, "asinh"); 150 1.1 mrg foo (mpc_acosh, "acosh"); 151 1.1 mrg foo (mpc_atanh, "atanh"); 152 1.1 mrg 153 1.1 mrg test_end (); 154 1.1 mrg 155 1.1 mrg return 0; 156 1.1 mrg } 157