1 /* tacos -- test file for mpc_acos. 2 3 Copyright (C) 2009, 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 "mpc-tests.h" 22 23 #define MPC_FUNCTION_CALL \ 24 P[0].mpc_inex = mpc_acos (P[1].mpc, P[2].mpc, P[3].mpc_rnd) 25 #define MPC_FUNCTION_CALL_REUSE_OP1 \ 26 P[0].mpc_inex = mpc_acos (P[1].mpc, P[1].mpc, P[3].mpc_rnd) 27 28 #include "data_check.tpl" 29 #include "tgeneric.tpl" 30 31 /* test with reduced exponent range */ 32 static void 33 test_reduced (void) 34 { 35 mpfr_exp_t emin = mpfr_get_emin (); 36 mpfr_exp_t emax = mpfr_get_emax (); 37 mpc_t x, z, zr; 38 39 mpfr_set_emin (-148); 40 mpfr_set_emax (128); 41 mpc_init2 (x, 24); 42 mpc_init2 (z, 24); 43 mpc_init2 (zr, 24); 44 mpfr_set_flt (mpc_realref (x), -0x0.01f28c10p0f, MPFR_RNDN); 45 mpfr_set_flt (mpc_imagref (x), -0x6.79cdd0p-68f, MPFR_RNDN); 46 mpc_acos (z, x, MPC_RNDNN); 47 mpfr_set_flt (mpc_realref (zr), 0x1.941242p0f, MPFR_RNDN); 48 mpfr_set_flt (mpc_imagref (zr), 0x6.79da18p-68f, MPFR_RNDN); 49 if (mpc_cmp (z, zr)) 50 { 51 printf ("Incorrect acos with reduced exponent range:\n"); 52 mpfr_printf ("Expected (%Re,%Re)\n", mpc_realref (zr), mpc_imagref (zr)); 53 mpfr_printf ("Got (%Re,%Re)\n", mpc_realref (z), mpc_imagref (z)); 54 exit (1); 55 } 56 mpc_clear (x); 57 mpc_clear (z); 58 mpc_clear (zr); 59 mpfr_set_emin (emin); 60 mpfr_set_emax (emax); 61 } 62 63 /* another test with reduced exponent range */ 64 static void 65 test_reduced2 (void) 66 { 67 mpfr_exp_t emin = mpfr_get_emin (); 68 mpfr_exp_t emax = mpfr_get_emax (); 69 mpc_t x, z, zr; 70 71 mpfr_set_emin (-1073); 72 mpfr_set_emax (1024); 73 mpc_init2 (x, 53); 74 mpc_init2 (z, 53); 75 mpc_init2 (zr, 53); 76 mpfr_set_d (mpc_realref (x), -2.2694475687286223e-15, MPFR_RNDN); 77 mpfr_set_d (mpc_imagref (x), 2.7236935900137536e-309, MPFR_RNDN); 78 mpc_acos (z, x, MPC_RNDNN); 79 mpfr_set_d (mpc_realref (zr), 1.5707963267948988, MPFR_RNDN); 80 mpfr_set_d (mpc_imagref (zr), -2.7236935900137536e-309, MPFR_RNDN); 81 if (mpc_cmp (z, zr)) 82 { 83 printf ("Incorrect acos with reduced exponent range:\n"); 84 mpfr_printf ("Expected (%Re,%Re)\n", mpc_realref (zr), mpc_imagref (zr)); 85 mpfr_printf ("Got (%Re,%Re)\n", mpc_realref (z), mpc_imagref (z)); 86 exit (1); 87 } 88 mpc_clear (x); 89 mpc_clear (z); 90 mpc_clear (zr); 91 mpfr_set_emin (emin); 92 mpfr_set_emax (emax); 93 } 94 95 int 96 main (void) 97 { 98 test_start (); 99 100 test_reduced (); 101 test_reduced2 (); 102 103 data_check_template ("acos.dsc", "acos.dat"); 104 105 tgeneric_template ("acos.dsc", 2, 512, 7, 7); 106 107 test_end (); 108 109 return 0; 110 } 111