1efee5258Smrg /* Test file for mpfr_expm1.
2efee5258Smrg
3*ba125506Smrg Copyright 2001-2023 Free Software Foundation, Inc.
4efdec83bSmrg Contributed by the AriC and Caramba projects, INRIA.
5efee5258Smrg
6efee5258Smrg This file is part of the GNU MPFR Library.
7efee5258Smrg
8efee5258Smrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9efee5258Smrg it under the terms of the GNU Lesser General Public License as published by
10efee5258Smrg the Free Software Foundation; either version 3 of the License, or (at your
11efee5258Smrg option) any later version.
12efee5258Smrg
13efee5258Smrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14efee5258Smrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15efee5258Smrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16efee5258Smrg License for more details.
17efee5258Smrg
18efee5258Smrg You should have received a copy of the GNU Lesser General Public License
19efee5258Smrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
202ba2404bSmrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21efee5258Smrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22efee5258Smrg
23efee5258Smrg #include "mpfr-test.h"
24efee5258Smrg
25efee5258Smrg #ifdef CHECK_EXTERNAL
26efee5258Smrg static int
test_expm1(mpfr_ptr a,mpfr_srcptr b,mpfr_rnd_t rnd_mode)27efee5258Smrg test_expm1 (mpfr_ptr a, mpfr_srcptr b, mpfr_rnd_t rnd_mode)
28efee5258Smrg {
29efee5258Smrg int res;
30efee5258Smrg int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b) && mpfr_get_prec (a)>=53;
31efee5258Smrg if (ok)
32efee5258Smrg {
33efee5258Smrg mpfr_print_raw (b);
34efee5258Smrg }
35efee5258Smrg res = mpfr_expm1 (a, b, rnd_mode);
36efee5258Smrg if (ok)
37efee5258Smrg {
38efee5258Smrg printf (" ");
39efee5258Smrg mpfr_print_raw (a);
40efee5258Smrg printf ("\n");
41efee5258Smrg }
42efee5258Smrg return res;
43efee5258Smrg }
44efee5258Smrg #else
45efee5258Smrg #define test_expm1 mpfr_expm1
46efee5258Smrg #endif
47efee5258Smrg
48efee5258Smrg #define TEST_FUNCTION test_expm1
49efee5258Smrg #define TEST_RANDOM_EMIN -36
50efee5258Smrg #define TEST_RANDOM_EMAX 36
51efee5258Smrg #include "tgeneric.c"
52efee5258Smrg
53efee5258Smrg static void
special(void)54efee5258Smrg special (void)
55efee5258Smrg {
56efee5258Smrg mpfr_t x, y;
57*ba125506Smrg int inex;
58efee5258Smrg
59efee5258Smrg mpfr_init (x);
60efee5258Smrg mpfr_init (y);
61efee5258Smrg
62efee5258Smrg mpfr_set_nan (x);
63efee5258Smrg test_expm1 (y, x, MPFR_RNDN);
64efee5258Smrg if (!mpfr_nan_p (y))
65efee5258Smrg {
66efee5258Smrg printf ("Error for expm1(NaN)\n");
67efee5258Smrg exit (1);
68efee5258Smrg }
69efee5258Smrg
70efee5258Smrg mpfr_set_inf (x, 1);
71efee5258Smrg test_expm1 (y, x, MPFR_RNDN);
72efee5258Smrg if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
73efee5258Smrg {
74efee5258Smrg printf ("Error for expm1(+Inf)\n");
75efee5258Smrg exit (1);
76efee5258Smrg }
77efee5258Smrg
78efee5258Smrg mpfr_set_inf (x, -1);
79efee5258Smrg test_expm1 (y, x, MPFR_RNDN);
80efee5258Smrg if (mpfr_cmp_si (y, -1))
81efee5258Smrg {
82efee5258Smrg printf ("Error for expm1(-Inf)\n");
83efee5258Smrg exit (1);
84efee5258Smrg }
85efee5258Smrg
86efee5258Smrg mpfr_set_ui (x, 0, MPFR_RNDN);
87efee5258Smrg test_expm1 (y, x, MPFR_RNDN);
88299c6f0cSmrg if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y))
89efee5258Smrg {
90efee5258Smrg printf ("Error for expm1(+0)\n");
91efee5258Smrg exit (1);
92efee5258Smrg }
93efee5258Smrg
94efee5258Smrg mpfr_neg (x, x, MPFR_RNDN);
95efee5258Smrg test_expm1 (y, x, MPFR_RNDN);
96299c6f0cSmrg if (MPFR_NOTZERO (y) || MPFR_IS_POS (y))
97efee5258Smrg {
98efee5258Smrg printf ("Error for expm1(-0)\n");
99efee5258Smrg exit (1);
100efee5258Smrg }
101efee5258Smrg
102efee5258Smrg /* Check overflow of expm1(x) */
103efee5258Smrg mpfr_clear_flags ();
104efee5258Smrg mpfr_set_str_binary (x, "1.1E1000000000");
105*ba125506Smrg inex = test_expm1 (x, x, MPFR_RNDN);
106299c6f0cSmrg MPFR_ASSERTN (MPFR_IS_INF (x) && MPFR_IS_POS (x));
107*ba125506Smrg MPFR_ASSERTN (__gmpfr_flags == (MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT));
108*ba125506Smrg MPFR_ASSERTN (inex > 0);
109efee5258Smrg
110efee5258Smrg mpfr_clear_flags ();
111efee5258Smrg mpfr_set_str_binary (x, "1.1E1000000000");
112*ba125506Smrg inex = test_expm1 (x, x, MPFR_RNDU);
113299c6f0cSmrg MPFR_ASSERTN (MPFR_IS_INF (x) && MPFR_IS_POS (x));
114*ba125506Smrg MPFR_ASSERTN (__gmpfr_flags == (MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT));
115*ba125506Smrg MPFR_ASSERTN (inex > 0);
116efee5258Smrg
117efee5258Smrg mpfr_clear_flags ();
118efee5258Smrg mpfr_set_str_binary (x, "1.1E1000000000");
119*ba125506Smrg inex = test_expm1 (x, x, MPFR_RNDD);
120299c6f0cSmrg MPFR_ASSERTN (!MPFR_IS_INF (x) && MPFR_IS_POS (x));
121*ba125506Smrg MPFR_ASSERTN (__gmpfr_flags == (MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT));
122*ba125506Smrg MPFR_ASSERTN (inex < 0);
123efee5258Smrg
124efee5258Smrg /* Check internal underflow of expm1 (x) */
125efee5258Smrg mpfr_set_prec (x, 2);
126efee5258Smrg mpfr_clear_flags ();
127efee5258Smrg mpfr_set_str_binary (x, "-1.1E1000000000");
128*ba125506Smrg inex = test_expm1 (x, x, MPFR_RNDN);
129*ba125506Smrg MPFR_ASSERTN (mpfr_cmp_si0 (x, -1) == 0);
130*ba125506Smrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_INEXACT);
131*ba125506Smrg MPFR_ASSERTN (inex < 0);
132efee5258Smrg
133efee5258Smrg mpfr_set_str_binary (x, "-1.1E1000000000");
134*ba125506Smrg inex = test_expm1 (x, x, MPFR_RNDD);
135*ba125506Smrg MPFR_ASSERTN (mpfr_cmp_si0 (x, -1) == 0);
136*ba125506Smrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_INEXACT);
137*ba125506Smrg MPFR_ASSERTN (inex < 0);
138efee5258Smrg
139efee5258Smrg mpfr_set_str_binary (x, "-1.1E1000000000");
140*ba125506Smrg inex = test_expm1 (x, x, MPFR_RNDZ);
141efee5258Smrg MPFR_ASSERTN (mpfr_cmp_str (x, "-0.11", 2, MPFR_RNDN) == 0);
142*ba125506Smrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_INEXACT);
143*ba125506Smrg MPFR_ASSERTN (inex > 0);
144efee5258Smrg
145efee5258Smrg mpfr_set_str_binary (x, "-1.1E1000000000");
146*ba125506Smrg inex = test_expm1 (x, x, MPFR_RNDU);
147efee5258Smrg MPFR_ASSERTN (mpfr_cmp_str (x, "-0.11", 2, MPFR_RNDN) == 0);
148*ba125506Smrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_INEXACT);
149*ba125506Smrg MPFR_ASSERTN (inex > 0);
150*ba125506Smrg
151*ba125506Smrg mpfr_set_str_binary (x, "-1.1E1000000000");
152*ba125506Smrg inex = test_expm1 (x, x, MPFR_RNDA);
153*ba125506Smrg MPFR_ASSERTN (mpfr_cmp_si0 (x, -1) == 0);
154*ba125506Smrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_INEXACT);
155*ba125506Smrg MPFR_ASSERTN (inex < 0);
156efee5258Smrg
157efee5258Smrg mpfr_clear (x);
158efee5258Smrg mpfr_clear (y);
159efee5258Smrg }
160efee5258Smrg
161efee5258Smrg int
main(int argc,char * argv[])162efee5258Smrg main (int argc, char *argv[])
163efee5258Smrg {
164efee5258Smrg tests_start_mpfr ();
165efee5258Smrg
166efee5258Smrg special ();
167efee5258Smrg
168299c6f0cSmrg test_generic (MPFR_PREC_MIN, 100, 100);
169efee5258Smrg
170efee5258Smrg data_check ("data/expm1", mpfr_expm1, "mpfr_expm1");
1712ba2404bSmrg bad_cases (mpfr_expm1, mpfr_log1p, "mpfr_expm1", 64, -256, 255,
1722ba2404bSmrg 4, 128, 800, 80);
173efee5258Smrg
174efee5258Smrg tests_end_mpfr ();
175efee5258Smrg return 0;
176efee5258Smrg }
177