tset_sj.c revision 1.1.1.6 1 1.1 mrg /* Test file for
2 1.1 mrg mpfr_set_sj, mpfr_set_uj, mpfr_set_sj_2exp and mpfr_set_uj_2exp.
3 1.1 mrg
4 1.1.1.6 mrg Copyright 2004, 2006-2023 Free Software Foundation, Inc.
5 1.1.1.3 mrg Contributed by the AriC and Caramba projects, INRIA.
6 1.1 mrg
7 1.1 mrg This file is part of the GNU MPFR Library.
8 1.1 mrg
9 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
10 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
11 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
12 1.1 mrg option) any later version.
13 1.1 mrg
14 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
15 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 1.1 mrg License for more details.
18 1.1 mrg
19 1.1 mrg You should have received a copy of the GNU Lesser General Public License
20 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
21 1.1.1.5 mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
22 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
23 1.1 mrg
24 1.1.1.5 mrg #define MPFR_NEED_INTMAX_H
25 1.1 mrg #include "mpfr-test.h"
26 1.1 mrg
27 1.1 mrg #ifndef _MPFR_H_HAVE_INTMAX_T
28 1.1.1.2 mrg
29 1.1 mrg int
30 1.1 mrg main (void)
31 1.1 mrg {
32 1.1.1.2 mrg return 77;
33 1.1 mrg }
34 1.1.1.2 mrg
35 1.1 mrg #else
36 1.1 mrg
37 1.1.1.4 mrg #define PRINT_ERROR(str) \
38 1.1.1.4 mrg do { printf ("Error for %s\n", str); exit (1); } while (0)
39 1.1 mrg
40 1.1 mrg static int
41 1.1 mrg inexact_sign (int x)
42 1.1 mrg {
43 1.1 mrg return (x < 0) ? -1 : (x > 0);
44 1.1 mrg }
45 1.1 mrg
46 1.1 mrg static void
47 1.1 mrg check_set_uj (mpfr_prec_t pmin, mpfr_prec_t pmax, int N)
48 1.1 mrg {
49 1.1 mrg mpfr_t x, y;
50 1.1 mrg mpfr_prec_t p;
51 1.1 mrg int inex1, inex2, n;
52 1.1 mrg mp_limb_t limb;
53 1.1 mrg
54 1.1 mrg mpfr_inits2 (pmax, x, y, (mpfr_ptr) 0);
55 1.1 mrg
56 1.1.1.4 mrg for (p = pmin ; p < pmax ; p++)
57 1.1 mrg {
58 1.1 mrg mpfr_set_prec (x, p);
59 1.1 mrg mpfr_set_prec (y, p);
60 1.1 mrg for (n = 0 ; n < N ; n++)
61 1.1 mrg {
62 1.1 mrg /* mp_limb_t may be unsigned long long */
63 1.1 mrg limb = (unsigned long) randlimb ();
64 1.1 mrg inex1 = mpfr_set_uj (x, limb, MPFR_RNDN);
65 1.1 mrg inex2 = mpfr_set_ui (y, limb, MPFR_RNDN);
66 1.1 mrg if (mpfr_cmp (x, y))
67 1.1 mrg {
68 1.1 mrg printf ("ERROR for mpfr_set_uj and j=%lu and p=%lu\n",
69 1.1.1.2 mrg (unsigned long) limb, (unsigned long) p);
70 1.1 mrg printf ("X="); mpfr_dump (x);
71 1.1 mrg printf ("Y="); mpfr_dump (y);
72 1.1 mrg exit (1);
73 1.1 mrg }
74 1.1 mrg if (inexact_sign (inex1) != inexact_sign (inex2))
75 1.1 mrg {
76 1.1 mrg printf ("ERROR for inexact(set_uj): j=%lu p=%lu\n"
77 1.1 mrg "Inexact1= %d Inexact2= %d\n",
78 1.1.1.2 mrg (unsigned long) limb, (unsigned long) p, inex1, inex2);
79 1.1 mrg exit (1);
80 1.1 mrg }
81 1.1 mrg }
82 1.1 mrg }
83 1.1 mrg /* Special case */
84 1.1 mrg mpfr_set_prec (x, sizeof(uintmax_t)*CHAR_BIT);
85 1.1.1.5 mrg inex1 = mpfr_set_uj (x, UINTMAX_MAX, MPFR_RNDN);
86 1.1 mrg if (inex1 != 0 || mpfr_sgn(x) <= 0)
87 1.1.1.4 mrg PRINT_ERROR ("inexact / UINTMAX_MAX");
88 1.1 mrg inex1 = mpfr_add_ui (x, x, 1, MPFR_RNDN);
89 1.1 mrg if (inex1 != 0 || !mpfr_powerof2_raw (x)
90 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(uintmax_t) * CHAR_BIT + 1)
91 1.1.1.4 mrg PRINT_ERROR ("power of 2");
92 1.1 mrg mpfr_set_uj (x, 0, MPFR_RNDN);
93 1.1 mrg if (!MPFR_IS_ZERO (x))
94 1.1.1.4 mrg PRINT_ERROR ("Setting 0");
95 1.1 mrg
96 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0);
97 1.1 mrg }
98 1.1 mrg
99 1.1 mrg static void
100 1.1 mrg check_set_uj_2exp (void)
101 1.1 mrg {
102 1.1 mrg mpfr_t x;
103 1.1 mrg int inex;
104 1.1 mrg
105 1.1 mrg mpfr_init2 (x, sizeof(uintmax_t)*CHAR_BIT);
106 1.1 mrg
107 1.1 mrg inex = mpfr_set_uj_2exp (x, 1, 0, MPFR_RNDN);
108 1.1 mrg if (inex || mpfr_cmp_ui(x, 1))
109 1.1.1.4 mrg PRINT_ERROR ("(1U,0)");
110 1.1 mrg
111 1.1 mrg inex = mpfr_set_uj_2exp (x, 1024, -10, MPFR_RNDN);
112 1.1 mrg if (inex || mpfr_cmp_ui(x, 1))
113 1.1.1.4 mrg PRINT_ERROR ("(1024U,-10)");
114 1.1 mrg
115 1.1 mrg inex = mpfr_set_uj_2exp (x, 1024, 10, MPFR_RNDN);
116 1.1 mrg if (inex || mpfr_cmp_ui(x, 1024L * 1024L))
117 1.1.1.4 mrg PRINT_ERROR ("(1024U,+10)");
118 1.1 mrg
119 1.1.1.5 mrg inex = mpfr_set_uj_2exp (x, UINTMAX_MAX, 1000, MPFR_RNDN);
120 1.1 mrg inex |= mpfr_div_2ui (x, x, 1000, MPFR_RNDN);
121 1.1 mrg inex |= mpfr_add_ui (x, x, 1, MPFR_RNDN);
122 1.1 mrg if (inex || !mpfr_powerof2_raw (x)
123 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(uintmax_t) * CHAR_BIT + 1)
124 1.1.1.4 mrg PRINT_ERROR ("(UINTMAX_MAX)");
125 1.1 mrg
126 1.1.1.5 mrg inex = mpfr_set_uj_2exp (x, UINTMAX_MAX, MPFR_EMAX_MAX-10, MPFR_RNDN);
127 1.1 mrg if (inex == 0 || !mpfr_inf_p (x))
128 1.1.1.4 mrg PRINT_ERROR ("Overflow");
129 1.1 mrg
130 1.1.1.5 mrg inex = mpfr_set_uj_2exp (x, UINTMAX_MAX, MPFR_EMIN_MIN-1000, MPFR_RNDN);
131 1.1 mrg if (inex == 0 || !MPFR_IS_ZERO (x))
132 1.1.1.4 mrg PRINT_ERROR ("Underflow");
133 1.1 mrg
134 1.1 mrg mpfr_clear (x);
135 1.1 mrg }
136 1.1 mrg
137 1.1 mrg static void
138 1.1 mrg check_set_sj (void)
139 1.1 mrg {
140 1.1 mrg mpfr_t x;
141 1.1 mrg int inex;
142 1.1 mrg
143 1.1 mrg mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1);
144 1.1 mrg
145 1.1.1.5 mrg inex = mpfr_set_sj (x, -INTMAX_MAX, MPFR_RNDN);
146 1.1 mrg inex |= mpfr_add_si (x, x, -1, MPFR_RNDN);
147 1.1 mrg if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x)
148 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(intmax_t) * CHAR_BIT)
149 1.1.1.4 mrg PRINT_ERROR ("set_sj (-INTMAX_MAX)");
150 1.1 mrg
151 1.1 mrg inex = mpfr_set_sj (x, 1742, MPFR_RNDN);
152 1.1 mrg if (inex || mpfr_cmp_ui (x, 1742))
153 1.1.1.4 mrg PRINT_ERROR ("set_sj (1742)");
154 1.1 mrg
155 1.1 mrg mpfr_clear (x);
156 1.1 mrg }
157 1.1 mrg
158 1.1 mrg static void
159 1.1 mrg check_set_sj_2exp (void)
160 1.1 mrg {
161 1.1 mrg mpfr_t x;
162 1.1 mrg int inex;
163 1.1 mrg
164 1.1 mrg mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1);
165 1.1 mrg
166 1.1.1.5 mrg inex = mpfr_set_sj_2exp (x, INTMAX_MIN, 1000, MPFR_RNDN);
167 1.1 mrg if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x)
168 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(intmax_t) * CHAR_BIT + 1000)
169 1.1.1.4 mrg PRINT_ERROR ("set_sj_2exp (INTMAX_MIN)");
170 1.1 mrg
171 1.1 mrg mpfr_clear (x);
172 1.1 mrg }
173 1.1 mrg
174 1.1.1.5 mrg #define REXP 1024
175 1.1.1.5 mrg
176 1.1.1.5 mrg static void
177 1.1.1.5 mrg test_2exp_extreme_aux (void)
178 1.1.1.5 mrg {
179 1.1.1.5 mrg mpfr_t x1, x2, y;
180 1.1.1.5 mrg mpfr_exp_t e, ep[1 + 8 * 5], eb[] =
181 1.1.1.5 mrg { MPFR_EMIN_MIN, -REXP, REXP, MPFR_EMAX_MAX, MPFR_EXP_MAX };
182 1.1.1.5 mrg mpfr_flags_t flags1, flags2;
183 1.1.1.5 mrg int i, j, rnd, inex1, inex2;
184 1.1.1.5 mrg char s;
185 1.1.1.5 mrg
186 1.1.1.5 mrg ep[0] = MPFR_EXP_MIN;
187 1.1.1.5 mrg for (i = 0; i < numberof(eb); i++)
188 1.1.1.5 mrg for (j = 0; j < 8; j++)
189 1.1.1.5 mrg ep[1 + 8 * i + j] = eb[i] - j;
190 1.1.1.5 mrg
191 1.1.1.5 mrg mpfr_inits2 (3, x1, x2, (mpfr_ptr) 0);
192 1.1.1.5 mrg mpfr_init2 (y, 32);
193 1.1.1.5 mrg
194 1.1.1.5 mrg /* The cast to int is needed if numberof(ep) is of unsigned type, in
195 1.1.1.5 mrg which case the condition without the cast would be always false. */
196 1.1.1.5 mrg for (i = -2; i < (int) numberof(ep); i++)
197 1.1.1.5 mrg for (j = -31; j <= 31; j++)
198 1.1.1.5 mrg RND_LOOP_NO_RNDF (rnd)
199 1.1.1.5 mrg {
200 1.1.1.5 mrg int sign = j < 0 ? -1 : 1;
201 1.1.1.5 mrg intmax_t em;
202 1.1.1.5 mrg
203 1.1.1.5 mrg if (i < 0)
204 1.1.1.5 mrg {
205 1.1.1.5 mrg em = i == -2 ? INTMAX_MIN : INTMAX_MAX;
206 1.1.1.5 mrg mpfr_clear_flags ();
207 1.1.1.5 mrg inex1 = j == 0 ?
208 1.1.1.5 mrg (mpfr_set_zero (x1, +1), 0) : i == -2 ?
209 1.1.1.5 mrg mpfr_underflow (x1, rnd == MPFR_RNDN ?
210 1.1.1.5 mrg MPFR_RNDZ : (mpfr_rnd_t) rnd, sign) :
211 1.1.1.5 mrg mpfr_overflow (x1, (mpfr_rnd_t) rnd, sign);
212 1.1.1.5 mrg flags1 = __gmpfr_flags;
213 1.1.1.5 mrg }
214 1.1.1.5 mrg else
215 1.1.1.5 mrg {
216 1.1.1.5 mrg em = ep[i];
217 1.1.1.5 mrg /* Compute the expected value, inex and flags */
218 1.1.1.5 mrg inex1 = mpfr_set_si (y, j, MPFR_RNDN);
219 1.1.1.5 mrg MPFR_ASSERTN (inex1 == 0);
220 1.1.1.5 mrg inex1 = mpfr_set (x1, y, (mpfr_rnd_t) rnd);
221 1.1.1.5 mrg /* x1 is the rounded value and inex1 the ternary value,
222 1.1.1.5 mrg assuming that the exponent argument is 0 (this is the
223 1.1.1.5 mrg rounded significand of the final result, assuming an
224 1.1.1.5 mrg unbounded exponent range). The multiplication by a
225 1.1.1.5 mrg power of 2 is exact, unless underflow/overflow occurs.
226 1.1.1.5 mrg The tests on the exponent below avoid integer overflows
227 1.1.1.5 mrg (ep[i] may take extreme values). */
228 1.1.1.5 mrg mpfr_clear_flags ();
229 1.1.1.6 mrg if (j == 0)
230 1.1.1.6 mrg goto zero;
231 1.1.1.6 mrg e = MPFR_GET_EXP (x1);
232 1.1.1.6 mrg if (ep[i] < __gmpfr_emin - e) /* underflow */
233 1.1.1.5 mrg {
234 1.1.1.5 mrg mpfr_rnd_t r =
235 1.1.1.5 mrg (rnd == MPFR_RNDN &&
236 1.1.1.6 mrg (ep[i] < __gmpfr_emin - MPFR_GET_EXP (y) - 1 ||
237 1.1.1.5 mrg IS_POW2 (sign * j))) ?
238 1.1.1.5 mrg MPFR_RNDZ : (mpfr_rnd_t) rnd;
239 1.1.1.5 mrg inex1 = mpfr_underflow (x1, r, sign);
240 1.1.1.5 mrg flags1 = __gmpfr_flags;
241 1.1.1.5 mrg }
242 1.1.1.6 mrg else if (ep[i] > __gmpfr_emax - e) /* overflow */
243 1.1.1.5 mrg {
244 1.1.1.5 mrg inex1 = mpfr_overflow (x1, (mpfr_rnd_t) rnd, sign);
245 1.1.1.5 mrg flags1 = __gmpfr_flags;
246 1.1.1.5 mrg }
247 1.1.1.5 mrg else
248 1.1.1.5 mrg {
249 1.1.1.6 mrg mpfr_set_exp (x1, ep[i] + e);
250 1.1.1.6 mrg zero:
251 1.1.1.5 mrg flags1 = inex1 != 0 ? MPFR_FLAGS_INEXACT : 0;
252 1.1.1.5 mrg }
253 1.1.1.5 mrg }
254 1.1.1.5 mrg
255 1.1.1.5 mrg /* Test mpfr_set_sj_2exp */
256 1.1.1.5 mrg mpfr_clear_flags ();
257 1.1.1.5 mrg inex2 = mpfr_set_sj_2exp (x2, j, em, (mpfr_rnd_t) rnd);
258 1.1.1.5 mrg flags2 = __gmpfr_flags;
259 1.1.1.5 mrg
260 1.1.1.5 mrg if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) &&
261 1.1.1.5 mrg mpfr_equal_p (x1, x2)))
262 1.1.1.5 mrg {
263 1.1.1.5 mrg s = 's';
264 1.1.1.5 mrg goto err_extreme;
265 1.1.1.5 mrg }
266 1.1.1.5 mrg
267 1.1.1.5 mrg if (j < 0)
268 1.1.1.5 mrg continue;
269 1.1.1.5 mrg
270 1.1.1.5 mrg /* Test mpfr_set_uj_2exp */
271 1.1.1.5 mrg mpfr_clear_flags ();
272 1.1.1.5 mrg inex2 = mpfr_set_uj_2exp (x2, j, em, (mpfr_rnd_t) rnd);
273 1.1.1.5 mrg flags2 = __gmpfr_flags;
274 1.1.1.5 mrg
275 1.1.1.5 mrg if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) &&
276 1.1.1.5 mrg mpfr_equal_p (x1, x2)))
277 1.1.1.5 mrg {
278 1.1.1.5 mrg s = 'u';
279 1.1.1.5 mrg err_extreme:
280 1.1.1.5 mrg printf ("Error in extreme mpfr_set_%cj_2exp for i=%d j=%d %s\n",
281 1.1.1.5 mrg s, i, j, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
282 1.1.1.5 mrg printf ("emin=%" MPFR_EXP_FSPEC "d "
283 1.1.1.5 mrg "emax=%" MPFR_EXP_FSPEC "d\n",
284 1.1.1.5 mrg (mpfr_eexp_t) __gmpfr_emin,
285 1.1.1.5 mrg (mpfr_eexp_t) __gmpfr_emax);
286 1.1.1.5 mrg #ifndef NPRINTF_J
287 1.1.1.5 mrg printf ("e = %jd\n", em);
288 1.1.1.5 mrg #endif
289 1.1.1.5 mrg printf ("Expected ");
290 1.1.1.5 mrg mpfr_dump (x1);
291 1.1.1.5 mrg printf ("with inex = %d and flags =", inex1);
292 1.1.1.5 mrg flags_out (flags1);
293 1.1.1.5 mrg printf ("Got ");
294 1.1.1.5 mrg mpfr_dump (x2);
295 1.1.1.5 mrg printf ("with inex = %d and flags =", inex2);
296 1.1.1.5 mrg flags_out (flags2);
297 1.1.1.5 mrg exit (1);
298 1.1.1.5 mrg }
299 1.1.1.5 mrg }
300 1.1.1.5 mrg
301 1.1.1.5 mrg mpfr_clears (x1, x2, y, (mpfr_ptr) 0);
302 1.1.1.5 mrg }
303 1.1.1.5 mrg
304 1.1.1.5 mrg static void
305 1.1.1.5 mrg test_2exp_extreme (void)
306 1.1.1.5 mrg {
307 1.1.1.5 mrg mpfr_exp_t emin, emax;
308 1.1.1.5 mrg
309 1.1.1.5 mrg emin = mpfr_get_emin ();
310 1.1.1.5 mrg emax = mpfr_get_emax ();
311 1.1.1.5 mrg
312 1.1.1.5 mrg set_emin (MPFR_EMIN_MIN);
313 1.1.1.5 mrg set_emax (MPFR_EMAX_MAX);
314 1.1.1.5 mrg test_2exp_extreme_aux ();
315 1.1.1.5 mrg
316 1.1.1.5 mrg set_emin (-REXP);
317 1.1.1.5 mrg set_emax (REXP);
318 1.1.1.5 mrg test_2exp_extreme_aux ();
319 1.1.1.5 mrg
320 1.1.1.5 mrg set_emin (emin);
321 1.1.1.5 mrg set_emax (emax);
322 1.1.1.5 mrg }
323 1.1.1.5 mrg
324 1.1 mrg int
325 1.1 mrg main (int argc, char *argv[])
326 1.1 mrg {
327 1.1 mrg tests_start_mpfr ();
328 1.1 mrg
329 1.1 mrg check_set_uj (2, 128, 50);
330 1.1 mrg check_set_uj_2exp ();
331 1.1 mrg check_set_sj ();
332 1.1 mrg check_set_sj_2exp ();
333 1.1.1.5 mrg test_2exp_extreme ();
334 1.1 mrg
335 1.1 mrg tests_end_mpfr ();
336 1.1 mrg return 0;
337 1.1 mrg }
338 1.1 mrg
339 1.1 mrg #endif
340