t-ui_div.c revision 1.1 1 1.1 mrg /* Test mpf_ui_div.
2 1.1 mrg
3 1.1 mrg Copyright 2004 Free Software Foundation, Inc.
4 1.1 mrg
5 1.1 mrg This file is part of the GNU MP Library.
6 1.1 mrg
7 1.1 mrg The GNU MP Library is free software; you can redistribute it and/or modify
8 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
9 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
10 1.1 mrg option) any later version.
11 1.1 mrg
12 1.1 mrg The GNU MP Library is distributed in the hope that it will be useful, but
13 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 1.1 mrg License for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU Lesser General Public License
18 1.1 mrg along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
19 1.1 mrg
20 1.1 mrg #include <stdio.h>
21 1.1 mrg #include <stdlib.h>
22 1.1 mrg #include "gmp.h"
23 1.1 mrg #include "gmp-impl.h"
24 1.1 mrg #include "tests.h"
25 1.1 mrg
26 1.1 mrg
27 1.1 mrg void
28 1.1 mrg check_one (const char *desc, mpf_ptr got, unsigned long u, mpf_srcptr v)
29 1.1 mrg {
30 1.1 mrg mpf_t uf;
31 1.1 mrg mp_limb_t ulimbs[2];
32 1.1 mrg mp_size_t usize;
33 1.1 mrg
34 1.1 mrg ulimbs[0] = u & GMP_NUMB_MASK;
35 1.1 mrg usize = (u != 0);
36 1.1 mrg #if BITS_PER_ULONG > GMP_NUMB_BITS
37 1.1 mrg u >>= GMP_NUMB_BITS;
38 1.1 mrg ulimbs[1] = u;
39 1.1 mrg usize += (u != 0);
40 1.1 mrg #endif
41 1.1 mrg PTR(uf) = ulimbs;
42 1.1 mrg SIZ(uf) = usize;
43 1.1 mrg EXP(uf) = usize;
44 1.1 mrg
45 1.1 mrg if (! refmpf_validate_division ("mpf_ui_div", got, uf, v))
46 1.1 mrg {
47 1.1 mrg mp_trace_base = -16;
48 1.1 mrg printf (" u 0x%lX (%lu)\n", u, u);
49 1.1 mrg mpf_trace (" v", v);
50 1.1 mrg printf (" %s\n", desc);
51 1.1 mrg abort ();
52 1.1 mrg }
53 1.1 mrg }
54 1.1 mrg
55 1.1 mrg void
56 1.1 mrg check_rand (void)
57 1.1 mrg {
58 1.1 mrg unsigned long min_prec = __GMPF_BITS_TO_PREC (1);
59 1.1 mrg gmp_randstate_ptr rands = RANDS;
60 1.1 mrg unsigned long prec, u;
61 1.1 mrg mpf_t got, v;
62 1.1 mrg int i;
63 1.1 mrg
64 1.1 mrg mpf_init (got);
65 1.1 mrg mpf_init (v);
66 1.1 mrg
67 1.1 mrg for (i = 0; i < 200; i++)
68 1.1 mrg {
69 1.1 mrg /* got precision */
70 1.1 mrg prec = min_prec + gmp_urandomm_ui (rands, 15L);
71 1.1 mrg refmpf_set_prec_limbs (got, prec);
72 1.1 mrg
73 1.1 mrg /* u */
74 1.1 mrg prec = gmp_urandomm_ui (rands, BITS_PER_ULONG+1);
75 1.1 mrg u = gmp_urandomb_ui (rands, prec);
76 1.1 mrg
77 1.1 mrg /* v precision */
78 1.1 mrg prec = min_prec + gmp_urandomm_ui (rands, 15L);
79 1.1 mrg refmpf_set_prec_limbs (v, prec);
80 1.1 mrg
81 1.1 mrg /* v, non-zero */
82 1.1 mrg do {
83 1.1 mrg mpf_random2 (v, PREC(v), (mp_exp_t) 20);
84 1.1 mrg } while (SIZ(v) == 0);
85 1.1 mrg
86 1.1 mrg /* v possibly negative */
87 1.1 mrg if (gmp_urandomb_ui (rands, 1L))
88 1.1 mrg mpf_neg (v, v);
89 1.1 mrg
90 1.1 mrg if ((i % 2) == 0)
91 1.1 mrg {
92 1.1 mrg /* src != dst */
93 1.1 mrg mpf_ui_div (got, u, v);
94 1.1 mrg check_one ("separate", got, u, v);
95 1.1 mrg }
96 1.1 mrg else
97 1.1 mrg {
98 1.1 mrg /* src == dst */
99 1.1 mrg prec = refmpf_set_overlap (got, v);
100 1.1 mrg mpf_ui_div (got, u, got);
101 1.1 mrg check_one ("overlap src==dst", got, u, v);
102 1.1 mrg
103 1.1 mrg mpf_set_prec_raw (got, prec);
104 1.1 mrg }
105 1.1 mrg }
106 1.1 mrg
107 1.1 mrg mpf_clear (got);
108 1.1 mrg mpf_clear (v);
109 1.1 mrg }
110 1.1 mrg
111 1.1 mrg void
112 1.1 mrg check_various (void)
113 1.1 mrg {
114 1.1 mrg mpf_t got, v;
115 1.1 mrg
116 1.1 mrg mpf_init (got);
117 1.1 mrg mpf_init (v);
118 1.1 mrg
119 1.1 mrg /* 100/4 == 25 */
120 1.1 mrg mpf_set_prec (got, 20L);
121 1.1 mrg mpf_set_ui (v, 4L);
122 1.1 mrg mpf_ui_div (got, 100L, v);
123 1.1 mrg MPF_CHECK_FORMAT (got);
124 1.1 mrg ASSERT_ALWAYS (mpf_cmp_ui (got, 25L) == 0);
125 1.1 mrg
126 1.1 mrg {
127 1.1 mrg /* 1/(2^n+1), a case where truncating the divisor would be wrong */
128 1.1 mrg unsigned long u = 1L;
129 1.1 mrg mpf_set_prec (got, 500L);
130 1.1 mrg mpf_set_prec (v, 900L);
131 1.1 mrg mpf_set_ui (v, 1L);
132 1.1 mrg mpf_mul_2exp (v, v, 800L);
133 1.1 mrg mpf_add_ui (v, v, 1L);
134 1.1 mrg mpf_ui_div (got, u, v);
135 1.1 mrg check_one ("1/2^n+1, separate", got, u, v);
136 1.1 mrg }
137 1.1 mrg
138 1.1 mrg mpf_clear (got);
139 1.1 mrg mpf_clear (v);
140 1.1 mrg }
141 1.1 mrg
142 1.1 mrg int
143 1.1 mrg main (void)
144 1.1 mrg {
145 1.1 mrg tests_start ();
146 1.1 mrg
147 1.1 mrg check_various ();
148 1.1 mrg check_rand ();
149 1.1 mrg
150 1.1 mrg tests_end ();
151 1.1 mrg exit (0);
152 1.1 mrg }
153