texp10.c revision 1.1.1.3 1 1.1 mrg /* Test file for mpfr_exp10.
2 1.1 mrg
3 1.1.1.3 mrg Copyright 2007-2016 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 mrg http://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 <stdio.h>
24 1.1 mrg #include <stdlib.h>
25 1.1 mrg #include <limits.h>
26 1.1 mrg
27 1.1 mrg #include "mpfr-test.h"
28 1.1 mrg
29 1.1 mrg #define TEST_FUNCTION mpfr_exp10
30 1.1 mrg #define TEST_RANDOM_EMIN -36
31 1.1 mrg #define TEST_RANDOM_EMAX 36
32 1.1 mrg #include "tgeneric.c"
33 1.1 mrg
34 1.1 mrg static void
35 1.1 mrg special_overflow (void)
36 1.1 mrg {
37 1.1 mrg mpfr_t x, y;
38 1.1 mrg int inex;
39 1.1 mrg mpfr_exp_t emin, emax;
40 1.1 mrg
41 1.1 mrg emin = mpfr_get_emin ();
42 1.1 mrg emax = mpfr_get_emax ();
43 1.1 mrg
44 1.1 mrg set_emin (-125);
45 1.1 mrg set_emax (128);
46 1.1 mrg
47 1.1 mrg mpfr_init2 (x, 24);
48 1.1 mrg mpfr_init2 (y, 24);
49 1.1 mrg
50 1.1 mrg mpfr_set_str_binary (x, "0.101100100000000000110100E15");
51 1.1 mrg inex = mpfr_exp10 (y, x, MPFR_RNDN);
52 1.1 mrg if (!mpfr_inf_p (y) || inex <= 0)
53 1.1 mrg {
54 1.1 mrg printf ("Overflow error.\n");
55 1.1 mrg mpfr_dump (y);
56 1.1 mrg printf ("inex = %d\n", inex);
57 1.1 mrg exit (1);
58 1.1 mrg }
59 1.1 mrg
60 1.1 mrg mpfr_clear (y);
61 1.1 mrg mpfr_clear (x);
62 1.1 mrg set_emin (emin);
63 1.1 mrg set_emax (emax);
64 1.1 mrg }
65 1.1 mrg
66 1.1 mrg static void
67 1.1 mrg emax_m_eps (void)
68 1.1 mrg {
69 1.1 mrg if (mpfr_get_emax () <= LONG_MAX)
70 1.1 mrg {
71 1.1 mrg mpfr_t x, y;
72 1.1 mrg int inex, ov;
73 1.1 mrg
74 1.1 mrg mpfr_init2 (x, sizeof(mpfr_exp_t) * CHAR_BIT * 4);
75 1.1 mrg mpfr_init2 (y, 8);
76 1.1 mrg mpfr_set_si (x, mpfr_get_emax (), MPFR_RNDN);
77 1.1 mrg
78 1.1 mrg mpfr_clear_flags ();
79 1.1 mrg inex = mpfr_exp10 (y, x, MPFR_RNDN);
80 1.1 mrg ov = mpfr_overflow_p ();
81 1.1 mrg if (!ov || !mpfr_inf_p (y) || inex <= 0)
82 1.1 mrg {
83 1.1 mrg printf ("Overflow error for x = emax, MPFR_RNDN.\n");
84 1.1 mrg mpfr_dump (y);
85 1.1 mrg printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no ");
86 1.1 mrg exit (1);
87 1.1 mrg }
88 1.1 mrg
89 1.1 mrg mpfr_clear (x);
90 1.1 mrg mpfr_clear (y);
91 1.1 mrg }
92 1.1 mrg }
93 1.1 mrg
94 1.1 mrg static void
95 1.1 mrg exp_range (void)
96 1.1 mrg {
97 1.1 mrg mpfr_t x;
98 1.1 mrg mpfr_exp_t emin;
99 1.1 mrg
100 1.1 mrg emin = mpfr_get_emin ();
101 1.1 mrg set_emin (3);
102 1.1 mrg mpfr_init2 (x, 16);
103 1.1 mrg mpfr_set_ui (x, 4, MPFR_RNDN);
104 1.1 mrg mpfr_exp10 (x, x, MPFR_RNDN);
105 1.1 mrg set_emin (emin);
106 1.1 mrg if (mpfr_nan_p (x) || mpfr_cmp_ui (x, 10000) != 0)
107 1.1 mrg {
108 1.1 mrg printf ("Error in mpfr_exp10 for x = 4, with emin = 3\n");
109 1.1 mrg printf ("Expected 10000, got ");
110 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
111 1.1 mrg printf ("\n");
112 1.1 mrg exit (1);
113 1.1 mrg }
114 1.1 mrg mpfr_clear (x);
115 1.1 mrg }
116 1.1 mrg
117 1.1 mrg static void
118 1.1 mrg overfl_exp10_0 (void)
119 1.1 mrg {
120 1.1 mrg mpfr_t x, y;
121 1.1 mrg int emax, i, inex, rnd, err = 0;
122 1.1 mrg mpfr_exp_t old_emax;
123 1.1 mrg
124 1.1 mrg old_emax = mpfr_get_emax ();
125 1.1 mrg
126 1.1 mrg mpfr_init2 (x, 8);
127 1.1 mrg mpfr_init2 (y, 8);
128 1.1 mrg
129 1.1 mrg for (emax = -1; emax <= 0; emax++)
130 1.1 mrg {
131 1.1 mrg mpfr_set_ui_2exp (y, 1, emax, MPFR_RNDN);
132 1.1 mrg mpfr_nextbelow (y);
133 1.1 mrg set_emax (emax); /* 1 is not representable. */
134 1.1 mrg /* and if emax < 0, 1 - eps is not representable either. */
135 1.1 mrg for (i = -1; i <= 1; i++)
136 1.1 mrg RND_LOOP (rnd)
137 1.1 mrg {
138 1.1 mrg mpfr_set_si_2exp (x, i, -512 * ABS (i), MPFR_RNDN);
139 1.1 mrg mpfr_clear_flags ();
140 1.1 mrg inex = mpfr_exp10 (x, x, (mpfr_rnd_t) rnd);
141 1.1 mrg if ((i >= 0 || emax < 0 || rnd == MPFR_RNDN || rnd == MPFR_RNDU) &&
142 1.1 mrg ! mpfr_overflow_p ())
143 1.1 mrg {
144 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
145 1.1 mrg " The overflow flag is not set.\n",
146 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
147 1.1 mrg err = 1;
148 1.1 mrg }
149 1.1 mrg if (rnd == MPFR_RNDZ || rnd == MPFR_RNDD)
150 1.1 mrg {
151 1.1 mrg if (inex >= 0)
152 1.1 mrg {
153 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
154 1.1 mrg " The inexact value must be negative.\n",
155 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
156 1.1 mrg err = 1;
157 1.1 mrg }
158 1.1 mrg if (! mpfr_equal_p (x, y))
159 1.1 mrg {
160 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
161 1.1 mrg " Got ", i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
162 1.1 mrg mpfr_print_binary (x);
163 1.1 mrg printf (" instead of 0.11111111E%d.\n", emax);
164 1.1 mrg err = 1;
165 1.1 mrg }
166 1.1 mrg }
167 1.1 mrg else
168 1.1 mrg {
169 1.1 mrg if (inex <= 0)
170 1.1 mrg {
171 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
172 1.1 mrg " The inexact value must be positive.\n",
173 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
174 1.1 mrg err = 1;
175 1.1 mrg }
176 1.1 mrg if (! (mpfr_inf_p (x) && MPFR_SIGN (x) > 0))
177 1.1 mrg {
178 1.1 mrg printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
179 1.1 mrg " Got ", i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
180 1.1 mrg mpfr_print_binary (x);
181 1.1 mrg printf (" instead of +Inf.\n");
182 1.1 mrg err = 1;
183 1.1 mrg }
184 1.1 mrg }
185 1.1 mrg }
186 1.1 mrg set_emax (old_emax);
187 1.1 mrg }
188 1.1 mrg
189 1.1 mrg if (err)
190 1.1 mrg exit (1);
191 1.1 mrg mpfr_clear (x);
192 1.1 mrg mpfr_clear (y);
193 1.1 mrg }
194 1.1 mrg
195 1.1 mrg int
196 1.1 mrg main (int argc, char *argv[])
197 1.1 mrg {
198 1.1 mrg mpfr_t x, y;
199 1.1 mrg mpfr_exp_t emin, emax;
200 1.1 mrg int inex, ov;
201 1.1 mrg
202 1.1 mrg tests_start_mpfr ();
203 1.1 mrg
204 1.1 mrg special_overflow ();
205 1.1 mrg emax_m_eps ();
206 1.1 mrg exp_range ();
207 1.1 mrg
208 1.1 mrg mpfr_init (x);
209 1.1 mrg mpfr_init (y);
210 1.1 mrg
211 1.1 mrg mpfr_set_ui (x, 4, MPFR_RNDN);
212 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
213 1.1 mrg if (mpfr_cmp_ui (y, 10000) != 0)
214 1.1 mrg {
215 1.1 mrg printf ("Error for 10^4, MPFR_RNDN\n");
216 1.1 mrg exit (1);
217 1.1 mrg }
218 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDD);
219 1.1 mrg if (mpfr_cmp_ui (y, 10000) != 0)
220 1.1 mrg {
221 1.1 mrg printf ("Error for 10^4, MPFR_RNDD\n");
222 1.1 mrg exit (1);
223 1.1 mrg }
224 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDU);
225 1.1 mrg if (mpfr_cmp_ui (y, 10000) != 0)
226 1.1 mrg {
227 1.1 mrg printf ("Error for 10^4, MPFR_RNDU\n");
228 1.1 mrg exit (1);
229 1.1 mrg }
230 1.1 mrg
231 1.1 mrg mpfr_set_prec (x, 10);
232 1.1 mrg mpfr_set_prec (y, 10);
233 1.1 mrg /* save emin */
234 1.1 mrg emin = mpfr_get_emin ();
235 1.1 mrg set_emin (-11);
236 1.1 mrg mpfr_set_si (x, -4, MPFR_RNDN);
237 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
238 1.1 mrg if (mpfr_cmp_ui (y, 0) || mpfr_sgn (y) < 0)
239 1.1 mrg {
240 1.1 mrg printf ("Error for emin = -11, x = -4, RNDN\n");
241 1.1 mrg printf ("Expected +0\n");
242 1.1 mrg printf ("Got "); mpfr_print_binary (y); puts ("");
243 1.1 mrg exit (1);
244 1.1 mrg }
245 1.1 mrg /* restore emin */
246 1.1 mrg set_emin (emin);
247 1.1 mrg
248 1.1 mrg /* save emax */
249 1.1 mrg emax = mpfr_get_emax ();
250 1.1 mrg set_emax (13);
251 1.1 mrg mpfr_set_ui (x, 4, MPFR_RNDN);
252 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
253 1.1 mrg if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
254 1.1 mrg {
255 1.1 mrg printf ("Error for emax = 13, x = 4, RNDN\n");
256 1.1 mrg printf ("Expected +inf\n");
257 1.1 mrg printf ("Got "); mpfr_print_binary (y); puts ("");
258 1.1 mrg exit (1);
259 1.1 mrg }
260 1.1 mrg /* restore emax */
261 1.1 mrg set_emax (emax);
262 1.1 mrg
263 1.1 mrg MPFR_SET_INF (x);
264 1.1 mrg MPFR_SET_POS (x);
265 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
266 1.1 mrg if (!MPFR_IS_INF (y))
267 1.1 mrg {
268 1.1 mrg printf ("evaluation of function in INF does not return INF\n");
269 1.1 mrg exit (1);
270 1.1 mrg }
271 1.1 mrg
272 1.1 mrg MPFR_CHANGE_SIGN (x);
273 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
274 1.1 mrg if (!MPFR_IS_ZERO (y))
275 1.1 mrg {
276 1.1 mrg printf ("evaluation of function in -INF does not return 0\n");
277 1.1 mrg exit (1);
278 1.1 mrg }
279 1.1 mrg
280 1.1 mrg MPFR_SET_NAN (x);
281 1.1 mrg mpfr_exp10 (y, x, MPFR_RNDN);
282 1.1 mrg if (!MPFR_IS_NAN (y))
283 1.1 mrg {
284 1.1 mrg printf ("evaluation of function in NaN does not return NaN\n");
285 1.1 mrg exit (1);
286 1.1 mrg }
287 1.1 mrg
288 1.1 mrg if ((mpfr_uexp_t) 8 << 31 != 0 ||
289 1.1 mrg mpfr_get_emax () <= (mpfr_uexp_t) 100000 * 100000)
290 1.1 mrg {
291 1.1 mrg /* emax <= 10000000000 */
292 1.1 mrg mpfr_set_prec (x, 40);
293 1.1 mrg mpfr_set_prec (y, 40);
294 1.1 mrg mpfr_set_str (x, "3010299957", 10, MPFR_RNDN);
295 1.1 mrg mpfr_clear_flags ();
296 1.1 mrg inex = mpfr_exp10 (y, x, MPFR_RNDN);
297 1.1 mrg ov = mpfr_overflow_p ();
298 1.1 mrg if (!(MPFR_IS_INF (y) && MPFR_IS_POS (y) && ov))
299 1.1 mrg {
300 1.1 mrg printf ("Overflow error for x = 3010299957, MPFR_RNDN.\n");
301 1.1 mrg mpfr_dump (y);
302 1.1 mrg printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no ");
303 1.1 mrg exit (1);
304 1.1 mrg }
305 1.1 mrg }
306 1.1 mrg
307 1.1 mrg test_generic (2, 100, 100);
308 1.1 mrg
309 1.1 mrg mpfr_clear (x);
310 1.1 mrg mpfr_clear (y);
311 1.1 mrg
312 1.1 mrg overfl_exp10_0 ();
313 1.1 mrg
314 1.1 mrg data_check ("data/exp10", mpfr_exp10, "mpfr_exp10");
315 1.1 mrg
316 1.1 mrg tests_end_mpfr ();
317 1.1 mrg return 0;
318 1.1 mrg }
319