1 1.1 mrg /* Test file for mpfr_atanh. 2 1.1 mrg 3 1.1.1.6 mrg Copyright 2001-2023 Free Software Foundation, Inc. 4 1.1.1.3 mrg Contributed by the AriC and Caramba projects, INRIA. 5 1.1 mrg 6 1.1 mrg This file is part of the GNU MPFR Library. 7 1.1 mrg 8 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify 9 1.1 mrg it under the terms of the GNU Lesser General Public License as published by 10 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your 11 1.1 mrg option) any later version. 12 1.1 mrg 13 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but 14 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16 1.1 mrg License for more details. 17 1.1 mrg 18 1.1 mrg You should have received a copy of the GNU Lesser General Public License 19 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20 1.1.1.5 mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 21 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22 1.1 mrg 23 1.1 mrg #include "mpfr-test.h" 24 1.1 mrg 25 1.1 mrg #define TEST_FUNCTION mpfr_atanh 26 1.1 mrg #define TEST_RANDOM_EMAX 7 27 1.1 mrg #include "tgeneric.c" 28 1.1 mrg 29 1.1 mrg static void 30 1.1 mrg special (void) 31 1.1 mrg { 32 1.1 mrg mpfr_t x, y, z; 33 1.1 mrg int i; 34 1.1 mrg 35 1.1 mrg mpfr_init (x); 36 1.1 mrg mpfr_init (y); 37 1.1 mrg 38 1.1 mrg MPFR_SET_INF(x); 39 1.1 mrg mpfr_set_ui (y, 0, MPFR_RNDN); 40 1.1 mrg mpfr_atanh (x, y, MPFR_RNDN); 41 1.1 mrg if (MPFR_IS_INF(x) || MPFR_IS_NAN(x) ) 42 1.1 mrg { 43 1.1 mrg printf ("Inf flag not clears in atanh!\n"); 44 1.1 mrg exit (1); 45 1.1 mrg } 46 1.1 mrg 47 1.1 mrg MPFR_SET_NAN(x); 48 1.1 mrg mpfr_atanh (x, y, MPFR_RNDN); 49 1.1 mrg if (MPFR_IS_NAN(x) || MPFR_IS_INF(x)) 50 1.1 mrg { 51 1.1 mrg printf ("NAN flag not clears in atanh!\n"); 52 1.1 mrg exit (1); 53 1.1 mrg } 54 1.1 mrg 55 1.1 mrg /* atanh(+/-x) = NaN if x > 1 */ 56 1.1 mrg for (i = 3; i <= 6; i++) 57 1.1 mrg { 58 1.1 mrg mpfr_set_si (x, i, MPFR_RNDN); 59 1.1 mrg mpfr_div_2ui (x, x, 1, MPFR_RNDN); 60 1.1 mrg mpfr_atanh (y, x, MPFR_RNDN); 61 1.1 mrg if (!mpfr_nan_p (y)) 62 1.1 mrg { 63 1.1 mrg printf ("Error: mpfr_atanh(%d/2) <> NaN\n", i); 64 1.1 mrg exit (1); 65 1.1 mrg } 66 1.1 mrg mpfr_neg (x, x, MPFR_RNDN); 67 1.1 mrg mpfr_atanh (y, x, MPFR_RNDN); 68 1.1 mrg if (!mpfr_nan_p (y)) 69 1.1 mrg { 70 1.1 mrg printf ("Error: mpfr_atanh(-%d/2) <> NaN\n", i); 71 1.1 mrg exit (1); 72 1.1 mrg } 73 1.1 mrg } 74 1.1 mrg 75 1.1 mrg /* atanh(+0) = +0, atanh(-0) = -0 */ 76 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); 77 1.1 mrg mpfr_atanh (y, x, MPFR_RNDN); 78 1.1.1.4 mrg if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y)) 79 1.1 mrg { 80 1.1 mrg printf ("Error: mpfr_atanh(+0) <> +0\n"); 81 1.1 mrg exit (1); 82 1.1 mrg } 83 1.1 mrg mpfr_neg (x, x, MPFR_RNDN); 84 1.1 mrg mpfr_atanh (y, x, MPFR_RNDN); 85 1.1.1.4 mrg if (MPFR_NOTZERO (y) || MPFR_IS_POS (y)) 86 1.1 mrg { 87 1.1 mrg printf ("Error: mpfr_atanh(-0) <> -0\n"); 88 1.1 mrg exit (1); 89 1.1 mrg } 90 1.1 mrg 91 1.1 mrg MPFR_SET_NAN(x); 92 1.1 mrg mpfr_atanh (y, x, MPFR_RNDN); 93 1.1 mrg if (!mpfr_nan_p (y)) 94 1.1 mrg { 95 1.1 mrg printf ("Error: mpfr_atanh(NaN) <> NaN\n"); 96 1.1 mrg exit (1); 97 1.1 mrg } 98 1.1 mrg 99 1.1 mrg mpfr_set_inf (x, 1); 100 1.1 mrg mpfr_atanh (y, x, MPFR_RNDN); 101 1.1 mrg if (!mpfr_nan_p (y)) 102 1.1 mrg { 103 1.1 mrg printf ("Error: mpfr_atanh(+Inf) <> NaN\n"); 104 1.1.1.4 mrg mpfr_dump (y); 105 1.1 mrg exit (1); 106 1.1 mrg } 107 1.1 mrg 108 1.1 mrg mpfr_set_inf (x, -1); 109 1.1 mrg mpfr_atanh (y, x, MPFR_RNDN); 110 1.1 mrg if (!mpfr_nan_p (y)) 111 1.1 mrg { 112 1.1 mrg printf ("Error: mpfr_atanh(-Inf) <> NaN\n"); 113 1.1 mrg exit (1); 114 1.1 mrg } 115 1.1 mrg 116 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN); 117 1.1 mrg mpfr_atanh (y, x, MPFR_RNDN); 118 1.1 mrg if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0) 119 1.1 mrg { 120 1.1 mrg printf ("Error: mpfr_atanh(1) <> +Inf\n"); 121 1.1 mrg exit (1); 122 1.1 mrg } 123 1.1 mrg 124 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN); 125 1.1 mrg mpfr_atanh (y, x, MPFR_RNDN); 126 1.1 mrg if (!mpfr_inf_p (y) || mpfr_sgn (y) > 0) 127 1.1 mrg { 128 1.1 mrg printf ("Error: mpfr_atanh(-1) <> -Inf\n"); 129 1.1 mrg exit (1); 130 1.1 mrg } 131 1.1 mrg 132 1.1 mrg mpfr_set_prec (x, 32); 133 1.1 mrg mpfr_set_prec (y, 32); 134 1.1 mrg 135 1.1 mrg mpfr_set_str_binary (x, "0.10001000001001011000100001E-6"); 136 1.1 mrg mpfr_atanh (x, x, MPFR_RNDN); 137 1.1 mrg mpfr_set_str_binary (y, "0.10001000001001100101010110100001E-6"); 138 1.1 mrg if (mpfr_cmp (x, y)) 139 1.1 mrg { 140 1.1 mrg printf ("Error: mpfr_atanh (1)\n"); 141 1.1 mrg exit (1); 142 1.1 mrg } 143 1.1 mrg 144 1.1 mrg mpfr_set_str_binary (x, "-0.1101011110111100111010011001011E-1"); 145 1.1 mrg mpfr_atanh (x, x, MPFR_RNDN); 146 1.1 mrg mpfr_set_str_binary (y, "-0.11100110000100001111101100010111E-1"); 147 1.1 mrg if (mpfr_cmp (x, y)) 148 1.1 mrg { 149 1.1 mrg printf ("Error: mpfr_atanh (2)\n"); 150 1.1 mrg exit (1); 151 1.1 mrg } 152 1.1 mrg 153 1.1 mrg mpfr_set_prec (x, 33); 154 1.1 mrg mpfr_set_prec (y, 43); 155 1.1 mrg mpfr_set_str_binary (x, "0.111001101100000110011001010000101"); 156 1.1 mrg mpfr_atanh (y, x, MPFR_RNDZ); 157 1.1 mrg mpfr_init2 (z, 43); 158 1.1 mrg mpfr_set_str_binary (z, "1.01111010110001101001000000101101011110101"); 159 1.1 mrg if (mpfr_cmp (y, z)) 160 1.1 mrg { 161 1.1 mrg printf ("Error: mpfr_atanh (3)\n"); 162 1.1.1.4 mrg mpfr_dump (y); 163 1.1 mrg exit (1); 164 1.1 mrg } 165 1.1 mrg 166 1.1 mrg mpfr_clear (x); 167 1.1 mrg mpfr_clear (y); 168 1.1 mrg mpfr_clear (z); 169 1.1 mrg } 170 1.1 mrg 171 1.1 mrg int 172 1.1 mrg main (int argc, char *argv[]) 173 1.1 mrg { 174 1.1 mrg tests_start_mpfr (); 175 1.1 mrg 176 1.1 mrg special (); 177 1.1 mrg 178 1.1.1.4 mrg test_generic (MPFR_PREC_MIN, 100, 25); 179 1.1 mrg 180 1.1 mrg data_check ("data/atanh", mpfr_atanh, "mpfr_atanh"); 181 1.1.1.5 mrg bad_cases (mpfr_atanh, mpfr_tanh, "mpfr_atanh", 256, -128, 8, 182 1.1 mrg 4, 128, 800, 100); 183 1.1 mrg 184 1.1 mrg tests_end_mpfr (); 185 1.1 mrg return 0; 186 1.1 mrg } 187