tatanh.c revision 1.1.1.5 1 1.1 mrg /* Test file for mpfr_atanh.
2 1.1 mrg
3 1.1.1.5 mrg Copyright 2001-2020 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