]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/multiprecision/test/test_cpp_bin_float.cpp
1 // Copyright John Maddock 2013.
3 // Use, modification and distribution are subject to the
4 // Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt
6 // or copy at http://www.boost.org/LICENSE_1_0.txt)
9 #define _SCL_SECURE_NO_WARNINGS
12 #include <boost/multiprecision/cpp_bin_float.hpp>
14 #include <boost/multiprecision/mpfr.hpp>
16 #include <boost/random/mersenne_twister.hpp>
17 #include <boost/random/uniform_int.hpp>
18 #include "libs/multiprecision/test/test.hpp"
26 static boost::random::mt19937 gen
;
29 while (val
!= prev_val
)
38 static boost::random::uniform_int_distribution
<e_type
> ui(-20, 20);
39 return ldexp(val
, ui(gen
));
42 using namespace boost::multiprecision
;
44 typedef number
<mpfr_float_backend
<35> > good_type
;
46 typedef double good_type
;
48 typedef number
<cpp_bin_float
<std::numeric_limits
<good_type
>::digits
, digit_base_2
>, et_off
> test_type
;
50 void test_special_cases()
52 #if !defined(BOOST_CI_ASAN_BUILD) && !defined(BOOST_CI_USAN_BUID)
53 test_type max_val
= (std::numeric_limits
<test_type
>::max
)();
54 test_type min_val
= (std::numeric_limits
<test_type
>::min
)();
55 test_type eps
= std::numeric_limits
<test_type
>::epsilon();
56 test_type inf_val
= (std::numeric_limits
<test_type
>::infinity
)();
57 test_type nan_val
= (std::numeric_limits
<test_type
>::quiet_NaN
)();
59 test_type one_point_5
= 1.5;
61 BOOST_CHECK((boost::math::isnormal
)(max_val
));
62 BOOST_CHECK((boost::math::isnormal
)(-max_val
));
63 BOOST_CHECK((boost::math::isnormal
)(min_val
));
64 BOOST_CHECK((boost::math::isnormal
)(-min_val
));
65 BOOST_CHECK((boost::math::isinf
)(inf_val
));
66 BOOST_CHECK((boost::math::isinf
)(-inf_val
));
67 BOOST_CHECK((boost::math::isnan
)(nan_val
));
68 BOOST_CHECK((boost::math::isnan
)(-nan_val
));
70 if (std::numeric_limits
<test_type
>::has_denorm
)
71 min_val
= std::numeric_limits
<test_type
>::denorm_min();
73 // Adding epsilon will increment 1.0:
74 BOOST_CHECK(test_type(1) + eps
!= test_type(1));
75 BOOST_CHECK(test_type(1) + eps
/ 2 == test_type(1));
76 // But it's not the smallest value that will do that:
77 test_type small
= 1 + eps
;
78 small
= ldexp(small
, -std::numeric_limits
<test_type
>::digits
);
79 BOOST_CHECK(test_type(1) + small
!= test_type(1));
80 // And if we increment 1.0 first, then an even smaller
81 // addition will round up:
82 test_type one_next
= test_type(1) + eps
;
83 BOOST_CHECK(one_next
+ eps
/ 2 != one_next
);
86 BOOST_CHECK_EQUAL(max_val
+ max_val
* eps
, inf_val
);
87 BOOST_CHECK_EQUAL(-max_val
- max_val
* eps
, -inf_val
);
88 BOOST_CHECK_EQUAL(max_val
* 2, inf_val
);
89 BOOST_CHECK_EQUAL(max_val
* -2, -inf_val
);
90 BOOST_CHECK_EQUAL(max_val
/ half
, inf_val
);
91 BOOST_CHECK_EQUAL(max_val
/ -half
, -inf_val
);
92 BOOST_CHECK_EQUAL(max_val
/ min_val
, inf_val
);
93 BOOST_CHECK_EQUAL(max_val
/ -min_val
, -inf_val
);
95 BOOST_CHECK_EQUAL(min_val
* 2 - one_point_5
* min_val
, 0);
96 BOOST_CHECK_EQUAL(-min_val
* 2 + one_point_5
* min_val
, 0);
97 BOOST_CHECK_EQUAL(min_val
/ 2, 0);
98 BOOST_CHECK_EQUAL(min_val
/ max_val
, 0);
99 BOOST_CHECK_EQUAL(min_val
* half
, 0);
100 BOOST_CHECK_EQUAL(min_val
- min_val
, 0);
101 BOOST_CHECK_EQUAL(max_val
- max_val
, 0);
102 BOOST_CHECK_EQUAL(-min_val
+ min_val
, 0);
103 BOOST_CHECK_EQUAL(-max_val
+ max_val
, 0);
104 // Things which should not over/underflow:
105 BOOST_CHECK_EQUAL((min_val
* 2) / 2, min_val
);
106 BOOST_CHECK_EQUAL((max_val
/ 2) * 2, max_val
);
107 BOOST_CHECK_GE((min_val
* 2.0000001) / 1.9999999999999999, min_val
);
108 BOOST_CHECK_LE((max_val
/ 2.0000001) * 1.9999999999999999, max_val
);
109 BOOST_CHECK_EQUAL(min_val
* 2 - min_val
, min_val
);
110 BOOST_CHECK_EQUAL(max_val
/ 2 + max_val
/ 2, max_val
);
111 // Things involving zero:
112 BOOST_CHECK_EQUAL(max_val
+ 0, max_val
);
113 BOOST_CHECK_EQUAL(max_val
- 0, max_val
);
114 BOOST_CHECK_EQUAL(0 + max_val
, max_val
);
115 BOOST_CHECK_EQUAL(0 - max_val
, -max_val
);
116 BOOST_CHECK_EQUAL(max_val
* 0, 0);
117 BOOST_CHECK_EQUAL(0 * max_val
, 0);
118 BOOST_CHECK_EQUAL(max_val
/ 0, inf_val
);
119 BOOST_CHECK_EQUAL(0 / max_val
, 0);
120 BOOST_CHECK_EQUAL(-max_val
/ 0, -inf_val
);
121 BOOST_CHECK_EQUAL(0 / -max_val
, 0);
122 // Things involving infinity:
123 BOOST_CHECK_EQUAL(inf_val
+ 2, inf_val
);
124 BOOST_CHECK_EQUAL(inf_val
- 2, inf_val
);
125 BOOST_CHECK_EQUAL(inf_val
+ -2, inf_val
);
126 BOOST_CHECK_EQUAL(inf_val
- -2, inf_val
);
127 BOOST_CHECK_EQUAL(-inf_val
+ 2, -inf_val
);
128 BOOST_CHECK_EQUAL(-inf_val
- 2, -inf_val
);
129 BOOST_CHECK_EQUAL(-inf_val
+ -2, -inf_val
);
130 BOOST_CHECK_EQUAL(-inf_val
- -2, -inf_val
);
132 BOOST_CHECK_EQUAL(2 + inf_val
, inf_val
);
133 BOOST_CHECK_EQUAL(2 - inf_val
, -inf_val
);
134 BOOST_CHECK_EQUAL(-2 + inf_val
, inf_val
);
135 BOOST_CHECK_EQUAL(-2 - inf_val
, -inf_val
);
136 BOOST_CHECK_EQUAL(2 + (-inf_val
), -inf_val
);
137 BOOST_CHECK_EQUAL(2 - (-inf_val
), inf_val
);
138 BOOST_CHECK_EQUAL(-2 + (-inf_val
), -inf_val
);
139 BOOST_CHECK_EQUAL(-2 - (-inf_val
), inf_val
);
141 BOOST_CHECK_EQUAL(sqrt(inf_val
), inf_val
);
142 BOOST_CHECK(boost::math::isnan(sqrt(-inf_val
)));
144 BOOST_CHECK_EQUAL(inf_val
+ test_type(2), inf_val
);
145 BOOST_CHECK_EQUAL(inf_val
- test_type(2), inf_val
);
146 BOOST_CHECK_EQUAL(inf_val
+ test_type(-2), inf_val
);
147 BOOST_CHECK_EQUAL(inf_val
- test_type(-2), inf_val
);
148 BOOST_CHECK_EQUAL(-inf_val
+ test_type(2), -inf_val
);
149 BOOST_CHECK_EQUAL(-inf_val
- test_type(2), -inf_val
);
150 BOOST_CHECK_EQUAL(-inf_val
+ test_type(-2), -inf_val
);
151 BOOST_CHECK_EQUAL(-inf_val
- test_type(-2), -inf_val
);
153 BOOST_CHECK_EQUAL(test_type(2) + inf_val
, inf_val
);
154 BOOST_CHECK_EQUAL(test_type(2) - inf_val
, -inf_val
);
155 BOOST_CHECK_EQUAL(test_type(-2) + inf_val
, inf_val
);
156 BOOST_CHECK_EQUAL(test_type(-2) - inf_val
, -inf_val
);
157 BOOST_CHECK_EQUAL(test_type(2) + (-inf_val
), -inf_val
);
158 BOOST_CHECK_EQUAL(test_type(2) - (-inf_val
), inf_val
);
159 BOOST_CHECK_EQUAL(test_type(-2) + (-inf_val
), -inf_val
);
160 BOOST_CHECK_EQUAL(test_type(-2) - (-inf_val
), inf_val
);
162 BOOST_CHECK((boost::math::isnan
)(inf_val
- inf_val
));
163 BOOST_CHECK_EQUAL(inf_val
* 2, inf_val
);
164 BOOST_CHECK_EQUAL(-inf_val
* 2, -inf_val
);
165 BOOST_CHECK_EQUAL(inf_val
* -2, -inf_val
);
166 BOOST_CHECK_EQUAL(-inf_val
* -2, inf_val
);
167 BOOST_CHECK_EQUAL(inf_val
* test_type(-2), -inf_val
);
168 BOOST_CHECK_EQUAL(-inf_val
* test_type(-2), inf_val
);
169 BOOST_CHECK((boost::math::isnan
)(inf_val
* 0));
170 BOOST_CHECK((boost::math::isnan
)(-inf_val
* 0));
171 BOOST_CHECK_EQUAL(inf_val
/ 2, inf_val
);
172 BOOST_CHECK_EQUAL(-inf_val
/ 2, -inf_val
);
173 BOOST_CHECK_EQUAL(inf_val
/ -2, -inf_val
);
174 BOOST_CHECK_EQUAL(-inf_val
/ -2, inf_val
);
175 BOOST_CHECK_EQUAL(inf_val
/ test_type(-2), -inf_val
);
176 BOOST_CHECK_EQUAL(-inf_val
/ test_type(-2), inf_val
);
177 BOOST_CHECK_EQUAL(inf_val
/ 0, inf_val
);
178 BOOST_CHECK_EQUAL(-inf_val
/ 0, -inf_val
);
179 BOOST_CHECK((boost::math::isnan
)(inf_val
/ inf_val
));
180 BOOST_CHECK((boost::math::isnan
)(-inf_val
/ inf_val
));
181 // Things involving nan:
182 BOOST_CHECK((boost::math::isnan
)(nan_val
+ 2));
183 BOOST_CHECK((boost::math::isnan
)(nan_val
- 2));
184 BOOST_CHECK((boost::math::isnan
)(nan_val
+ 0));
185 BOOST_CHECK((boost::math::isnan
)(nan_val
- 0));
186 BOOST_CHECK((boost::math::isnan
)(nan_val
+ inf_val
));
187 BOOST_CHECK((boost::math::isnan
)(nan_val
- inf_val
));
188 BOOST_CHECK((boost::math::isnan
)(nan_val
+ nan_val
));
189 BOOST_CHECK((boost::math::isnan
)(nan_val
- nan_val
));
190 BOOST_CHECK((boost::math::isnan
)(2 + nan_val
));
191 BOOST_CHECK((boost::math::isnan
)(2 - nan_val
));
192 BOOST_CHECK((boost::math::isnan
)(0 - nan_val
));
193 BOOST_CHECK((boost::math::isnan
)(0 - nan_val
));
194 BOOST_CHECK((boost::math::isnan
)(inf_val
+ nan_val
));
195 BOOST_CHECK((boost::math::isnan
)(inf_val
- nan_val
));
196 BOOST_CHECK((boost::math::isnan
)(nan_val
* 2));
197 BOOST_CHECK((boost::math::isnan
)(nan_val
/ 2));
198 BOOST_CHECK((boost::math::isnan
)(nan_val
* 0));
199 BOOST_CHECK((boost::math::isnan
)(nan_val
/ 0));
200 BOOST_CHECK((boost::math::isnan
)(nan_val
* inf_val
));
201 BOOST_CHECK((boost::math::isnan
)(nan_val
/ inf_val
));
202 BOOST_CHECK((boost::math::isnan
)(nan_val
* nan_val
));
203 BOOST_CHECK((boost::math::isnan
)(nan_val
/ nan_val
));
204 BOOST_CHECK((boost::math::isnan
)(2 * nan_val
));
205 BOOST_CHECK((boost::math::isnan
)(2 / nan_val
));
206 BOOST_CHECK((boost::math::isnan
)(0 / nan_val
));
207 BOOST_CHECK((boost::math::isnan
)(0 / nan_val
));
208 BOOST_CHECK((boost::math::isnan
)(inf_val
* nan_val
));
209 BOOST_CHECK((boost::math::isnan
)(inf_val
/ nan_val
));
211 BOOST_CHECK_EQUAL((max_val
* half
) / half
, max_val
);
212 BOOST_CHECK_EQUAL((max_val
/ 2) * 2, max_val
);
213 BOOST_CHECK_EQUAL((min_val
/ half
) * half
, min_val
);
214 BOOST_CHECK_EQUAL((min_val
* 2) / 2, min_val
);
215 BOOST_CHECK_EQUAL(max_val
+ min_val
, max_val
);
216 BOOST_CHECK_EQUAL(min_val
+ max_val
, max_val
);
217 BOOST_CHECK_EQUAL(max_val
- min_val
, max_val
);
218 BOOST_CHECK_EQUAL(min_val
- max_val
, -max_val
);
220 BOOST_CHECK(boost::math::signbit(min_val
* -min_val
));
221 BOOST_CHECK(boost::math::signbit(min_val
* min_val
) == 0);
222 BOOST_CHECK(boost::math::signbit(-min_val
* -min_val
) == 0);
223 BOOST_CHECK(boost::math::signbit(-min_val
* min_val
));
224 BOOST_CHECK(boost::math::signbit(min_val
/ max_val
) == 0);
225 BOOST_CHECK(boost::math::signbit(min_val
/ -max_val
));
226 BOOST_CHECK(boost::math::signbit(-min_val
/ -max_val
) == 0);
227 BOOST_CHECK(boost::math::signbit(-min_val
/ max_val
));
228 BOOST_CHECK(boost::math::signbit(min_val
/ 2) == 0);
229 BOOST_CHECK(boost::math::signbit(min_val
/ -2));
230 BOOST_CHECK(boost::math::signbit(-min_val
/ -2) == 0);
231 BOOST_CHECK(boost::math::signbit(-min_val
/ 2));
232 test_type neg_zero
= min_val
* -min_val
;
234 // Arithmetic involving signed zero:
235 BOOST_CHECK_EQUAL(-neg_zero
, 0);
236 BOOST_CHECK(!boost::math::signbit(-neg_zero
));
237 BOOST_CHECK_EQUAL(neg_zero
+ 2, 2);
238 BOOST_CHECK_EQUAL(neg_zero
+ test_type(2), 2);
239 BOOST_CHECK_EQUAL(2 + neg_zero
, 2);
240 BOOST_CHECK_EQUAL(test_type(2) + neg_zero
, 2);
241 BOOST_CHECK_EQUAL(neg_zero
+ -2, -2);
242 BOOST_CHECK_EQUAL(neg_zero
+ test_type(-2), -2);
243 BOOST_CHECK_EQUAL(-2 + neg_zero
, -2);
244 BOOST_CHECK_EQUAL(test_type(-2) + neg_zero
, -2);
245 BOOST_CHECK_EQUAL(neg_zero
- 2, -2);
246 BOOST_CHECK_EQUAL(neg_zero
- test_type(2), -2);
247 BOOST_CHECK_EQUAL(2 - neg_zero
, 2);
248 BOOST_CHECK_EQUAL(test_type(2) - neg_zero
, 2);
249 BOOST_CHECK_EQUAL(neg_zero
- -2, 2);
250 BOOST_CHECK_EQUAL(neg_zero
- test_type(-2), 2);
251 BOOST_CHECK_EQUAL(-2 - neg_zero
, -2);
252 BOOST_CHECK_EQUAL(test_type(-2) - neg_zero
, -2);
253 BOOST_CHECK(!boost::math::signbit(test_type(2) + test_type(-2)));
254 BOOST_CHECK(!boost::math::signbit(test_type(2) - test_type(2)));
255 BOOST_CHECK(!boost::math::signbit(test_type(-2) - test_type(-2)));
256 BOOST_CHECK(!boost::math::signbit(test_type(-2) + test_type(2)));
257 BOOST_CHECK(!boost::math::signbit(zero
+ zero
));
258 BOOST_CHECK(!boost::math::signbit(zero
- zero
));
259 BOOST_CHECK(!boost::math::signbit(neg_zero
+ zero
));
260 BOOST_CHECK(!boost::math::signbit(zero
+ neg_zero
));
261 BOOST_CHECK(boost::math::signbit(neg_zero
+ neg_zero
));
262 BOOST_CHECK(boost::math::signbit(neg_zero
- zero
));
263 BOOST_CHECK(!boost::math::signbit(zero
- neg_zero
));
264 BOOST_CHECK(!boost::math::signbit(neg_zero
- neg_zero
));
266 BOOST_CHECK(!boost::math::signbit(floor(small
)));
267 BOOST_CHECK(!boost::math::signbit(round(small
)));
268 BOOST_CHECK(!boost::math::signbit(trunc(small
)));
270 BOOST_CHECK(boost::math::signbit(ceil(small
)));
271 BOOST_CHECK(boost::math::signbit(round(small
)));
272 BOOST_CHECK(boost::math::signbit(trunc(small
)));
274 BOOST_CHECK_EQUAL(neg_zero
* 2, 0);
275 BOOST_CHECK_EQUAL(neg_zero
* test_type(2), 0);
276 BOOST_CHECK_EQUAL(2 * neg_zero
, 0);
277 BOOST_CHECK_EQUAL(test_type(2) * neg_zero
, 0);
278 BOOST_CHECK_EQUAL(neg_zero
* -2, 0);
279 BOOST_CHECK_EQUAL(neg_zero
* test_type(-2), 0);
280 BOOST_CHECK_EQUAL(-2 * neg_zero
, 0);
281 BOOST_CHECK_EQUAL(test_type(-2) * neg_zero
, 0);
282 BOOST_CHECK(boost::math::signbit(neg_zero
* 2));
283 BOOST_CHECK(boost::math::signbit(neg_zero
* test_type(2)));
284 BOOST_CHECK(boost::math::signbit(2 * neg_zero
));
285 BOOST_CHECK(boost::math::signbit(test_type(2) * neg_zero
));
286 BOOST_CHECK(!boost::math::signbit(neg_zero
* -2));
287 BOOST_CHECK(!boost::math::signbit(neg_zero
* test_type(-2)));
288 BOOST_CHECK(!boost::math::signbit(-2 * neg_zero
));
289 BOOST_CHECK(!boost::math::signbit(test_type(-2) * neg_zero
));
291 BOOST_CHECK_EQUAL(neg_zero
/ 2, 0);
292 BOOST_CHECK_EQUAL(neg_zero
/ test_type(2), 0);
293 BOOST_CHECK_EQUAL(2 / neg_zero
, -inf_val
);
294 BOOST_CHECK_EQUAL(test_type(2) / neg_zero
, -inf_val
);
295 BOOST_CHECK_EQUAL(neg_zero
/ -2, 0);
296 BOOST_CHECK_EQUAL(neg_zero
/ test_type(-2), 0);
297 BOOST_CHECK_EQUAL(-2 / neg_zero
, inf_val
);
298 BOOST_CHECK_EQUAL(test_type(-2) / neg_zero
, inf_val
);
299 BOOST_CHECK(boost::math::signbit(neg_zero
/ 2));
300 BOOST_CHECK(boost::math::signbit(neg_zero
/ test_type(2)));
301 BOOST_CHECK(boost::math::signbit(2 / neg_zero
));
302 BOOST_CHECK(boost::math::signbit(test_type(2) / neg_zero
));
303 BOOST_CHECK(!boost::math::signbit(neg_zero
/ -2));
304 BOOST_CHECK(!boost::math::signbit(neg_zero
/ test_type(-2)));
305 BOOST_CHECK(!boost::math::signbit(-2 / neg_zero
));
306 BOOST_CHECK(!boost::math::signbit(test_type(-2) / neg_zero
));
308 BOOST_CHECK(boost::math::signbit(neg_zero
.convert_to
<double>()));
309 BOOST_CHECK(boost::math::signbit(neg_zero
.convert_to
<float>()));
310 BOOST_CHECK(boost::math::signbit(neg_zero
.convert_to
<long double>()));
311 BOOST_CHECK(!boost::math::signbit(zero
.convert_to
<double>()));
312 BOOST_CHECK(!boost::math::signbit(zero
.convert_to
<float>()));
313 BOOST_CHECK(!boost::math::signbit(zero
.convert_to
<long double>()));
315 // Conversions to other types of special values:
316 if (std::numeric_limits
<float>::has_infinity
)
318 BOOST_CHECK_EQUAL(inf_val
.convert_to
<float>(), std::numeric_limits
<float>::infinity());
319 BOOST_CHECK_EQUAL((-inf_val
).convert_to
<float>(), -std::numeric_limits
<float>::infinity());
321 if (std::numeric_limits
<float>::has_quiet_NaN
)
323 BOOST_CHECK((boost::math::isnan
)(nan_val
.convert_to
<float>()));
325 if (std::numeric_limits
<double>::has_infinity
)
327 BOOST_CHECK_EQUAL(inf_val
.convert_to
<double>(), std::numeric_limits
<double>::infinity());
328 BOOST_CHECK_EQUAL((-inf_val
).convert_to
<double>(), -std::numeric_limits
<double>::infinity());
330 if (std::numeric_limits
<double>::has_quiet_NaN
)
332 BOOST_CHECK((boost::math::isnan
)(nan_val
.convert_to
<double>()));
334 if (std::numeric_limits
<long double>::has_infinity
)
336 BOOST_CHECK_EQUAL(inf_val
.convert_to
<long double>(), std::numeric_limits
<long double>::infinity());
337 BOOST_CHECK_EQUAL((-inf_val
).convert_to
<long double>(), -std::numeric_limits
<long double>::infinity());
339 if (std::numeric_limits
<long double>::has_quiet_NaN
)
341 BOOST_CHECK((boost::math::isnan
)(nan_val
.convert_to
<long double>()));
344 // Bug https://svn.boost.org/trac/boost/attachment/ticket/12580
348 test_type b
= ldexp(test_type(0.99), -std::numeric_limits
<test_type
>::digits
);
350 good_type gb
= ldexp(good_type(0.99), -std::numeric_limits
<good_type
>::digits
);
351 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
352 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
353 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
354 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
356 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
357 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
358 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
359 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
361 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
362 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
363 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
364 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
366 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
367 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
368 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
369 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
371 b
= ldexp(test_type(0.5), -std::numeric_limits
<test_type
>::digits
);
372 gb
= ldexp(good_type(0.5), -std::numeric_limits
<good_type
>::digits
);
373 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
374 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
375 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
376 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
378 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
379 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
380 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
381 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
383 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
384 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
385 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
386 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
388 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
389 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
390 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
391 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
393 b
= ldexp(test_type(1), -std::numeric_limits
<test_type
>::digits
);
394 gb
= ldexp(good_type(1), -std::numeric_limits
<good_type
>::digits
);
395 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
396 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
397 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
398 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
400 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
401 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
402 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
403 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
405 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
406 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
407 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
408 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
410 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
411 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
412 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
413 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
415 b
= ldexp(test_type(0.50000000001), -std::numeric_limits
<test_type
>::digits
);
416 gb
= ldexp(good_type(0.50000000001), -std::numeric_limits
<good_type
>::digits
);
417 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
418 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
419 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
420 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
422 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
423 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
424 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
425 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
427 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
428 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
429 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
430 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
432 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
433 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
434 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
435 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
437 a
= a
+ ldexp(a
, -20);
438 ga
= ga
+ ldexp(ga
, -20);
439 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
440 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
441 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
442 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
444 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
445 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
446 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
447 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
449 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
450 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
451 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
452 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
454 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
455 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
456 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
457 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
459 b
= ldexp(test_type(0.5), -std::numeric_limits
<test_type
>::digits
);
460 gb
= ldexp(good_type(0.5), -std::numeric_limits
<good_type
>::digits
);
461 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
462 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
463 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
464 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
466 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
467 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
468 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
469 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
471 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
472 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
473 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
474 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
476 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
477 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
478 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
479 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
481 b
= ldexp(test_type(1), -std::numeric_limits
<test_type
>::digits
);
482 gb
= ldexp(good_type(1), -std::numeric_limits
<good_type
>::digits
);
483 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
484 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
485 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
486 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
488 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
489 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
490 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
491 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
493 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
494 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
495 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
496 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
498 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
499 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
500 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
501 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
503 b
= ldexp(test_type(0.50000000001), -std::numeric_limits
<test_type
>::digits
);
504 gb
= ldexp(good_type(0.50000000001), -std::numeric_limits
<good_type
>::digits
);
505 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
506 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
507 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
508 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
510 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
511 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
512 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
513 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
515 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
516 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
517 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
518 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
520 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
521 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
522 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
523 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
526 a
= boost::math::float_prior(a
);
528 ga
= boost::math::float_prior(ga
);
529 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
530 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
531 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
532 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
534 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
535 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
536 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
537 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
539 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
540 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
541 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
542 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
544 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
545 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
546 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
547 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
549 b
= ldexp(test_type(0.5), -std::numeric_limits
<test_type
>::digits
);
550 gb
= ldexp(good_type(0.5), -std::numeric_limits
<good_type
>::digits
);
551 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
552 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
553 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
554 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
556 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
557 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
558 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
559 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
561 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
562 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
563 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
564 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
566 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
567 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
568 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
569 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
571 b
= ldexp(test_type(1), -std::numeric_limits
<test_type
>::digits
);
572 gb
= ldexp(good_type(1), -std::numeric_limits
<good_type
>::digits
);
573 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
574 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
575 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
576 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
578 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
579 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
580 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
581 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
583 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
584 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
585 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
586 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
588 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
589 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
590 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
591 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
593 b
= ldexp(test_type(0.50000000001), -std::numeric_limits
<test_type
>::digits
);
594 gb
= ldexp(good_type(0.50000000001), -std::numeric_limits
<good_type
>::digits
);
595 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
596 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
597 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
598 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
600 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
601 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
602 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
603 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
605 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
606 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
607 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
608 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
610 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
611 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
612 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
613 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
615 a
= boost::math::float_next(test_type(1));
616 ga
= boost::math::float_next(good_type(1));
617 b
= ldexp(boost::math::float_prior(test_type(1)), -std::numeric_limits
<test_type
>::digits
);
618 gb
= ldexp(boost::math::float_prior(good_type(1)), -std::numeric_limits
<test_type
>::digits
);
619 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
620 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
621 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
622 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
624 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
625 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
626 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
627 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
629 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
630 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
631 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
632 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
634 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
635 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
636 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
637 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
641 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
642 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
643 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
644 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
646 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
647 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
648 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
649 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
651 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
652 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
653 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
654 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
656 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
657 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
658 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
659 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
661 a
= 1.75; // even mantissa, not a power of 2
663 b
= ldexp(test_type(1), -std::numeric_limits
<test_type
>::digits
);
664 gb
= ldexp(good_type(1), -std::numeric_limits
<test_type
>::digits
);
665 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
666 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
667 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
668 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
670 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
671 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
672 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
673 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
675 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
676 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
677 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
678 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
680 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
681 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
682 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
683 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
686 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
687 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
688 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
689 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
691 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
692 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
693 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
694 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
696 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
697 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
698 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
699 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
701 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
702 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
703 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
704 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
706 b
= ldexp(boost::math::float_prior(test_type(1)), -std::numeric_limits
<test_type
>::digits
);
707 gb
= ldexp(boost::math::float_prior(good_type(1)), -std::numeric_limits
<test_type
>::digits
);
708 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
709 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
710 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
711 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
713 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
714 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
715 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
716 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
718 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
719 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
720 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
721 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
723 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
724 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
725 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
726 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
730 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
731 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
732 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
733 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
735 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
736 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
737 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
738 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
740 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
741 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
742 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
743 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
745 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
746 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
747 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
748 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
750 b
= ldexp(test_type(0.75), -std::numeric_limits
<test_type
>::digits
); // even mantissa not a power of 2.
751 gb
= ldexp(good_type(0.75), -std::numeric_limits
<test_type
>::digits
);
752 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
753 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
754 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
755 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
757 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
758 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
759 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
760 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
762 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
763 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
764 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
765 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
767 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
768 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
769 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
770 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
774 BOOST_CHECK_EQUAL(good_type(test_type(a
- b
)), good_type(ga
- gb
));
775 BOOST_CHECK_EQUAL(good_type(test_type(b
- a
)), good_type(gb
- ga
));
776 BOOST_CHECK_EQUAL(good_type(test_type(a
+ b
)), good_type(ga
+ gb
));
777 BOOST_CHECK_EQUAL(good_type(test_type(b
+ a
)), good_type(gb
+ ga
));
779 BOOST_CHECK_EQUAL(good_type(test_type(a
- -b
)), good_type(ga
- -gb
));
780 BOOST_CHECK_EQUAL(good_type(test_type(b
- -a
)), good_type(gb
- -ga
));
781 BOOST_CHECK_EQUAL(good_type(test_type(a
+ -b
)), good_type(ga
+ -gb
));
782 BOOST_CHECK_EQUAL(good_type(test_type(b
+ -a
)), good_type(gb
+ -ga
));
784 BOOST_CHECK_EQUAL(good_type(test_type(-a
- b
)), good_type(-ga
- gb
));
785 BOOST_CHECK_EQUAL(good_type(test_type(-b
- a
)), good_type(-gb
- ga
));
786 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ b
)), good_type(-ga
+ gb
));
787 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ a
)), good_type(-gb
+ ga
));
789 BOOST_CHECK_EQUAL(good_type(test_type(-a
- -b
)), good_type(-ga
- -gb
));
790 BOOST_CHECK_EQUAL(good_type(test_type(-b
- -a
)), good_type(-gb
- -ga
));
791 BOOST_CHECK_EQUAL(good_type(test_type(-a
+ -b
)), good_type(-ga
+ -gb
));
792 BOOST_CHECK_EQUAL(good_type(test_type(-b
+ -a
)), good_type(-gb
+ -ga
));
798 // compile times are too long for CI when ASAN is enabled, prune things down a bit:
799 #if !defined(BOOST_CI_ASAN_BUILD) && !defined(BOOST_CI_USAN_BUID)
800 test_special_cases();
802 unsigned error_count
= 0;
803 for (unsigned i
= 0; i
< 100000; ++i
)
805 good_type a
= generate_random
<good_type
>();
806 good_type b
= generate_random
<good_type
>();
809 BOOST_CHECK_EQUAL(test_type(a
* b
), ta
* tb
);
810 BOOST_CHECK_EQUAL(test_type(-a
* b
), -ta
* tb
);
811 BOOST_CHECK_EQUAL(test_type(a
* -b
), ta
* -tb
);
812 BOOST_CHECK_EQUAL(test_type(-a
* -b
), -ta
* -tb
);
814 BOOST_CHECK_EQUAL(test_type(a
+ b
), ta
+ tb
);
815 BOOST_CHECK_EQUAL(test_type(-a
+ b
), -ta
+ tb
);
816 BOOST_CHECK_EQUAL(test_type(a
+ -b
), ta
+ -tb
);
817 BOOST_CHECK_EQUAL(test_type(-a
+ -b
), -ta
+ -tb
);
819 BOOST_CHECK_EQUAL(test_type(a
- b
), ta
- tb
);
820 BOOST_CHECK_EQUAL(test_type(-a
- b
), -ta
- tb
);
821 BOOST_CHECK_EQUAL(test_type(a
- -b
), ta
- -tb
);
822 BOOST_CHECK_EQUAL(test_type(-a
- -b
), -ta
- -tb
);
824 BOOST_CHECK_EQUAL(test_type(a
/ b
), ta
/ tb
);
825 BOOST_CHECK_EQUAL(test_type(-a
/ b
), -ta
/ tb
);
826 BOOST_CHECK_EQUAL(test_type(a
/ -b
), ta
/ -tb
);
827 BOOST_CHECK_EQUAL(test_type(-a
/ -b
), -ta
/ -tb
);
829 BOOST_CHECK_EQUAL(test_type(sqrt(a
)), sqrt(ta
));
830 BOOST_CHECK_EQUAL(test_type(floor(a
)), floor(ta
));
831 BOOST_CHECK_EQUAL(test_type(floor(-a
)), floor(-ta
));
832 BOOST_CHECK_EQUAL(test_type(ceil(a
)), ceil(ta
));
833 BOOST_CHECK_EQUAL(test_type(ceil(-a
)), ceil(-ta
));
839 BOOST_CHECK_EQUAL(a
.convert_to
<double>(), ta
.convert_to
<double>());
840 BOOST_CHECK_EQUAL(a
.convert_to
<float>(), ta
.convert_to
<float>());
841 BOOST_CHECK_EQUAL(b
.convert_to
<double>(), tb
.convert_to
<double>());
842 BOOST_CHECK_EQUAL(b
.convert_to
<float>(), tb
.convert_to
<float>());
844 BOOST_CHECK_EQUAL(a
, ta
.convert_to
<double>());
845 BOOST_CHECK_EQUAL(static_cast<float>(a
), ta
.convert_to
<float>());
846 BOOST_CHECK_EQUAL(b
, tb
.convert_to
<double>());
847 BOOST_CHECK_EQUAL(static_cast<float>(b
), tb
.convert_to
<float>());
850 static boost::random::mt19937 i_gen
;
853 BOOST_CHECK_EQUAL(test_type(a
* si
), ta
* si
);
854 BOOST_CHECK_EQUAL(test_type(-a
* si
), -ta
* si
);
855 BOOST_CHECK_EQUAL(test_type(-a
* -si
), -ta
* -si
);
856 BOOST_CHECK_EQUAL(test_type(a
* -si
), ta
* -si
);
857 unsigned ui
= std::abs(si
);
858 BOOST_CHECK_EQUAL(test_type(a
* ui
), ta
* ui
);
859 BOOST_CHECK_EQUAL(test_type(-a
* ui
), -ta
* ui
);
862 BOOST_CHECK_EQUAL(test_type(a
/ si
), ta
/ si
);
863 BOOST_CHECK_EQUAL(test_type(-a
/ si
), -ta
/ si
);
864 BOOST_CHECK_EQUAL(test_type(-a
/ -si
), -ta
/ -si
);
865 BOOST_CHECK_EQUAL(test_type(a
/ -si
), ta
/ -si
);
866 BOOST_CHECK_EQUAL(test_type(a
/ ui
), ta
/ ui
);
867 BOOST_CHECK_EQUAL(test_type(-a
/ ui
), -ta
/ ui
);
869 if ((unsigned)boost::detail::test_errors() != error_count
)
871 error_count
= boost::detail::test_errors();
872 std::cout
<< std::setprecision(std::numeric_limits
<test_type
>::max_digits10
) << std::scientific
;
873 std::cout
<< "a (mpfr) = " << a
<< std::endl
;
874 std::cout
<< "a (test) = " << ta
<< std::endl
;
875 std::cout
<< "b (mpfr) = " << b
<< std::endl
;
876 std::cout
<< "b (test) = " << tb
<< std::endl
;
877 std::cout
<< "si = " << si
<< std::endl
;
878 std::cout
<< "ui = " << ui
<< std::endl
;
881 return boost::report_errors();