xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/teint.c (revision ba125506a622fe649968631a56eba5d42ff57863)
1efee5258Smrg /* Test file for mpfr_eint.
2efee5258Smrg 
3*ba125506Smrg Copyright 2005-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 #define TEST_FUNCTION mpfr_eint
26efee5258Smrg #include "tgeneric.c"
27efee5258Smrg 
28efee5258Smrg static void
check_specials(void)29efee5258Smrg check_specials (void)
30efee5258Smrg {
31efee5258Smrg   mpfr_t  x, y;
32efee5258Smrg 
33efee5258Smrg   mpfr_init2 (x, 123L);
34efee5258Smrg   mpfr_init2 (y, 123L);
35efee5258Smrg 
36efee5258Smrg   mpfr_set_nan (x);
37efee5258Smrg   mpfr_eint (y, x, MPFR_RNDN);
38efee5258Smrg   if (! mpfr_nan_p (y))
39efee5258Smrg     {
40efee5258Smrg       printf ("Error: eint(NaN) != NaN\n");
41efee5258Smrg       exit (1);
42efee5258Smrg     }
43efee5258Smrg 
44efee5258Smrg   mpfr_set_inf (x, 1);
45efee5258Smrg   mpfr_eint (y, x, MPFR_RNDN);
46efee5258Smrg   if (! (mpfr_inf_p (y) && mpfr_sgn (y) > 0))
47efee5258Smrg     {
48efee5258Smrg       printf ("Error: eint(+Inf) != +Inf\n");
49efee5258Smrg       exit (1);
50efee5258Smrg     }
51efee5258Smrg 
52efee5258Smrg   mpfr_set_inf (x, -1);
53efee5258Smrg   mpfr_eint (y, x, MPFR_RNDN);
54299c6f0cSmrg   if (! (mpfr_zero_p (y) && MPFR_IS_NEG (y)))
55efee5258Smrg     {
56299c6f0cSmrg       printf ("Error: eint(-Inf) != -0\n");
57efee5258Smrg       exit (1);
58efee5258Smrg     }
59efee5258Smrg 
60efee5258Smrg   /* eint(+/-0) = -Inf */
61efee5258Smrg   mpfr_set_ui (x, 0, MPFR_RNDN);
62efee5258Smrg   mpfr_eint (y, x, MPFR_RNDN);
63efee5258Smrg   if (! (mpfr_inf_p (y) && mpfr_sgn (y) < 0))
64efee5258Smrg     {
65efee5258Smrg       printf ("Error: eint(+0) != -Inf\n");
66efee5258Smrg       exit (1);
67efee5258Smrg     }
68efee5258Smrg   mpfr_neg (x, x, MPFR_RNDN);
69efee5258Smrg   mpfr_eint (y, x, MPFR_RNDN);
70efee5258Smrg   if (! (mpfr_inf_p (y) && mpfr_sgn (y) < 0))
71efee5258Smrg     {
72efee5258Smrg       printf ("Error: eint(-0) != -Inf\n");
73efee5258Smrg       exit (1);
74efee5258Smrg     }
75efee5258Smrg 
76efee5258Smrg   mpfr_set_prec (x, 17);
77efee5258Smrg   mpfr_set_prec (y, 17);
78efee5258Smrg   mpfr_set_str_binary (x, "1.0111110100100110e-2");
79efee5258Smrg   mpfr_set_str_binary (y, "-1.0010101001110100e-10");
80efee5258Smrg   mpfr_eint (x, x, MPFR_RNDZ);
81efee5258Smrg   if (mpfr_cmp (x, y))
82efee5258Smrg     {
83efee5258Smrg       printf ("Error for x=1.0111110100100110e-2, MPFR_RNDZ\n");
84efee5258Smrg       printf ("expected "); mpfr_dump (y);
85efee5258Smrg       printf ("got      "); mpfr_dump (x);
86efee5258Smrg       exit (1);
87efee5258Smrg     }
88efee5258Smrg 
89efee5258Smrg   mpfr_set_prec (x, 53);
90efee5258Smrg   mpfr_set_prec (y, 53);
91efee5258Smrg   mpfr_set_str_binary (x, "0.10E4");
92efee5258Smrg   mpfr_eint (x, x, MPFR_RNDN);
93efee5258Smrg   mpfr_set_str (y, "440.37989953483827", 10, MPFR_RNDN);
94efee5258Smrg   if (mpfr_cmp (x, y) != 0)
95efee5258Smrg     {
96efee5258Smrg       printf ("Error for x=0.10E4, MPFR_RNDZ\n");
97efee5258Smrg       printf ("expected "); mpfr_dump (y);
98efee5258Smrg       printf ("got      "); mpfr_dump (x);
99efee5258Smrg       exit (1);
100efee5258Smrg     }
101efee5258Smrg 
102efee5258Smrg   mpfr_set_prec (x, 63);
103efee5258Smrg   mpfr_set_prec (y, 63);
104efee5258Smrg   mpfr_set_str_binary (x, "1.01111101011100111000011010001000101101011000011001111101011010e-2");
105efee5258Smrg   mpfr_eint (x, x, MPFR_RNDZ);
106efee5258Smrg   mpfr_set_str_binary (y, "1.11010110001101000001010010000100001111001000100100000001011100e-17");
107efee5258Smrg   if (mpfr_cmp (x, y) != 0)
108efee5258Smrg     {
109efee5258Smrg       printf ("Error (1) for MPFR_RNDZ\n");
110efee5258Smrg       printf ("expected "); mpfr_dump (y);
111efee5258Smrg       printf ("got      "); mpfr_dump (x);
112efee5258Smrg       exit (1);
113efee5258Smrg     }
114efee5258Smrg 
115299c6f0cSmrg   mpfr_set_prec (x, 2);
116299c6f0cSmrg   mpfr_set_prec (y, 2);
117299c6f0cSmrg   mpfr_set_si (x, -1, MPFR_RNDN);
118299c6f0cSmrg   mpfr_eint (x, x, MPFR_RNDN); /* eint1(1) = 0.219383934395520 */
119299c6f0cSmrg   mpfr_set_str_binary (y, "-1e-2");
120299c6f0cSmrg   if (mpfr_cmp (x, y) != 0)
121299c6f0cSmrg     {
122299c6f0cSmrg       printf ("Error for x=-1, MPFR_RNDN\n");
123299c6f0cSmrg       printf ("expected "); mpfr_dump (y);
124299c6f0cSmrg       printf ("got      "); mpfr_dump (x);
125299c6f0cSmrg       exit (1);
126299c6f0cSmrg     }
127299c6f0cSmrg 
128299c6f0cSmrg   mpfr_set_prec (x, 10);
129299c6f0cSmrg   mpfr_set_prec (y, 10);
130299c6f0cSmrg   mpfr_set_si (x, -2, MPFR_RNDN);
131299c6f0cSmrg   mpfr_eint (y, x, MPFR_RNDN); /* eint1(2) = 0.0489005107080611 */
132299c6f0cSmrg   if (mpfr_cmp_si_2exp (y, -801, -14) != 0)
133299c6f0cSmrg     {
134299c6f0cSmrg       printf ("Error for x=-2, MPFR_RNDN\n");
135299c6f0cSmrg       printf ("expected -801/2^14\n");
136299c6f0cSmrg       printf ("got      "); mpfr_dump (y);
137299c6f0cSmrg       exit (1);
138299c6f0cSmrg     }
139299c6f0cSmrg 
140efee5258Smrg   /* check large x */
141efee5258Smrg   mpfr_set_prec (x, 53);
142efee5258Smrg   mpfr_set_prec (y, 53);
143efee5258Smrg   mpfr_set_str_binary (x, "1E6");
144efee5258Smrg   mpfr_eint (x, x, MPFR_RNDN);
145efee5258Smrg   mpfr_set_str_binary (y, "10100011110001101001110000110010111000100111010001E37");
146efee5258Smrg   if (mpfr_cmp (x, y) != 0)
147efee5258Smrg     {
148efee5258Smrg       printf ("Error for x=2^6, MPFR_RNDN\n");
149efee5258Smrg       printf ("expected "); mpfr_dump (y);
150efee5258Smrg       printf ("got      "); mpfr_dump (x);
151efee5258Smrg       exit (1);
152efee5258Smrg     }
153efee5258Smrg   mpfr_set_str_binary (x, "1E7");
154efee5258Smrg   mpfr_eint (x, x, MPFR_RNDN);
155efee5258Smrg   mpfr_set_str_binary (y, "11001100100011110000101001011010110111111011110011E128");
156efee5258Smrg   if (mpfr_cmp (x, y) != 0)
157efee5258Smrg     {
158efee5258Smrg       printf ("Error for x=2^7, MPFR_RNDN\n");
159efee5258Smrg       printf ("expected "); mpfr_dump (y);
160efee5258Smrg       printf ("got      "); mpfr_dump (x);
161efee5258Smrg       exit (1);
162efee5258Smrg     }
163efee5258Smrg   mpfr_set_str_binary (x, "1E8");
164efee5258Smrg   mpfr_eint (x, x, MPFR_RNDN);
165efee5258Smrg   mpfr_set_str_binary (y, "1010000110000101111111011011000101001000101011101001E310");
166efee5258Smrg   if (mpfr_cmp (x, y) != 0)
167efee5258Smrg     {
168efee5258Smrg       printf ("Error for x=2^8, MPFR_RNDN\n");
169efee5258Smrg       printf ("expected "); mpfr_dump (y);
170efee5258Smrg       printf ("got      "); mpfr_dump (x);
171efee5258Smrg       exit (1);
172efee5258Smrg     }
173efee5258Smrg   mpfr_set_str_binary (x, "1E9");
174efee5258Smrg   mpfr_eint (x, x, MPFR_RNDN);
175efee5258Smrg   mpfr_set_str_binary (y, "11001010101000001010101101110000010110011101110010101E677");
176efee5258Smrg   if (mpfr_cmp (x, y) != 0)
177efee5258Smrg     {
178efee5258Smrg       printf ("Error for x=2^9, MPFR_RNDN\n");
179efee5258Smrg       printf ("expected "); mpfr_dump (y);
180efee5258Smrg       printf ("got      "); mpfr_dump (x);
181efee5258Smrg       exit (1);
182efee5258Smrg     }
183efee5258Smrg   mpfr_set_str_binary (x, "1E10");
184efee5258Smrg   mpfr_eint (x, x, MPFR_RNDN);
185efee5258Smrg   mpfr_set_str_binary (y, "10011111111010010110110101101000101100101010101101101E1415");
186efee5258Smrg   if (mpfr_cmp (x, y) != 0)
187efee5258Smrg     {
188efee5258Smrg       printf ("Error for x=2^10, MPFR_RNDN\n");
189efee5258Smrg       printf ("expected "); mpfr_dump (y);
190efee5258Smrg       printf ("got      "); mpfr_dump (x);
191efee5258Smrg       exit (1);
192efee5258Smrg     }
193efee5258Smrg 
1942ba2404bSmrg   /* Run-time error at si_op.c:42:31 with r9996 on an x86-64 Linux machine,
195299c6f0cSmrg      using CFLAGS="-fsanitize=undefined -fno-sanitize-recover". */
196299c6f0cSmrg   mpfr_set_prec (x, 32);
197299c6f0cSmrg   mpfr_set_prec (y, 46);
198299c6f0cSmrg   mpfr_set_si_2exp (x, -1, -1, MPFR_RNDN);
199299c6f0cSmrg   mpfr_eint (y, x, MPFR_RNDN);
200299c6f0cSmrg 
201299c6f0cSmrg   mpfr_set_prec (x, 10);
202299c6f0cSmrg   mpfr_set_prec (y, 6);
203299c6f0cSmrg   mpfr_set_str (x, "-7.875", 10, MPFR_RNDN);
204299c6f0cSmrg   mpfr_eint (y, x, MPFR_RNDN);
205299c6f0cSmrg   if (mpfr_cmp_si_2exp (y, -45, -20) != 0)
206299c6f0cSmrg     {
207299c6f0cSmrg       printf ("Error for x=-7.875, MPFR_RNDN\n");
208299c6f0cSmrg       printf ("expected -45/2^20\n");
209299c6f0cSmrg       printf ("got      "); mpfr_dump (y);
210299c6f0cSmrg       exit (1);
211299c6f0cSmrg     }
212299c6f0cSmrg 
213efee5258Smrg   mpfr_clear (x);
214efee5258Smrg   mpfr_clear (y);
215efee5258Smrg }
216efee5258Smrg 
217efee5258Smrg int
main(int argc,char * argv[])218efee5258Smrg main (int argc, char *argv[])
219efee5258Smrg {
220efee5258Smrg   tests_start_mpfr ();
221efee5258Smrg 
222efee5258Smrg   if (argc != 1) /* teint x [prec] */
223efee5258Smrg     {
224efee5258Smrg       mpfr_t x;
225efee5258Smrg       mpfr_prec_t p;
226efee5258Smrg       p = (argc < 3) ? 53 : atoi (argv[2]);
227efee5258Smrg       mpfr_init2 (x, p);
228efee5258Smrg       mpfr_set_str (x, argv[1], 10, MPFR_RNDN);
229efee5258Smrg       printf ("eint(");
230efee5258Smrg       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
231efee5258Smrg       printf (")=");
232efee5258Smrg       mpfr_eint (x, x, MPFR_RNDN);
233efee5258Smrg       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
234efee5258Smrg       printf ("\n");
235efee5258Smrg       mpfr_clear (x);
236efee5258Smrg     }
237efee5258Smrg   else
238efee5258Smrg     {
239efee5258Smrg       check_specials ();
240efee5258Smrg 
241299c6f0cSmrg       test_generic (MPFR_PREC_MIN, 100, 100);
242efee5258Smrg     }
243efee5258Smrg 
244efee5258Smrg   tests_end_mpfr ();
245efee5258Smrg   return 0;
246efee5258Smrg }
247