Annotation of OpenXM_contrib/gmp/tests/mpf/t-trunc.c, Revision 1.1.1.1
1.1 ohara 1: /* Test mpf_trunc, mpf_ceil, mpf_floor.
2:
3: Copyright 2001, 2002 Free Software Foundation, Inc.
4:
5: This file is part of the GNU MP Library.
6:
7: The GNU MP Library is free software; you can redistribute it and/or modify
8: it under the terms of the GNU Lesser General Public License as published by
9: the Free Software Foundation; either version 2.1 of the License, or (at your
10: option) any later version.
11:
12: The GNU MP Library is distributed in the hope that it will be useful, but
13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15: License for more details.
16:
17: You should have received a copy of the GNU Lesser General Public License
18: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20: MA 02111-1307, USA. */
21:
22: #include <stdio.h>
23: #include <stdlib.h>
24: #include "gmp.h"
25: #include "gmp-impl.h"
26: #include "tests.h"
27:
28:
29: void
30: check_print (mpf_srcptr src, mpf_srcptr got, mpf_srcptr want)
31: {
32: mp_trace_base = 16;
33: mpf_trace ("src ", src);
34: mpf_trace ("got ", got);
35: mpf_trace ("want", want);
36:
37: printf ("got size=%d exp=%ld\n", SIZ(got), EXP(got));
38: mpn_trace (" limbs=", PTR(got), ABSIZ(got));
39:
40: printf ("want size=%d exp=%ld\n", SIZ(want), EXP(want));
41: mpn_trace (" limbs=", PTR(want), ABSIZ(want));
42: }
43:
44: void
45: check_one (mpf_srcptr src, mpf_srcptr trunc, mpf_srcptr ceil, mpf_srcptr floor)
46: {
47: mpf_t got;
48:
49: mpf_init2 (got, mpf_get_prec (trunc));
50: ASSERT_ALWAYS (PREC(got) == PREC(trunc));
51: ASSERT_ALWAYS (PREC(got) == PREC(ceil));
52: ASSERT_ALWAYS (PREC(got) == PREC(floor));
53:
54: #define CHECK_SEP(name, fun, want) \
55: mpf_set_ui (got, 54321L); /* initial junk */ \
56: fun (got, src); \
57: MPF_CHECK_FORMAT (got); \
58: if (mpf_cmp (got, want) != 0) \
59: { \
60: printf ("%s wrong\n", name); \
61: check_print (src, got, want); \
62: abort (); \
63: }
64:
65: CHECK_SEP ("mpf_trunc", mpf_trunc, trunc);
66: CHECK_SEP ("mpf_ceil", mpf_ceil, ceil);
67: CHECK_SEP ("mpf_floor", mpf_floor, floor);
68:
69: #define CHECK_INPLACE(name, fun, want) \
70: mpf_set (got, src); \
71: fun (got, got); \
72: MPF_CHECK_FORMAT (got); \
73: if (mpf_cmp (got, want) != 0) \
74: { \
75: printf ("%s wrong\n", name); \
76: check_print (src, got, want); \
77: abort (); \
78: }
79:
80: CHECK_INPLACE ("mpf_trunc", mpf_trunc, trunc);
81:
82: /* Can't do these unconditionally in case truncation by mpf_set strips
83: some low non-zero limbs which would have rounded the result. */
84: if (ABSIZ(src) <= PREC(trunc)+1)
85: {
86: CHECK_INPLACE ("mpf_ceil", mpf_ceil, ceil);
87: CHECK_INPLACE ("mpf_floor", mpf_floor, floor);
88: }
89:
90: mpf_clear (got);
91: }
92:
93: void
94: check_all (mpf_ptr src, mpf_ptr trunc, mpf_ptr ceil, mpf_ptr floor)
95: {
96: /* some of these values are generated with direct field assignments */
97: MPF_CHECK_FORMAT (src);
98: MPF_CHECK_FORMAT (trunc);
99: MPF_CHECK_FORMAT (ceil);
100: MPF_CHECK_FORMAT (floor);
101:
102: check_one (src, trunc, ceil, floor);
103:
104: mpf_neg (src, src);
105: mpf_neg (trunc, trunc);
106: mpf_neg (ceil, ceil);
107: mpf_neg (floor, floor);
108: check_one (src, trunc, floor, ceil);
109: }
110:
111: void
112: check_various (void)
113: {
114: mpf_t src, trunc, ceil, floor;
115: int n, i;
116:
117: mpf_init2 (src, 512L);
118: mpf_init2 (trunc, 256L);
119: mpf_init2 (ceil, 256L);
120: mpf_init2 (floor, 256L);
121:
122: /* 0 */
123: mpf_set_ui (src, 0L);
124: mpf_set_ui (trunc, 0L);
125: mpf_set_ui (ceil, 0L);
126: mpf_set_ui (floor, 0L);
127: check_all (src, trunc, ceil, floor);
128:
129: /* 1 */
130: mpf_set_ui (src, 1L);
131: mpf_set_ui (trunc, 1L);
132: mpf_set_ui (ceil, 1L);
133: mpf_set_ui (floor, 1L);
134: check_all (src, trunc, ceil, floor);
135:
136: /* 2^1024 */
137: mpf_set_ui (src, 1L);
138: mpf_mul_2exp (src, src, 1024L);
139: mpf_set (trunc, src);
140: mpf_set (ceil, src);
141: mpf_set (floor, src);
142: check_all (src, trunc, ceil, floor);
143:
144: /* 1/2^1024, fraction only */
145: mpf_set_ui (src, 1L);
146: mpf_div_2exp (src, src, 1024L);
147: mpf_set_si (trunc, 0L);
148: mpf_set_si (ceil, 1L);
149: mpf_set_si (floor, 0L);
150: check_all (src, trunc, ceil, floor);
151:
152: /* 1/2 */
153: mpf_set_ui (src, 1L);
154: mpf_div_2exp (src, src, 1L);
155: mpf_set_si (trunc, 0L);
156: mpf_set_si (ceil, 1L);
157: mpf_set_si (floor, 0L);
158: check_all (src, trunc, ceil, floor);
159:
160: /* 123+1/2^64 */
161: mpf_set_ui (src, 1L);
162: mpf_div_2exp (src, src, 64L);
163: mpf_add_ui (src, src, 123L);
164: mpf_set_si (trunc, 123L);
165: mpf_set_si (ceil, 124L);
166: mpf_set_si (floor, 123L);
167: check_all (src, trunc, ceil, floor);
168:
169: /* integer of full prec+1 limbs, unchanged */
170: n = PREC(trunc)+1;
171: ASSERT_ALWAYS (n <= PREC(src)+1);
172: EXP(src) = n;
173: SIZ(src) = n;
174: for (i = 0; i < SIZ(src); i++)
175: PTR(src)[i] = i+100;
176: mpf_set (trunc, src);
177: mpf_set (ceil, src);
178: mpf_set (floor, src);
179: check_all (src, trunc, ceil, floor);
180:
181: /* full prec+1 limbs, 1 trimmed for integer */
182: n = PREC(trunc)+1;
183: ASSERT_ALWAYS (n <= PREC(src)+1);
184: EXP(src) = n-1;
185: SIZ(src) = n;
186: for (i = 0; i < SIZ(src); i++)
187: PTR(src)[i] = i+200;
188: EXP(trunc) = n-1;
189: SIZ(trunc) = n-1;
190: for (i = 0; i < SIZ(trunc); i++)
191: PTR(trunc)[i] = i+201;
192: mpf_set (floor, trunc);
193: mpf_add_ui (ceil, trunc, 1L);
194: check_all (src, trunc, ceil, floor);
195:
196: /* prec+3 limbs, 2 trimmed for size */
197: n = PREC(trunc)+3;
198: ASSERT_ALWAYS (n <= PREC(src)+1);
199: EXP(src) = n;
200: SIZ(src) = n;
201: for (i = 0; i < SIZ(src); i++)
202: PTR(src)[i] = i+300;
203: EXP(trunc) = n;
204: SIZ(trunc) = n-2;
205: for (i = 0; i < SIZ(trunc); i++)
206: PTR(trunc)[i] = i+302;
207: mpf_set (floor, trunc);
208: mpf_set (ceil, trunc);
209: PTR(ceil)[0]++;
210: check_all (src, trunc, ceil, floor);
211:
212: /* prec+4 limbs, 2 trimmed for size, 1 trimmed for integer */
213: n = PREC(trunc)+4;
214: ASSERT_ALWAYS (n <= PREC(src)+1);
215: EXP(src) = n-1;
216: SIZ(src) = n;
217: for (i = 0; i < SIZ(src); i++)
218: PTR(src)[i] = i+400;
219: EXP(trunc) = n-1;
220: SIZ(trunc) = n-3;
221: for (i = 0; i < SIZ(trunc); i++)
222: PTR(trunc)[i] = i+403;
223: mpf_set (floor, trunc);
224: mpf_set (ceil, trunc);
225: PTR(ceil)[0]++;
226: check_all (src, trunc, ceil, floor);
227:
228: /* F.F, carry out of ceil */
229: EXP(src) = 1;
230: SIZ(src) = 2;
231: PTR(src)[0] = GMP_NUMB_MAX;
232: PTR(src)[1] = GMP_NUMB_MAX;
233: EXP(trunc) = 1;
234: SIZ(trunc) = 1;
235: PTR(trunc)[0] = GMP_NUMB_MAX;
236: mpf_set (floor, trunc);
237: EXP(ceil) = 2;
238: SIZ(ceil) = 1;
239: PTR(ceil)[0] = 1;
240: check_all (src, trunc, ceil, floor);
241:
242: /* FF.F, carry out of ceil */
243: EXP(src) = 2;
244: SIZ(src) = 3;
245: PTR(src)[0] = GMP_NUMB_MAX;
246: PTR(src)[1] = GMP_NUMB_MAX;
247: PTR(src)[2] = GMP_NUMB_MAX;
248: EXP(trunc) = 2;
249: SIZ(trunc) = 2;
250: PTR(trunc)[0] = GMP_NUMB_MAX;
251: PTR(trunc)[1] = GMP_NUMB_MAX;
252: mpf_set (floor, trunc);
253: EXP(ceil) = 3;
254: SIZ(ceil) = 1;
255: PTR(ceil)[0] = 1;
256: check_all (src, trunc, ceil, floor);
257:
258: mpf_clear (src);
259: mpf_clear (trunc);
260: mpf_clear (ceil);
261: mpf_clear (floor);
262: }
263:
264: int
265: main (void)
266: {
267: tests_start ();
268:
269: check_various ();
270:
271: tests_end ();
272: exit (0);
273: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>