Home | History | Annotate | Line # | Download | only in tests
      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