tset_sj.c revision 1.1.1.4 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.4 mrg Copyright 2004, 2006-2018 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 mrg http://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 mrg #ifdef HAVE_CONFIG_H
25 1.1.1.4 mrg # include "config.h"
26 1.1 mrg #endif
27 1.1 mrg
28 1.1 mrg
29 1.1.1.2 mrg #include "mpfr-intmax.h"
30 1.1 mrg #include "mpfr-test.h"
31 1.1 mrg
32 1.1 mrg #ifndef _MPFR_H_HAVE_INTMAX_T
33 1.1.1.2 mrg
34 1.1 mrg int
35 1.1 mrg main (void)
36 1.1 mrg {
37 1.1.1.2 mrg return 77;
38 1.1 mrg }
39 1.1.1.2 mrg
40 1.1 mrg #else
41 1.1 mrg
42 1.1.1.4 mrg #define PRINT_ERROR(str) \
43 1.1.1.4 mrg do { printf ("Error for %s\n", str); exit (1); } while (0)
44 1.1 mrg
45 1.1 mrg static int
46 1.1 mrg inexact_sign (int x)
47 1.1 mrg {
48 1.1 mrg return (x < 0) ? -1 : (x > 0);
49 1.1 mrg }
50 1.1 mrg
51 1.1 mrg static void
52 1.1 mrg check_set_uj (mpfr_prec_t pmin, mpfr_prec_t pmax, int N)
53 1.1 mrg {
54 1.1 mrg mpfr_t x, y;
55 1.1 mrg mpfr_prec_t p;
56 1.1 mrg int inex1, inex2, n;
57 1.1 mrg mp_limb_t limb;
58 1.1 mrg
59 1.1 mrg mpfr_inits2 (pmax, x, y, (mpfr_ptr) 0);
60 1.1 mrg
61 1.1.1.4 mrg for (p = pmin ; p < pmax ; p++)
62 1.1 mrg {
63 1.1 mrg mpfr_set_prec (x, p);
64 1.1 mrg mpfr_set_prec (y, p);
65 1.1 mrg for (n = 0 ; n < N ; n++)
66 1.1 mrg {
67 1.1 mrg /* mp_limb_t may be unsigned long long */
68 1.1 mrg limb = (unsigned long) randlimb ();
69 1.1 mrg inex1 = mpfr_set_uj (x, limb, MPFR_RNDN);
70 1.1 mrg inex2 = mpfr_set_ui (y, limb, MPFR_RNDN);
71 1.1 mrg if (mpfr_cmp (x, y))
72 1.1 mrg {
73 1.1 mrg printf ("ERROR for mpfr_set_uj and j=%lu and p=%lu\n",
74 1.1.1.2 mrg (unsigned long) limb, (unsigned long) p);
75 1.1 mrg printf ("X="); mpfr_dump (x);
76 1.1 mrg printf ("Y="); mpfr_dump (y);
77 1.1 mrg exit (1);
78 1.1 mrg }
79 1.1 mrg if (inexact_sign (inex1) != inexact_sign (inex2))
80 1.1 mrg {
81 1.1 mrg printf ("ERROR for inexact(set_uj): j=%lu p=%lu\n"
82 1.1 mrg "Inexact1= %d Inexact2= %d\n",
83 1.1.1.2 mrg (unsigned long) limb, (unsigned long) p, inex1, inex2);
84 1.1 mrg exit (1);
85 1.1 mrg }
86 1.1 mrg }
87 1.1 mrg }
88 1.1 mrg /* Special case */
89 1.1 mrg mpfr_set_prec (x, sizeof(uintmax_t)*CHAR_BIT);
90 1.1 mrg inex1 = mpfr_set_uj (x, MPFR_UINTMAX_MAX, MPFR_RNDN);
91 1.1 mrg if (inex1 != 0 || mpfr_sgn(x) <= 0)
92 1.1.1.4 mrg PRINT_ERROR ("inexact / UINTMAX_MAX");
93 1.1 mrg inex1 = mpfr_add_ui (x, x, 1, MPFR_RNDN);
94 1.1 mrg if (inex1 != 0 || !mpfr_powerof2_raw (x)
95 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(uintmax_t) * CHAR_BIT + 1)
96 1.1.1.4 mrg PRINT_ERROR ("power of 2");
97 1.1 mrg mpfr_set_uj (x, 0, MPFR_RNDN);
98 1.1 mrg if (!MPFR_IS_ZERO (x))
99 1.1.1.4 mrg PRINT_ERROR ("Setting 0");
100 1.1 mrg
101 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0);
102 1.1 mrg }
103 1.1 mrg
104 1.1 mrg static void
105 1.1 mrg check_set_uj_2exp (void)
106 1.1 mrg {
107 1.1 mrg mpfr_t x;
108 1.1 mrg int inex;
109 1.1 mrg
110 1.1 mrg mpfr_init2 (x, sizeof(uintmax_t)*CHAR_BIT);
111 1.1 mrg
112 1.1 mrg inex = mpfr_set_uj_2exp (x, 1, 0, MPFR_RNDN);
113 1.1 mrg if (inex || mpfr_cmp_ui(x, 1))
114 1.1.1.4 mrg PRINT_ERROR ("(1U,0)");
115 1.1 mrg
116 1.1 mrg inex = mpfr_set_uj_2exp (x, 1024, -10, MPFR_RNDN);
117 1.1 mrg if (inex || mpfr_cmp_ui(x, 1))
118 1.1.1.4 mrg PRINT_ERROR ("(1024U,-10)");
119 1.1 mrg
120 1.1 mrg inex = mpfr_set_uj_2exp (x, 1024, 10, MPFR_RNDN);
121 1.1 mrg if (inex || mpfr_cmp_ui(x, 1024L * 1024L))
122 1.1.1.4 mrg PRINT_ERROR ("(1024U,+10)");
123 1.1 mrg
124 1.1 mrg inex = mpfr_set_uj_2exp (x, MPFR_UINTMAX_MAX, 1000, MPFR_RNDN);
125 1.1 mrg inex |= mpfr_div_2ui (x, x, 1000, MPFR_RNDN);
126 1.1 mrg inex |= mpfr_add_ui (x, x, 1, MPFR_RNDN);
127 1.1 mrg if (inex || !mpfr_powerof2_raw (x)
128 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(uintmax_t) * CHAR_BIT + 1)
129 1.1.1.4 mrg PRINT_ERROR ("(UINTMAX_MAX)");
130 1.1 mrg
131 1.1 mrg inex = mpfr_set_uj_2exp (x, MPFR_UINTMAX_MAX, MPFR_EMAX_MAX-10, MPFR_RNDN);
132 1.1 mrg if (inex == 0 || !mpfr_inf_p (x))
133 1.1.1.4 mrg PRINT_ERROR ("Overflow");
134 1.1 mrg
135 1.1 mrg inex = mpfr_set_uj_2exp (x, MPFR_UINTMAX_MAX, MPFR_EMIN_MIN-1000, MPFR_RNDN);
136 1.1 mrg if (inex == 0 || !MPFR_IS_ZERO (x))
137 1.1.1.4 mrg PRINT_ERROR ("Underflow");
138 1.1 mrg
139 1.1 mrg mpfr_clear (x);
140 1.1 mrg }
141 1.1 mrg
142 1.1 mrg static void
143 1.1 mrg check_set_sj (void)
144 1.1 mrg {
145 1.1 mrg mpfr_t x;
146 1.1 mrg int inex;
147 1.1 mrg
148 1.1 mrg mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1);
149 1.1 mrg
150 1.1 mrg inex = mpfr_set_sj (x, -MPFR_INTMAX_MAX, MPFR_RNDN);
151 1.1 mrg inex |= mpfr_add_si (x, x, -1, MPFR_RNDN);
152 1.1 mrg if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x)
153 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(intmax_t) * CHAR_BIT)
154 1.1.1.4 mrg PRINT_ERROR ("set_sj (-INTMAX_MAX)");
155 1.1 mrg
156 1.1 mrg inex = mpfr_set_sj (x, 1742, MPFR_RNDN);
157 1.1 mrg if (inex || mpfr_cmp_ui (x, 1742))
158 1.1.1.4 mrg PRINT_ERROR ("set_sj (1742)");
159 1.1 mrg
160 1.1 mrg mpfr_clear (x);
161 1.1 mrg }
162 1.1 mrg
163 1.1 mrg static void
164 1.1 mrg check_set_sj_2exp (void)
165 1.1 mrg {
166 1.1 mrg mpfr_t x;
167 1.1 mrg int inex;
168 1.1 mrg
169 1.1 mrg mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1);
170 1.1 mrg
171 1.1 mrg inex = mpfr_set_sj_2exp (x, MPFR_INTMAX_MIN, 1000, MPFR_RNDN);
172 1.1 mrg if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x)
173 1.1.1.4 mrg || MPFR_EXP (x) != sizeof(intmax_t) * CHAR_BIT + 1000)
174 1.1.1.4 mrg PRINT_ERROR ("set_sj_2exp (INTMAX_MIN)");
175 1.1 mrg
176 1.1 mrg mpfr_clear (x);
177 1.1 mrg }
178 1.1 mrg
179 1.1 mrg int
180 1.1 mrg main (int argc, char *argv[])
181 1.1 mrg {
182 1.1 mrg tests_start_mpfr ();
183 1.1 mrg
184 1.1 mrg check_set_uj (2, 128, 50);
185 1.1 mrg check_set_uj_2exp ();
186 1.1 mrg check_set_sj ();
187 1.1 mrg check_set_sj_2exp ();
188 1.1 mrg
189 1.1 mrg tests_end_mpfr ();
190 1.1 mrg return 0;
191 1.1 mrg }
192 1.1 mrg
193 1.1 mrg #endif
194