1/* ttan -- test file for mpc_tan. 2 3Copyright (C) 2008, 2011 INRIA 4 5This file is part of GNU MPC. 6 7GNU MPC is free software; you can redistribute it and/or modify it under 8the terms of the GNU Lesser General Public License as published by the 9Free Software Foundation; either version 3 of the License, or (at your 10option) any later version. 11 12GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 15more details. 16 17You should have received a copy of the GNU Lesser General Public License 18along with this program. If not, see http://www.gnu.org/licenses/ . 19*/ 20 21#include <stdlib.h> 22#include "mpc-tests.h" 23 24static void 25pure_real_argument (void) 26{ 27 /* tan(x -i*0) = tan(x) -i*0 */ 28 /* tan(x +i*0) = tan(x) +i*0 */ 29 mpfr_t x; 30 mpfr_t tan_x; 31 mpc_t z; 32 mpc_t tan_z; 33 34 mpfr_init2 (x, 79); 35 mpfr_init2 (tan_x, 113); 36 mpc_init2 (z, 79); 37 mpc_init2 (tan_z, 113); 38 39 /* tan(1 +i*0) = tan(1) +i*0 */ 40 mpc_set_ui_ui (z, 1, 0, MPC_RNDNN); 41 mpfr_set_ui (x, 1, GMP_RNDN); 42 mpfr_tan (tan_x, x, GMP_RNDN); 43 mpc_tan (tan_z, z, MPC_RNDNN); 44 if (mpfr_cmp (mpc_realref (tan_z), tan_x) != 0 45 || !mpfr_zero_p (mpc_imagref (tan_z)) || mpfr_signbit (mpc_imagref (tan_z))) 46 { 47 printf ("mpc_tan(1 + i * 0) failed\n"); 48 exit (1); 49 } 50 51 /* tan(1 -i*0) = tan(1) -i*0 */ 52 mpc_conj (z, z, MPC_RNDNN); 53 mpc_tan (tan_z, z, MPC_RNDNN); 54 if (mpfr_cmp (mpc_realref (tan_z), tan_x) != 0 55 || !mpfr_zero_p (mpc_imagref (tan_z)) || !mpfr_signbit (mpc_imagref (tan_z))) 56 { 57 printf ("mpc_tan(1 - i * 0) failed\n"); 58 exit (1); 59 } 60 61 /* tan(Pi/2 +i*0) = +Inf +i*0 */ 62 mpfr_const_pi (x, GMP_RNDN); 63 mpfr_div_2ui (x, x, 1, GMP_RNDN); 64 mpfr_set (mpc_realref (z), x, GMP_RNDN); 65 mpfr_set_ui (mpc_imagref (z), 0, GMP_RNDN); 66 mpfr_tan (tan_x, x, GMP_RNDN); 67 mpc_tan (tan_z, z, MPC_RNDNN); 68 if (mpfr_cmp (mpc_realref (tan_z), tan_x) != 0 69 || !mpfr_zero_p (mpc_imagref (tan_z)) || mpfr_signbit (mpc_imagref (tan_z))) 70 { 71 printf ("mpc_tan(Pi/2 + i * 0) failed\n"); 72 exit (1); 73 } 74 75 /* tan(Pi/2 -i*0) = +Inf -i*0 */ 76 mpc_conj (z, z, MPC_RNDNN); 77 mpc_tan (tan_z, z, MPC_RNDNN); 78 if (mpfr_cmp (mpc_realref (tan_z), tan_x) != 0 79 || !mpfr_zero_p (mpc_imagref (tan_z)) || !mpfr_signbit (mpc_imagref (tan_z))) 80 { 81 printf ("mpc_tan(Pi/2 - i * 0) failed\n"); 82 exit (1); 83 } 84 85 /* tan(-Pi/2 +i*0) = -Inf +i*0 */ 86 mpfr_neg (x, x, GMP_RNDN); 87 mpc_neg (z, z, MPC_RNDNN); 88 mpfr_tan (tan_x, x, GMP_RNDN); 89 mpc_tan (tan_z, z, MPC_RNDNN); 90 if (mpfr_cmp (mpc_realref (tan_z), tan_x) != 0 91 || !mpfr_zero_p (mpc_imagref (tan_z)) || mpfr_signbit (mpc_imagref (tan_z))) 92 { 93 printf ("mpc_tan(-Pi/2 + i * 0) failed\n"); 94 exit (1); 95 } 96 97 /* tan(-Pi/2 -i*0) = -Inf -i*0 */ 98 mpc_conj (z, z, MPC_RNDNN); 99 mpc_tan (tan_z, z, MPC_RNDNN); 100 if (mpfr_cmp (mpc_realref (tan_z), tan_x) != 0 101 || !mpfr_zero_p (mpc_imagref (tan_z)) || !mpfr_signbit (mpc_imagref (tan_z))) 102 { 103 printf ("mpc_tan(-Pi/2 - i * 0) failed\n"); 104 exit (1); 105 } 106 107 mpc_clear (tan_z); 108 mpc_clear (z); 109 mpfr_clear (tan_x); 110 mpfr_clear (x); 111} 112 113static void 114pure_imaginary_argument (void) 115{ 116 /* tan(-0 +i*y) = -0 +i*tanh(y) */ 117 /* tan(+0 +i*y) = +0 +i*tanh(y) */ 118 mpfr_t y; 119 mpfr_t tanh_y; 120 mpc_t z; 121 mpc_t tan_z; 122 mpfr_prec_t prec = (mpfr_prec_t) 111; 123 124 mpfr_init2 (y, 2); 125 mpfr_init2 (tanh_y, prec); 126 mpc_init2 (z, 2); 127 mpc_init2 (tan_z, prec); 128 129 /* tan(0 +i) = +0 +i*tanh(1) */ 130 mpc_set_ui_ui (z, 0, 1, MPC_RNDNN); 131 mpfr_set_ui (y, 1, GMP_RNDN); 132 mpfr_tanh (tanh_y, y, GMP_RNDN); 133 mpc_tan (tan_z, z, MPC_RNDNN); 134 if (mpfr_cmp (mpc_imagref (tan_z), tanh_y) != 0 135 || !mpfr_zero_p (mpc_realref (tan_z)) || mpfr_signbit (mpc_realref (tan_z))) 136 { 137 mpc_t c99; 138 139 mpc_init2 (c99, prec); 140 mpfr_set_ui (mpc_realref (c99), 0, GMP_RNDN); 141 mpfr_set (mpc_imagref (c99), tanh_y, GMP_RNDN); 142 143 TEST_FAILED ("mpc_tan", z, tan_z, c99, MPC_RNDNN); 144 } 145 146 /* tan(0 -i) = +0 +i*tanh(-1) */ 147 mpc_conj (z, z, MPC_RNDNN); 148 mpfr_neg (tanh_y, tanh_y, GMP_RNDN); 149 mpc_tan (tan_z, z, MPC_RNDNN); 150 if (mpfr_cmp (mpc_imagref (tan_z), tanh_y) != 0 151 || !mpfr_zero_p (mpc_realref (tan_z)) || mpfr_signbit (mpc_realref (tan_z))) 152 { 153 mpc_t c99; 154 155 mpc_init2 (c99, prec); 156 mpfr_set_ui (mpc_realref (c99), 0, GMP_RNDN); 157 mpfr_set (mpc_imagref (c99), tanh_y, GMP_RNDN); 158 159 TEST_FAILED ("mpc_tan", z, tan_z, c99, MPC_RNDNN); 160 } 161 162 /* tan(-0 +i) = -0 +i*tanh(1) */ 163 mpc_neg (z, z, MPC_RNDNN); 164 mpfr_neg (tanh_y, tanh_y, GMP_RNDN); 165 mpc_tan (tan_z, z, MPC_RNDNN); 166 if (mpfr_cmp (mpc_imagref (tan_z), tanh_y) != 0 167 || !mpfr_zero_p (mpc_realref (tan_z)) || !mpfr_signbit (mpc_realref (tan_z))) 168 { 169 mpc_t c99; 170 171 mpc_init2 (c99, prec); 172 mpfr_set_ui (mpc_realref (c99), 0, GMP_RNDN); 173 mpfr_set (mpc_imagref (c99), tanh_y, GMP_RNDN); 174 175 TEST_FAILED ("mpc_tan", z, tan_z, c99, MPC_RNDNN); 176 } 177 178 /* tan(-0 -i) = -0 +i*tanh(-1) */ 179 mpc_conj (z, z, MPC_RNDNN); 180 mpfr_neg (tanh_y, tanh_y, GMP_RNDN); 181 mpc_tan (tan_z, z, MPC_RNDNN); 182 if (mpfr_cmp (mpc_imagref (tan_z), tanh_y) != 0 183 || !mpfr_zero_p (mpc_realref (tan_z)) || !mpfr_signbit (mpc_realref (tan_z))) 184 { 185 mpc_t c99; 186 187 mpc_init2 (c99, prec); 188 mpfr_set_ui (mpc_realref (c99), 0, GMP_RNDN); 189 mpfr_set (mpc_imagref (c99), tanh_y, GMP_RNDN); 190 191 TEST_FAILED ("mpc_tan", z, tan_z, c99, MPC_RNDNN); 192 } 193 194 mpc_clear (tan_z); 195 mpc_clear (z); 196 mpfr_clear (tanh_y); 197 mpfr_clear (y); 198} 199 200int 201main (void) 202{ 203 DECL_FUNC (CC, f, mpc_tan); 204 205 test_start (); 206 207 data_check (f, "tan.dat"); 208 tgeneric (f, 2, 512, 7, 4); 209 210 pure_real_argument (); 211 pure_imaginary_argument (); 212 213 test_end (); 214 215 return 0; 216} 217