xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/texpm1.c (revision ba125506a622fe649968631a56eba5d42ff57863)
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