Home | History | Annotate | Line # | Download | only in tests
      1 /* tadd_fr -- test file for mpc_add_fr.
      2 
      3 Copyright (C) 2008, 2010, 2012, 2013 INRIA
      4 
      5 This file is part of GNU MPC.
      6 
      7 GNU MPC is free software; you can redistribute it and/or modify it under
      8 the terms of the GNU Lesser General Public License as published by the
      9 Free Software Foundation; either version 3 of the License, or (at your
     10 option) any later version.
     11 
     12 GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
     13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
     14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
     15 more details.
     16 
     17 You should have received a copy of the GNU Lesser General Public License
     18 along with this program. If not, see http://www.gnu.org/licenses/ .
     19 */
     20 
     21 #include <stdlib.h>
     22 #include "mpc-tests.h"
     23 
     24 static void
     25 check_ternary_value (mpfr_prec_t prec_max, mpfr_prec_t step)
     26 {
     27   mpfr_prec_t prec;
     28   mpc_t z;
     29   mpfr_t f;
     30 
     31   mpc_init2 (z, 2);
     32   mpfr_init (f);
     33 
     34   for (prec = 2; prec < prec_max; prec += step)
     35     {
     36       mpc_set_prec (z, prec);
     37       mpfr_set_prec (f, prec);
     38 
     39       mpc_set_ui (z, 1, MPC_RNDNN);
     40       mpfr_set_ui (f, 1, MPFR_RNDN);
     41       if (mpc_add_fr (z, z, f, MPC_RNDNZ))
     42         {
     43           printf ("Error in mpc_add_fr: 1+1 should be exact\n");
     44           exit (1);
     45         }
     46 
     47       mpc_set_ui (z, 1, MPC_RNDNN);
     48       mpc_mul_2ui (z, z, (unsigned long int) prec, MPC_RNDNN);
     49       if (mpc_add_fr (z, z, f, MPC_RNDNN) == 0)
     50         {
     51           fprintf (stderr, "Error in mpc_add_fr: 2^prec+1 cannot be exact\n");
     52           exit (1);
     53         }
     54     }
     55   mpc_clear (z);
     56   mpfr_clear (f);
     57 }
     58 
     59 #define MPC_FUNCTION_CALL                                               \
     60   P[0].mpc_inex = mpc_add_fr (P[1].mpc, P[2].mpc, P[3].mpfr, P[4].mpc_rnd)
     61 #define MPC_FUNCTION_CALL_REUSE_OP1                                     \
     62   P[0].mpc_inex = mpc_add_fr (P[1].mpc, P[1].mpc, P[3].mpfr, P[4].mpc_rnd)
     63 
     64 #include "data_check.tpl"
     65 #include "tgeneric.tpl"
     66 
     67 int
     68 main (void)
     69 {
     70   test_start ();
     71 
     72   check_ternary_value (1024, 1);
     73 
     74   data_check_template ("add_fr.dsc", "add_fr.dat");
     75 
     76   tgeneric_template ("add_fr.dsc", 2, 1024, 7, 128);
     77 
     78   test_end ();
     79 
     80   return 0;
     81 }
     82