xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/teint.c (revision ba125506a622fe649968631a56eba5d42ff57863)
1 /* Test file for mpfr_eint.
2 
3 Copyright 2005-2023 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramba projects, INRIA.
5 
6 This file is part of the GNU MPFR Library.
7 
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12 
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 License for more details.
17 
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
20 https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 
23 #include "mpfr-test.h"
24 
25 #define TEST_FUNCTION mpfr_eint
26 #include "tgeneric.c"
27 
28 static void
check_specials(void)29 check_specials (void)
30 {
31   mpfr_t  x, y;
32 
33   mpfr_init2 (x, 123L);
34   mpfr_init2 (y, 123L);
35 
36   mpfr_set_nan (x);
37   mpfr_eint (y, x, MPFR_RNDN);
38   if (! mpfr_nan_p (y))
39     {
40       printf ("Error: eint(NaN) != NaN\n");
41       exit (1);
42     }
43 
44   mpfr_set_inf (x, 1);
45   mpfr_eint (y, x, MPFR_RNDN);
46   if (! (mpfr_inf_p (y) && mpfr_sgn (y) > 0))
47     {
48       printf ("Error: eint(+Inf) != +Inf\n");
49       exit (1);
50     }
51 
52   mpfr_set_inf (x, -1);
53   mpfr_eint (y, x, MPFR_RNDN);
54   if (! (mpfr_zero_p (y) && MPFR_IS_NEG (y)))
55     {
56       printf ("Error: eint(-Inf) != -0\n");
57       exit (1);
58     }
59 
60   /* eint(+/-0) = -Inf */
61   mpfr_set_ui (x, 0, MPFR_RNDN);
62   mpfr_eint (y, x, MPFR_RNDN);
63   if (! (mpfr_inf_p (y) && mpfr_sgn (y) < 0))
64     {
65       printf ("Error: eint(+0) != -Inf\n");
66       exit (1);
67     }
68   mpfr_neg (x, x, MPFR_RNDN);
69   mpfr_eint (y, x, MPFR_RNDN);
70   if (! (mpfr_inf_p (y) && mpfr_sgn (y) < 0))
71     {
72       printf ("Error: eint(-0) != -Inf\n");
73       exit (1);
74     }
75 
76   mpfr_set_prec (x, 17);
77   mpfr_set_prec (y, 17);
78   mpfr_set_str_binary (x, "1.0111110100100110e-2");
79   mpfr_set_str_binary (y, "-1.0010101001110100e-10");
80   mpfr_eint (x, x, MPFR_RNDZ);
81   if (mpfr_cmp (x, y))
82     {
83       printf ("Error for x=1.0111110100100110e-2, MPFR_RNDZ\n");
84       printf ("expected "); mpfr_dump (y);
85       printf ("got      "); mpfr_dump (x);
86       exit (1);
87     }
88 
89   mpfr_set_prec (x, 53);
90   mpfr_set_prec (y, 53);
91   mpfr_set_str_binary (x, "0.10E4");
92   mpfr_eint (x, x, MPFR_RNDN);
93   mpfr_set_str (y, "440.37989953483827", 10, MPFR_RNDN);
94   if (mpfr_cmp (x, y) != 0)
95     {
96       printf ("Error for x=0.10E4, MPFR_RNDZ\n");
97       printf ("expected "); mpfr_dump (y);
98       printf ("got      "); mpfr_dump (x);
99       exit (1);
100     }
101 
102   mpfr_set_prec (x, 63);
103   mpfr_set_prec (y, 63);
104   mpfr_set_str_binary (x, "1.01111101011100111000011010001000101101011000011001111101011010e-2");
105   mpfr_eint (x, x, MPFR_RNDZ);
106   mpfr_set_str_binary (y, "1.11010110001101000001010010000100001111001000100100000001011100e-17");
107   if (mpfr_cmp (x, y) != 0)
108     {
109       printf ("Error (1) for MPFR_RNDZ\n");
110       printf ("expected "); mpfr_dump (y);
111       printf ("got      "); mpfr_dump (x);
112       exit (1);
113     }
114 
115   mpfr_set_prec (x, 2);
116   mpfr_set_prec (y, 2);
117   mpfr_set_si (x, -1, MPFR_RNDN);
118   mpfr_eint (x, x, MPFR_RNDN); /* eint1(1) = 0.219383934395520 */
119   mpfr_set_str_binary (y, "-1e-2");
120   if (mpfr_cmp (x, y) != 0)
121     {
122       printf ("Error for x=-1, MPFR_RNDN\n");
123       printf ("expected "); mpfr_dump (y);
124       printf ("got      "); mpfr_dump (x);
125       exit (1);
126     }
127 
128   mpfr_set_prec (x, 10);
129   mpfr_set_prec (y, 10);
130   mpfr_set_si (x, -2, MPFR_RNDN);
131   mpfr_eint (y, x, MPFR_RNDN); /* eint1(2) = 0.0489005107080611 */
132   if (mpfr_cmp_si_2exp (y, -801, -14) != 0)
133     {
134       printf ("Error for x=-2, MPFR_RNDN\n");
135       printf ("expected -801/2^14\n");
136       printf ("got      "); mpfr_dump (y);
137       exit (1);
138     }
139 
140   /* check large x */
141   mpfr_set_prec (x, 53);
142   mpfr_set_prec (y, 53);
143   mpfr_set_str_binary (x, "1E6");
144   mpfr_eint (x, x, MPFR_RNDN);
145   mpfr_set_str_binary (y, "10100011110001101001110000110010111000100111010001E37");
146   if (mpfr_cmp (x, y) != 0)
147     {
148       printf ("Error for x=2^6, MPFR_RNDN\n");
149       printf ("expected "); mpfr_dump (y);
150       printf ("got      "); mpfr_dump (x);
151       exit (1);
152     }
153   mpfr_set_str_binary (x, "1E7");
154   mpfr_eint (x, x, MPFR_RNDN);
155   mpfr_set_str_binary (y, "11001100100011110000101001011010110111111011110011E128");
156   if (mpfr_cmp (x, y) != 0)
157     {
158       printf ("Error for x=2^7, MPFR_RNDN\n");
159       printf ("expected "); mpfr_dump (y);
160       printf ("got      "); mpfr_dump (x);
161       exit (1);
162     }
163   mpfr_set_str_binary (x, "1E8");
164   mpfr_eint (x, x, MPFR_RNDN);
165   mpfr_set_str_binary (y, "1010000110000101111111011011000101001000101011101001E310");
166   if (mpfr_cmp (x, y) != 0)
167     {
168       printf ("Error for x=2^8, MPFR_RNDN\n");
169       printf ("expected "); mpfr_dump (y);
170       printf ("got      "); mpfr_dump (x);
171       exit (1);
172     }
173   mpfr_set_str_binary (x, "1E9");
174   mpfr_eint (x, x, MPFR_RNDN);
175   mpfr_set_str_binary (y, "11001010101000001010101101110000010110011101110010101E677");
176   if (mpfr_cmp (x, y) != 0)
177     {
178       printf ("Error for x=2^9, MPFR_RNDN\n");
179       printf ("expected "); mpfr_dump (y);
180       printf ("got      "); mpfr_dump (x);
181       exit (1);
182     }
183   mpfr_set_str_binary (x, "1E10");
184   mpfr_eint (x, x, MPFR_RNDN);
185   mpfr_set_str_binary (y, "10011111111010010110110101101000101100101010101101101E1415");
186   if (mpfr_cmp (x, y) != 0)
187     {
188       printf ("Error for x=2^10, MPFR_RNDN\n");
189       printf ("expected "); mpfr_dump (y);
190       printf ("got      "); mpfr_dump (x);
191       exit (1);
192     }
193 
194   /* Run-time error at si_op.c:42:31 with r9996 on an x86-64 Linux machine,
195      using CFLAGS="-fsanitize=undefined -fno-sanitize-recover". */
196   mpfr_set_prec (x, 32);
197   mpfr_set_prec (y, 46);
198   mpfr_set_si_2exp (x, -1, -1, MPFR_RNDN);
199   mpfr_eint (y, x, MPFR_RNDN);
200 
201   mpfr_set_prec (x, 10);
202   mpfr_set_prec (y, 6);
203   mpfr_set_str (x, "-7.875", 10, MPFR_RNDN);
204   mpfr_eint (y, x, MPFR_RNDN);
205   if (mpfr_cmp_si_2exp (y, -45, -20) != 0)
206     {
207       printf ("Error for x=-7.875, MPFR_RNDN\n");
208       printf ("expected -45/2^20\n");
209       printf ("got      "); mpfr_dump (y);
210       exit (1);
211     }
212 
213   mpfr_clear (x);
214   mpfr_clear (y);
215 }
216 
217 int
main(int argc,char * argv[])218 main (int argc, char *argv[])
219 {
220   tests_start_mpfr ();
221 
222   if (argc != 1) /* teint x [prec] */
223     {
224       mpfr_t x;
225       mpfr_prec_t p;
226       p = (argc < 3) ? 53 : atoi (argv[2]);
227       mpfr_init2 (x, p);
228       mpfr_set_str (x, argv[1], 10, MPFR_RNDN);
229       printf ("eint(");
230       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
231       printf (")=");
232       mpfr_eint (x, x, MPFR_RNDN);
233       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
234       printf ("\n");
235       mpfr_clear (x);
236     }
237   else
238     {
239       check_specials ();
240 
241       test_generic (MPFR_PREC_MIN, 100, 100);
242     }
243 
244   tests_end_mpfr ();
245   return 0;
246 }
247