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