texp10.c revision 1.1.1.6 1 1.1 mrg /* Test file for mpfr_exp10.
2 1.1 mrg
3 1.1.1.6 mrg Copyright 2007-2023 Free Software Foundation, Inc.
4 1.1.1.3 mrg Contributed by the AriC and Caramba projects, INRIA.
5 1.1 mrg
6 1.1 mrg This file is part of the GNU MPFR Library.
7 1.1 mrg
8 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
11 1.1 mrg option) any later version.
12 1.1 mrg
13 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 1.1 mrg License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU Lesser General Public License
19 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 1.1.1.5 mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 1.1 mrg
23 1.1 mrg #include "mpfr-test.h"
24 1.1 mrg
25 1.1 mrg #define TEST_FUNCTION mpfr_exp10
26 1.1 mrg #define TEST_RANDOM_EMIN -36
27 1.1 mrg #define TEST_RANDOM_EMAX 36
28 1.1 mrg #include "tgeneric.c"
29 1.1 mrg
30 1.1 mrg static void
31 1.1 mrg special_overflow (void)
32 1.1 mrg {
33 1.1 mrg mpfr_t x, y;
34 1.1 mrg int inex;
35 1.1 mrg mpfr_exp_t emin, emax;
36 1.1 mrg
37 1.1 mrg emin = mpfr_get_emin ();
38 1.1 mrg emax = mpfr_get_emax ();
39 1.1 mrg
40 1.1 mrg set_emin (-125);
41 1.1 mrg set_emax (128);
42 1.1 mrg
43 1.1 mrg mpfr_init2 (x, 24);
44 1.1 mrg mpfr_init2 (y, 24);
45 1.1 mrg
46 1.1 mrg mpfr_set_str_binary (x, "0.101100100000000000110100E15");
47 1.1 mrg inex = mpfr_exp10 (y, x, MPFR_RNDN);
48 1.1 mrg if (!mpfr_inf_p (y) || inex <= 0)
49 1.1 mrg {
50 1.1 mrg printf ("Overflow error.\n");
51 1.1 mrg mpfr_dump (y);
52 1.1 mrg printf ("inex = %d\n", inex);
53 1.1 mrg exit (1);
54 1.1 mrg }
55 1.1 mrg
56 1.1 mrg mpfr_clear (y);
57 1.1 mrg mpfr_clear (x);
58 1.1 mrg set_emin (emin);
59 1.1 mrg set_emax (emax);
60 1.1 mrg }
61 1.1 mrg
62 1.1 mrg static void
63 1.1 mrg emax_m_eps (void)
64 1.1 mrg {
65 1.1 mrg if (mpfr_get_emax () <= LONG_MAX)
66 1.1 mrg {
67 1.1 mrg mpfr_t x, y;
68 1.1 mrg int inex, ov;
69 1.1 mrg
70 1.1 mrg mpfr_init2 (x, sizeof(mpfr_exp_t) * CHAR_BIT * 4);
71 1.1 mrg mpfr_init2 (y, 8);
72 1.1 mrg mpfr_set_si (x, mpfr_get_emax (), MPFR_RNDN);
73 1.1 mrg
74 1.1 mrg mpfr_clear_flags ();
75 1.1 mrg inex = mpfr_exp10 (y, x, MPFR_RNDN);
76 1.1 mrg ov = mpfr_overflow_p ();
77 1.1 mrg if (!ov || !mpfr_inf_p (y) || inex <= 0)
78 1.1 mrg {
79 1.1 mrg printf ("Overflow error for x = emax, MPFR_RNDN.\n");
80 1.1 mrg mpfr_dump (y);
81 1.1 mrg printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no ");
82 1.1 mrg exit (1);
83 1.1 mrg }
84 1.1 mrg
85 1.1 mrg mpfr_clear (x);
86 1.1 mrg mpfr_clear (y);
87 1.1 mrg }
88 1.1 mrg }
89 1.1 mrg
90 1.1 mrg static void
91 1.1 mrg exp_range (void)
92 1.1 mrg {
93 1.1 mrg mpfr_t x;
94 1.1 mrg mpfr_exp_t emin;
95 1.1 mrg
96 1.1 mrg emin = mpfr_get_emin ();
97 1.1 mrg set_emin (3);
98 1.1 mrg mpfr_init2 (x, 16);
99 1.1 mrg mpfr_set_ui (x, 4, MPFR_RNDN);
100 1.1 mrg mpfr_exp10 (x, x, MPFR_RNDN);
101 1.1 mrg set_emin (emin);
102 1.1 mrg if (mpfr_nan_p (x) || mpfr_cmp_ui (x, 10000) != 0)
103 1.1 mrg {
104 1.1 mrg printf ("Error in mpfr_exp10 for x = 4, with emin = 3\n");
105 1.1 mrg printf ("Expected 10000, got ");
106 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
107 1.1 mrg printf ("\n");
108 1.1 mrg exit (1);
109 1.1 mrg }
110 1.1 mrg mpfr_clear (x);
111 1.1 mrg }
112 1.1 mrg
113 1.1 mrg static void
114 1.1 mrg overfl_exp10_0 (void)
115 1.1 mrg {
116 1.1 mrg mpfr_t x, y;
117 1.1 mrg int emax, i, inex, rnd, err = 0;
118 1.1 mrg mpfr_exp_t old_emax;
119 1.1 mrg
120 1.1 mrg old_emax = mpfr_get_emax ();
121 1.1 mrg
122 1.1 mrg mpfr_init2 (x, 8);
123 1.1 mrg mpfr_init2 (y, 8);
124 1.1 mrg
125 1.1 mrg for (emax = -1; emax <= 0; emax++)
126 1.1 mrg {
127 1.1 mrg mpfr_set_ui_2exp (y, 1, emax, MPFR_RNDN);
128 1.1 mrg mpfr_nextbelow (y);
129 1.1 mrg set_emax (emax); /* 1 is not representable. */
130 1.1 mrg /* and if emax < 0, 1 - eps is not representable either. */
131 1.1 mrg for (i = -1; i <= 1; i++)
132 1.1 mrg RND_LOOP (rnd)
133 1.1 mrg {
134 1.1 mrg mpfr_set_si_2exp (x, i, -512 * ABS (i), MPFR_RNDN);
135 1.1 mrg mpfr_clear_flags ();
136 1.1 mrg inex = mpfr_exp10 (x, x, (mpfr_rnd_t) rnd);
137 1.1 mrg if ((i >= 0 || emax < 0 || rnd == MPFR_RNDN || rnd == MPFR_RNDU) &&
138 1.1 mrg ! mpfr_overflow_p ())
139 1.1 mrg {
140 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
141 1.1 mrg " The overflow flag is not set.\n",
142 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
143 1.1 mrg err = 1;
144 1.1 mrg }
145 1.1 mrg if (rnd == MPFR_RNDZ || rnd == MPFR_RNDD)
146 1.1 mrg {
147 1.1 mrg if (inex >= 0)
148 1.1 mrg {
149 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
150 1.1 mrg " The inexact value must be negative.\n",
151 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
152 1.1 mrg err = 1;
153 1.1 mrg }
154 1.1 mrg if (! mpfr_equal_p (x, y))
155 1.1 mrg {
156 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
157 1.1.1.4 mrg " Got ", i,
158 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
159 1.1.1.4 mrg mpfr_dump (x);
160 1.1.1.4 mrg printf (" instead of 0.11111111E%d.\n", emax);
161 1.1 mrg err = 1;
162 1.1 mrg }
163 1.1 mrg }
164 1.1.1.4 mrg else if (rnd != MPFR_RNDF)
165 1.1 mrg {
166 1.1 mrg if (inex <= 0)
167 1.1 mrg {
168 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
169 1.1 mrg " The inexact value must be positive.\n",
170 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
171 1.1 mrg err = 1;
172 1.1 mrg }
173 1.1.1.4 mrg if (! (mpfr_inf_p (x) && MPFR_IS_POS (x)))
174 1.1 mrg {
175 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
176 1.1.1.4 mrg " Got ", i,
177 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
178 1.1.1.4 mrg mpfr_dump (x);
179 1.1.1.4 mrg printf (" instead of +Inf.\n");
180 1.1 mrg err = 1;
181 1.1 mrg }
182 1.1 mrg }
183 1.1 mrg }
184 1.1 mrg set_emax (old_emax);
185 1.1 mrg }
186 1.1 mrg
187 1.1 mrg if (err)
188 1.1 mrg exit (1);
189 1.1 mrg mpfr_clear (x);
190 1.1 mrg mpfr_clear (y);
191 1.1 mrg }
192 1.1 mrg
193 1.1 mrg int
194 1.1 mrg main (int argc, char *argv[])
195 1.1 mrg {
196 1.1 mrg mpfr_t x, y;
197 1.1 mrg mpfr_exp_t emin, emax;
198 1.1 mrg int inex, ov;
199 1.1 mrg
200 1.1 mrg tests_start_mpfr ();
201 1.1 mrg
202 1.1 mrg special_overflow ();
203 1.1 mrg emax_m_eps ();
204 1.1 mrg exp_range ();
205 1.1 mrg
206 1.1 mrg mpfr_init (x);
207 1.1 mrg mpfr_init (y);
208 1.1 mrg
209 1.1 mrg mpfr_set_ui (x, 4, MPFR_RNDN);
210 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
211 1.1 mrg if (mpfr_cmp_ui (y, 10000) != 0)
212 1.1 mrg {
213 1.1 mrg printf ("Error for 10^4, MPFR_RNDN\n");
214 1.1 mrg exit (1);
215 1.1 mrg }
216 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDD);
217 1.1 mrg if (mpfr_cmp_ui (y, 10000) != 0)
218 1.1 mrg {
219 1.1 mrg printf ("Error for 10^4, MPFR_RNDD\n");
220 1.1 mrg exit (1);
221 1.1 mrg }
222 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDU);
223 1.1 mrg if (mpfr_cmp_ui (y, 10000) != 0)
224 1.1 mrg {
225 1.1 mrg printf ("Error for 10^4, MPFR_RNDU\n");
226 1.1 mrg exit (1);
227 1.1 mrg }
228 1.1 mrg
229 1.1 mrg mpfr_set_prec (x, 10);
230 1.1 mrg mpfr_set_prec (y, 10);
231 1.1 mrg /* save emin */
232 1.1 mrg emin = mpfr_get_emin ();
233 1.1 mrg set_emin (-11);
234 1.1 mrg mpfr_set_si (x, -4, MPFR_RNDN);
235 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
236 1.1.1.4 mrg if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y))
237 1.1 mrg {
238 1.1 mrg printf ("Error for emin = -11, x = -4, RNDN\n");
239 1.1 mrg printf ("Expected +0\n");
240 1.1.1.4 mrg printf ("Got "); mpfr_dump (y);
241 1.1 mrg exit (1);
242 1.1 mrg }
243 1.1 mrg /* restore emin */
244 1.1 mrg set_emin (emin);
245 1.1 mrg
246 1.1 mrg /* save emax */
247 1.1 mrg emax = mpfr_get_emax ();
248 1.1 mrg set_emax (13);
249 1.1 mrg mpfr_set_ui (x, 4, MPFR_RNDN);
250 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
251 1.1 mrg if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
252 1.1 mrg {
253 1.1 mrg printf ("Error for emax = 13, x = 4, RNDN\n");
254 1.1 mrg printf ("Expected +inf\n");
255 1.1.1.4 mrg printf ("Got "); mpfr_dump (y);
256 1.1 mrg exit (1);
257 1.1 mrg }
258 1.1 mrg /* restore emax */
259 1.1 mrg set_emax (emax);
260 1.1 mrg
261 1.1 mrg MPFR_SET_INF (x);
262 1.1 mrg MPFR_SET_POS (x);
263 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
264 1.1 mrg if (!MPFR_IS_INF (y))
265 1.1 mrg {
266 1.1 mrg printf ("evaluation of function in INF does not return INF\n");
267 1.1 mrg exit (1);
268 1.1 mrg }
269 1.1 mrg
270 1.1 mrg MPFR_CHANGE_SIGN (x);
271 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
272 1.1 mrg if (!MPFR_IS_ZERO (y))
273 1.1 mrg {
274 1.1 mrg printf ("evaluation of function in -INF does not return 0\n");
275 1.1 mrg exit (1);
276 1.1 mrg }
277 1.1 mrg
278 1.1 mrg MPFR_SET_NAN (x);
279 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
280 1.1 mrg if (!MPFR_IS_NAN (y))
281 1.1 mrg {
282 1.1 mrg printf ("evaluation of function in NaN does not return NaN\n");
283 1.1 mrg exit (1);
284 1.1 mrg }
285 1.1 mrg
286 1.1 mrg if ((mpfr_uexp_t) 8 << 31 != 0 ||
287 1.1 mrg mpfr_get_emax () <= (mpfr_uexp_t) 100000 * 100000)
288 1.1 mrg {
289 1.1 mrg /* emax <= 10000000000 */
290 1.1 mrg mpfr_set_prec (x, 40);
291 1.1 mrg mpfr_set_prec (y, 40);
292 1.1 mrg mpfr_set_str (x, "3010299957", 10, MPFR_RNDN);
293 1.1 mrg mpfr_clear_flags ();
294 1.1 mrg inex = mpfr_exp10 (y, x, MPFR_RNDN);
295 1.1 mrg ov = mpfr_overflow_p ();
296 1.1 mrg if (!(MPFR_IS_INF (y) && MPFR_IS_POS (y) && ov))
297 1.1 mrg {
298 1.1 mrg printf ("Overflow error for x = 3010299957, MPFR_RNDN.\n");
299 1.1 mrg mpfr_dump (y);
300 1.1 mrg printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no ");
301 1.1 mrg exit (1);
302 1.1 mrg }
303 1.1 mrg }
304 1.1 mrg
305 1.1.1.4 mrg test_generic (MPFR_PREC_MIN, 100, 100);
306 1.1 mrg
307 1.1 mrg mpfr_clear (x);
308 1.1 mrg mpfr_clear (y);
309 1.1 mrg
310 1.1 mrg overfl_exp10_0 ();
311 1.1 mrg
312 1.1 mrg data_check ("data/exp10", mpfr_exp10, "mpfr_exp10");
313 1.1 mrg
314 1.1 mrg tests_end_mpfr ();
315 1.1 mrg return 0;
316 1.1 mrg }
317