tsech.c revision 1.1.1.6
1/* Test file for mpfr_sech.
2
3Copyright 2005-2023 Free Software Foundation, Inc.
4Contributed by the AriC and Caramba projects, INRIA.
5
6This file is part of the GNU MPFR Library.
7
8The GNU MPFR Library is free software; you can redistribute it and/or modify
9it under the terms of the GNU Lesser General Public License as published by
10the Free Software Foundation; either version 3 of the License, or (at your
11option) any later version.
12
13The GNU MPFR Library is distributed in the hope that it will be useful, but
14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16License for more details.
17
18You should have received a copy of the GNU Lesser General Public License
19along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
20https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
2151 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22
23#include "mpfr-test.h"
24
25#define TEST_FUNCTION mpfr_sech
26#define TEST_RANDOM_EMIN -64
27#define TEST_RANDOM_EMAX 36
28#include "tgeneric.c"
29
30static void
31check_specials (void)
32{
33  mpfr_t  x, y;
34
35  mpfr_init2 (x, 123L);
36  mpfr_init2 (y, 123L);
37
38  mpfr_set_nan (x);
39  mpfr_sech (y, x, MPFR_RNDN);
40  if (! mpfr_nan_p (y))
41    {
42      printf ("Error: sech(NaN) != NaN\n");
43      exit (1);
44    }
45
46  mpfr_set_inf (x, 1);
47  mpfr_sech (y, x, MPFR_RNDN);
48  if (! (MPFR_IS_ZERO (y) && MPFR_IS_POS (y)))
49    {
50      printf ("Error: sech(+Inf) != +0\n");
51      exit (1);
52    }
53
54  mpfr_set_inf (x, -1);
55  mpfr_sech (y, x, MPFR_RNDN);
56  if (! (MPFR_IS_ZERO (y) && MPFR_IS_POS (y)))
57    {
58      printf ("Error: sech(-Inf) != +0\n");
59      exit (1);
60    }
61
62  /* sec(+/-0) = 1 */
63  mpfr_set_ui (x, 0, MPFR_RNDN);
64  mpfr_sech (y, x, MPFR_RNDN);
65  if (mpfr_cmp_ui (y, 1))
66    {
67      printf ("Error: sech(+0) != 1\n");
68      exit (1);
69    }
70  mpfr_neg (x, x, MPFR_RNDN);
71  mpfr_sech (y, x, MPFR_RNDN);
72  if (mpfr_cmp_ui (y, 1))
73    {
74      printf ("Error: sech(-0) != 1\n");
75      exit (1);
76    }
77
78  /* check huge x */
79  mpfr_set_str (x, "8e8", 10, MPFR_RNDN);
80  mpfr_sech (y, x, MPFR_RNDN);
81  if (! (mpfr_zero_p (y) && MPFR_IS_POS (y)))
82    {
83      printf ("Error: sech(8e8) != +0\n");
84      exit (1);
85    }
86  mpfr_set_str (x, "-8e8", 10, MPFR_RNDN);
87  mpfr_sech (y, x, MPFR_RNDN);
88  if (! (mpfr_zero_p (y) && MPFR_IS_POS (y)))
89    {
90      printf ("Error: sech(-8e8) != +0\n");
91      exit (1);
92    }
93
94  mpfr_clear (x);
95  mpfr_clear (y);
96}
97
98static void
99overflowed_sech0 (void)
100{
101  mpfr_t x, y;
102  int emax, i, inex, rnd, err = 0;
103  mpfr_exp_t old_emax;
104
105  old_emax = mpfr_get_emax ();
106
107  mpfr_init2 (x, 8);
108  mpfr_init2 (y, 8);
109
110  for (emax = -1; emax <= 0; emax++)
111    {
112      mpfr_set_ui_2exp (y, 1, emax, MPFR_RNDN);
113      mpfr_nextbelow (y);
114      set_emax (emax);  /* 1 is not representable. */
115      /* and if emax < 0, 1 - eps is not representable either. */
116      for (i = -1; i <= 1; i++)
117        RND_LOOP_NO_RNDF (rnd)
118          {
119            mpfr_set_si_2exp (x, i, -512 * ABS (i), MPFR_RNDN);
120            mpfr_clear_flags ();
121            inex = mpfr_sech (x, x, (mpfr_rnd_t) rnd);
122            if ((i == 0 || emax < 0 || rnd == MPFR_RNDN || rnd == MPFR_RNDU) &&
123                ! mpfr_overflow_p ())
124              {
125                printf ("Error in overflowed_sech0 (i = %d, rnd = %s):\n"
126                        "  The overflow flag is not set.\n",
127                        i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
128                err = 1;
129              }
130            if (rnd == MPFR_RNDZ || rnd == MPFR_RNDD)
131              {
132                if (inex >= 0)
133                  {
134                    printf ("Error in overflowed_sech0 (i = %d, rnd = %s):\n"
135                            "  The inexact value must be negative.\n",
136                            i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
137                    err = 1;
138                  }
139                if (! mpfr_equal_p (x, y))
140                  {
141                    printf ("Error in overflowed_sech0 (i = %d, rnd = %s):\n"
142                            "  Got        ", i,
143                            mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
144                    mpfr_dump (x);
145                    printf ("  instead of 0.11111111E%d.\n", emax);
146                    err = 1;
147                  }
148              }
149            else
150              {
151                if (inex <= 0)
152                  {
153                    printf ("Error in overflowed_sech0 (i = %d, rnd = %s):\n"
154                            "  The inexact value must be positive.\n",
155                            i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
156                    err = 1;
157                  }
158                if (! (mpfr_inf_p (x) && MPFR_IS_POS (x)))
159                  {
160                    printf ("Error in overflowed_sech0 (i = %d, rnd = %s):\n"
161                            "  Got        ", i,
162                            mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
163                    mpfr_dump (x);
164                    printf ("  instead of +Inf.\n");
165                    err = 1;
166                  }
167              }
168          }
169      set_emax (old_emax);
170    }
171
172  if (err)
173    exit (1);
174  mpfr_clear (x);
175  mpfr_clear (y);
176}
177
178int
179main (int argc, char *argv[])
180{
181  tests_start_mpfr ();
182
183  check_specials ();
184  test_generic (MPFR_PREC_MIN, 200, 10);
185  overflowed_sech0 ();
186
187  tests_end_mpfr ();
188  return 0;
189}
190