t-prec.cc revision 1.1.1.3 1 1.1 mrg /* Test precision of mpf_class expressions.
2 1.1 mrg
3 1.1.1.3 mrg Copyright 2001-2003, 2008 Free Software Foundation, Inc.
4 1.1 mrg
5 1.1.1.2 mrg This file is part of the GNU MP Library test suite.
6 1.1 mrg
7 1.1.1.2 mrg The GNU MP Library test suite is free software; you can redistribute it
8 1.1.1.2 mrg and/or modify it under the terms of the GNU General Public License as
9 1.1.1.2 mrg published by the Free Software Foundation; either version 3 of the License,
10 1.1.1.2 mrg or (at your option) any later version.
11 1.1.1.2 mrg
12 1.1.1.2 mrg The GNU MP Library test suite is distributed in the hope that it will be
13 1.1.1.2 mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1.1.2 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 1.1.1.2 mrg Public License for more details.
16 1.1 mrg
17 1.1.1.2 mrg You should have received a copy of the GNU General Public License along with
18 1.1.1.3 mrg the GNU MP Library test suite. If not, see https://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