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