t-prec.cc revision 1.1 1 1.1 mrg /* Test precision of mpf_class expressions.
2 1.1 mrg
3 1.1 mrg Copyright 2001, 2002, 2003, 2008 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 "config.h"
21 1.1 mrg
22 1.1 mrg #include <iostream>
23 1.1 mrg
24 1.1 mrg #include "gmp.h"
25 1.1 mrg #include "gmpxx.h"
26 1.1 mrg #include "gmp-impl.h"
27 1.1 mrg #include "tests.h"
28 1.1 mrg
29 1.1 mrg using namespace std;
30 1.1 mrg
31 1.1 mrg
32 1.1 mrg const int
33 1.1 mrg small_prec = 64, medium_prec = 128, large_prec = 192, very_large_prec = 256;
34 1.1 mrg
35 1.1 mrg #define ASSERT_ALWAYS_PREC(a, s, prec) \
36 1.1 mrg { \
37 1.1 mrg mpf_srcptr _a = a.get_mpf_t(); \
38 1.1 mrg mpf_class _b(s, prec); \
39 1.1 mrg mpf_srcptr _c = _b.get_mpf_t(); \
40 1.1 mrg ASSERT_ALWAYS(mpf_eq(_a, _c, prec)); \
41 1.1 mrg }
42 1.1 mrg
43 1.1 mrg
44 1.1 mrg
45 1.1 mrg void
46 1.1 mrg check_mpf (void)
47 1.1 mrg {
48 1.1 mrg mpf_set_default_prec(medium_prec);
49 1.1 mrg
50 1.1 mrg // simple expressions
51 1.1 mrg {
52 1.1 mrg mpf_class f(3.0, small_prec);
53 1.1 mrg mpf_class g(1 / f, very_large_prec);
54 1.1 mrg ASSERT_ALWAYS_PREC
55 1.1 mrg (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
56 1.1 mrg " 33333 33333 33333 33333 33333 333", very_large_prec);
57 1.1 mrg }
58 1.1 mrg {
59 1.1 mrg mpf_class f(9.0, medium_prec);
60 1.1 mrg mpf_class g(0.0, very_large_prec);
61 1.1 mrg g = 1 / f;
62 1.1 mrg ASSERT_ALWAYS_PREC
63 1.1 mrg (g, "0.11111 11111 11111 11111 11111 11111 11111 11111 11111 11111"
64 1.1 mrg " 11111 11111 11111 11111 11111 111", very_large_prec);
65 1.1 mrg }
66 1.1 mrg {
67 1.1 mrg mpf_class f(15.0, large_prec);
68 1.1 mrg mpf_class g(0.0, very_large_prec);
69 1.1 mrg g = 1 / f;
70 1.1 mrg ASSERT_ALWAYS_PREC
71 1.1 mrg (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
72 1.1 mrg " 66666 66666 66666 66666 66666 667", very_large_prec);
73 1.1 mrg }
74 1.1 mrg
75 1.1 mrg // compound expressions
76 1.1 mrg {
77 1.1 mrg mpf_class f(3.0, small_prec);
78 1.1 mrg mpf_class g(-(-(-1 / f)), very_large_prec);
79 1.1 mrg ASSERT_ALWAYS_PREC
80 1.1 mrg (g, "-0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
81 1.1 mrg " 33333 33333 33333 33333 33333 333", very_large_prec);
82 1.1 mrg }
83 1.1 mrg {
84 1.1 mrg mpf_class f(3.0, small_prec), g(9.0, medium_prec);
85 1.1 mrg mpf_class h(0.0, very_large_prec);
86 1.1 mrg h = 1/f + 1/g;
87 1.1 mrg ASSERT_ALWAYS_PREC
88 1.1 mrg (h, "0.44444 44444 44444 44444 44444 44444 44444 44444 44444 44444"
89 1.1 mrg " 44444 44444 44444 44444 44444 444", very_large_prec);
90 1.1 mrg }
91 1.1 mrg {
92 1.1 mrg mpf_class f(3.0, small_prec), g(9.0, medium_prec), h(15.0, large_prec);
93 1.1 mrg mpf_class i(0.0, very_large_prec);
94 1.1 mrg i = f / g + h;
95 1.1 mrg ASSERT_ALWAYS_PREC
96 1.1 mrg (i, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
97 1.1 mrg " 33333 33333 33333 33333 33333 3", very_large_prec);
98 1.1 mrg }
99 1.1 mrg {
100 1.1 mrg mpf_class f(3.0, small_prec);
101 1.1 mrg mpf_class g(-(1 + f) / 3, very_large_prec);
102 1.1 mrg ASSERT_ALWAYS_PREC
103 1.1 mrg (g, "-1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
104 1.1 mrg " 33333 33333 33333 33333 33333 33", very_large_prec);
105 1.1 mrg }
106 1.1 mrg {
107 1.1 mrg mpf_class f(9.0, medium_prec);
108 1.1 mrg mpf_class g(0.0, very_large_prec);
109 1.1 mrg g = sqrt(1 / f);
110 1.1 mrg ASSERT_ALWAYS_PREC
111 1.1 mrg (g, "0.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
112 1.1 mrg " 33333 33333 33333 33333 33333 333", very_large_prec);
113 1.1 mrg }
114 1.1 mrg {
115 1.1 mrg mpf_class f(15.0, large_prec);
116 1.1 mrg mpf_class g(0.0, very_large_prec);
117 1.1 mrg g = hypot(1 + 5 / f, 1.0);
118 1.1 mrg ASSERT_ALWAYS_PREC
119 1.1 mrg (g, "1.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
120 1.1 mrg " 66666 66666 66666 66666 66666 67", very_large_prec);
121 1.1 mrg }
122 1.1 mrg
123 1.1 mrg // compound assignments
124 1.1 mrg {
125 1.1 mrg mpf_class f(3.0, small_prec), g(9.0, medium_prec);
126 1.1 mrg mpf_class h(1.0, very_large_prec);
127 1.1 mrg h -= f / g;
128 1.1 mrg ASSERT_ALWAYS_PREC
129 1.1 mrg (h, "0.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
130 1.1 mrg " 66666 66666 66666 66666 66666 667", very_large_prec);
131 1.1 mrg }
132 1.1 mrg
133 1.1 mrg // construction from expressions
134 1.1 mrg {
135 1.1 mrg mpf_class f(3.0, small_prec);
136 1.1 mrg mpf_class g(0.0, very_large_prec);
137 1.1 mrg g = mpf_class(1 / f);
138 1.1 mrg ASSERT_ALWAYS_PREC(g, "0.33333 33333 33333 33333", small_prec);
139 1.1 mrg }
140 1.1 mrg {
141 1.1 mrg mpf_class f(9.0, medium_prec);
142 1.1 mrg mpf_class g(0.0, very_large_prec);
143 1.1 mrg g = mpf_class(1 / f);
144 1.1 mrg ASSERT_ALWAYS_PREC
145 1.1 mrg (g, "0.11111 11111 11111 11111 11111 11111 11111 1111", medium_prec);
146 1.1 mrg }
147 1.1 mrg {
148 1.1 mrg mpf_class f(15.0, large_prec);
149 1.1 mrg mpf_class g(0.0, very_large_prec);
150 1.1 mrg g = mpf_class(1 / f);
151 1.1 mrg ASSERT_ALWAYS_PREC
152 1.1 mrg (g, "0.06666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
153 1.1 mrg " 66666 6667", large_prec);
154 1.1 mrg }
155 1.1 mrg
156 1.1 mrg {
157 1.1 mrg mpf_class f(3.0, small_prec), g(9.0, medium_prec);
158 1.1 mrg mpf_class h(0.0, very_large_prec);
159 1.1 mrg h = mpf_class(f / g + 1, large_prec);
160 1.1 mrg ASSERT_ALWAYS_PREC
161 1.1 mrg (h, "1.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
162 1.1 mrg " 33333 333",
163 1.1 mrg large_prec);
164 1.1 mrg }
165 1.1 mrg
166 1.1 mrg // mixed mpf/mpq expressions
167 1.1 mrg {
168 1.1 mrg mpf_class f(3.0, small_prec);
169 1.1 mrg mpq_class q(1, 3);
170 1.1 mrg mpf_class g(0.0, very_large_prec);
171 1.1 mrg g = f - q;
172 1.1 mrg ASSERT_ALWAYS_PREC
173 1.1 mrg (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
174 1.1 mrg " 66666 66666 66666 66666 66666 67", very_large_prec);
175 1.1 mrg }
176 1.1 mrg
177 1.1 mrg {
178 1.1 mrg mpf_class f(3.0, small_prec);
179 1.1 mrg mpq_class q(1, 3);
180 1.1 mrg mpf_class g(0.0, very_large_prec);
181 1.1 mrg g = mpf_class(f - q, large_prec);
182 1.1 mrg ASSERT_ALWAYS_PREC
183 1.1 mrg (g, "2.66666 66666 66666 66666 66666 66666 66666 66666 66666 66666"
184 1.1 mrg " 66666 667",
185 1.1 mrg large_prec);
186 1.1 mrg }
187 1.1 mrg {
188 1.1 mrg mpf_class f(3.0, small_prec);
189 1.1 mrg mpq_class q(1, 3);
190 1.1 mrg mpf_class g(0.0, very_large_prec);
191 1.1 mrg g = mpf_class(f - q);
192 1.1 mrg ASSERT_ALWAYS_PREC
193 1.1 mrg (g, "2.66666 66666 66666 66666 66666 66666 66666 667", medium_prec);
194 1.1 mrg }
195 1.1 mrg {
196 1.1 mrg mpf_class f(15.0, large_prec);
197 1.1 mrg mpq_class q(1, 3);
198 1.1 mrg mpf_class g(0.0, very_large_prec);
199 1.1 mrg g = mpf_class(f + q);
200 1.1 mrg ASSERT_ALWAYS_PREC
201 1.1 mrg (g, "15.33333 33333 33333 33333 33333 33333 33333 33333 33333 33333"
202 1.1 mrg " 33333 33",
203 1.1 mrg large_prec);
204 1.1 mrg }
205 1.1 mrg }
206 1.1 mrg
207 1.1 mrg
208 1.1 mrg int
209 1.1 mrg main (void)
210 1.1 mrg {
211 1.1 mrg tests_start();
212 1.1 mrg
213 1.1 mrg check_mpf();
214 1.1 mrg
215 1.1 mrg tests_end();
216 1.1 mrg return 0;
217 1.1 mrg }
218