]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/multiprecision/test/test_sf_import_c99.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / multiprecision / test / test_sf_import_c99.cpp
1 // (C) Copyright John Maddock 2016.
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 #ifdef _MSC_VER
7 #pragma warning(disable : 4127) // conditional expression is constant
8 #endif
9
10 #if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) && !defined(TEST_CPP_DEC_FLOAT_2) && !defined(TEST_CPP_DEC_FLOAT_3) && !defined(TEST_CPP_DEC_FLOAT_4) && !defined(TEST_CPP_DEC_FLOAT_5) && !defined(TEST_CPP_DEC_FLOAT_6) && !defined(TEST_CPP_BIN_FLOAT_2) && !defined(TEST_CPP_BIN_FLOAT_3)
11 #define TEST_MPF_50
12 #define TEST_MPFR_50
13 #define TEST_MPFI_50
14 #define TEST_CPP_DEC_FLOAT
15 #define TEST_CPP_DEC_FLOAT_2
16 #define TEST_CPP_DEC_FLOAT_3
17 #define TEST_CPP_DEC_FLOAT_4
18 #define TEST_CPP_DEC_FLOAT_5
19 #define TEST_CPP_DEC_FLOAT_6
20 #define TEST_FLOAT128
21 #define TEST_CPP_BIN_FLOAT
22 #define TEST_CPP_BIN_FLOAT_2
23 #define TEST_CPP_BIN_FLOAT_3
24
25 #ifdef _MSC_VER
26 #pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
27 #endif
28 #ifdef __GNUC__
29 #pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
30 #endif
31
32 #endif
33
34 #if defined(TEST_MPF_50)
35 #include <boost/multiprecision/gmp.hpp>
36 #endif
37 #ifdef TEST_MPFR_50
38 #include <boost/multiprecision/mpfr.hpp>
39 #endif
40 #ifdef TEST_MPFI_50
41 #include <boost/multiprecision/mpfi.hpp>
42 #endif
43 #if defined(TEST_CPP_DEC_FLOAT) || defined(TEST_CPP_DEC_FLOAT_2) || defined(TEST_CPP_DEC_FLOAT_3) || defined(TEST_CPP_DEC_FLOAT_4) || defined(TEST_CPP_DEC_FLOAT_5) || defined(TEST_CPP_DEC_FLOAT_6)
44 #include <boost/multiprecision/cpp_dec_float.hpp>
45 #endif
46 #if defined(TEST_CPP_BIN_FLOAT) || defined(TEST_CPP_BIN_FLOAT_2) || defined(TEST_CPP_BIN_FLOAT_3)
47 #include <boost/multiprecision/cpp_bin_float.hpp>
48 #include <boost/multiprecision/debug_adaptor.hpp>
49 #endif
50 #ifdef TEST_FLOAT128
51 #include <boost/multiprecision/float128.hpp>
52 #endif
53
54 #include <boost/math/constants/constants.hpp>
55 #include <boost/math/special_functions/gamma.hpp>
56 #include "test.hpp"
57
58 #ifdef signbit
59 #undef signbit
60 #endif
61 #ifdef sign
62 #undef sign
63 #endif
64 #ifdef changesign
65 #undef changesign
66 #endif
67 #ifdef copysign
68 #undef copysign
69 #endif
70 #ifdef fpclassify
71 #undef fpclassify
72 #endif
73 #ifdef isinf
74 #undef isinf
75 #endif
76 #ifdef isnan
77 #undef isnan
78 #endif
79 #ifdef isnormal
80 #undef isnormal
81 #endif
82
83 #ifdef MPFR_VERSION_MAJOR
84 #define BOOST_MPFR_VERSION MPFR_VERSION_MAJOR * 10000 + MPFR_VERSION_MINOR * 100 + MPFR_VERSION_PATCHLEVEL
85 #endif
86
87 template <class T, class U>
88 void test_less(T a, U b)
89 {
90 BOOST_CHECK(a < b);
91 BOOST_CHECK(a <= b);
92 BOOST_CHECK(!(a > b));
93 BOOST_CHECK(!(a >= b));
94 BOOST_CHECK(!(a == b));
95 BOOST_CHECK((a != b));
96
97 BOOST_CHECK(b > a);
98 BOOST_CHECK(b >= a);
99 BOOST_CHECK(!(b < a));
100 BOOST_CHECK(!(b <= a));
101 BOOST_CHECK(!(b == a));
102 BOOST_CHECK((b != a));
103
104 BOOST_CHECK(isless(a, b));
105 BOOST_CHECK(islessequal(a, b));
106 BOOST_CHECK(!isgreater(a, b));
107 BOOST_CHECK(!isgreaterequal(a, b));
108 BOOST_CHECK(islessgreater(a, b));
109
110 BOOST_CHECK(!isless(b, a));
111 BOOST_CHECK(!islessequal(b, a));
112 BOOST_CHECK(isgreater(b, a));
113 BOOST_CHECK(isgreaterequal(b, a));
114 BOOST_CHECK(islessgreater(b, a));
115 }
116 template <class T, class U>
117 void test_equal(T a, U b)
118 {
119 BOOST_CHECK(!(a < b));
120 BOOST_CHECK(a <= b);
121 BOOST_CHECK(!(a > b));
122 BOOST_CHECK((a >= b));
123 BOOST_CHECK((a == b));
124 BOOST_CHECK(!(a != b));
125
126 BOOST_CHECK(!(b > a));
127 BOOST_CHECK(b >= a);
128 BOOST_CHECK(!(b < a));
129 BOOST_CHECK((b <= a));
130 BOOST_CHECK((b == a));
131 BOOST_CHECK(!(b != a));
132
133 BOOST_CHECK(!isless(a, b));
134 BOOST_CHECK(islessequal(a, b));
135 BOOST_CHECK(!isgreater(a, b));
136 BOOST_CHECK(isgreaterequal(a, b));
137 BOOST_CHECK(!islessgreater(a, b));
138
139 BOOST_CHECK(!isless(b, a));
140 BOOST_CHECK(islessequal(b, a));
141 BOOST_CHECK(!isgreater(b, a));
142 BOOST_CHECK(isgreaterequal(b, a));
143 BOOST_CHECK(!islessgreater(b, a));
144 }
145 template <class T, class U>
146 void test_unordered(T a, U b)
147 {
148 BOOST_CHECK(!(a < b));
149 BOOST_CHECK(!(a <= b));
150 BOOST_CHECK(!(a > b));
151 BOOST_CHECK(!(a >= b));
152 BOOST_CHECK(!(a == b));
153 BOOST_CHECK((a != b));
154
155 BOOST_CHECK(!(b > a));
156 BOOST_CHECK(!(b >= a));
157 BOOST_CHECK(!(b < a));
158 BOOST_CHECK(!(b <= a));
159 BOOST_CHECK(!(b == a));
160 BOOST_CHECK((b != a));
161
162 BOOST_CHECK(!isless(a, b));
163 BOOST_CHECK(!islessequal(a, b));
164 BOOST_CHECK(!isgreater(a, b));
165 BOOST_CHECK(!isgreaterequal(a, b));
166 BOOST_CHECK(!islessgreater(a, b));
167
168 BOOST_CHECK(!isless(b, a));
169 BOOST_CHECK(!islessequal(b, a));
170 BOOST_CHECK(!isgreater(b, a));
171 BOOST_CHECK(!isgreaterequal(b, a));
172 BOOST_CHECK(!islessgreater(b, a));
173 }
174
175 template <class T>
176 void test()
177 {
178 //
179 // Basic sanity checks for C99 functions which are just imported versions
180 // from Boost.Math. These should still be found via ADL so no using declarations here...
181 //
182 T val = 2;
183 BOOST_CHECK(signbit(val) == 0);
184 BOOST_CHECK(signbit(val + 2) == 0);
185 val = -val;
186 BOOST_CHECK(signbit(val));
187 BOOST_CHECK(signbit(val * 2));
188
189 val = 2;
190 BOOST_CHECK_EQUAL(sign(val), 1);
191 BOOST_CHECK_EQUAL(sign(val + 2), 1);
192 val = -val;
193 BOOST_CHECK_EQUAL(sign(val), -1);
194 BOOST_CHECK_EQUAL(sign(val * 2), -1);
195 val = 0;
196 BOOST_CHECK_EQUAL(sign(val), 0);
197 BOOST_CHECK_EQUAL(sign(val * 2), 0);
198
199 val = 2;
200 BOOST_CHECK_EQUAL(changesign(val), -2);
201 BOOST_CHECK_EQUAL(changesign(val * 2), -4);
202 val = -2;
203 BOOST_CHECK_EQUAL(changesign(val), 2);
204 BOOST_CHECK_EQUAL(changesign(val * 2), 4);
205 val = 0;
206 BOOST_CHECK_EQUAL(changesign(val), 0);
207 BOOST_CHECK_EQUAL(changesign(val * 2), 0);
208 // Things involving signed zero, need to detect it first:
209 T neg_zero_test = -(std::numeric_limits<T>::min)();
210 neg_zero_test /= (std::numeric_limits<T>::max)();
211 T one(1);
212 bool test_signed_zero = !boost::multiprecision::is_interval_number<T>::value && std::numeric_limits<T>::has_infinity && (one / neg_zero_test < 0);
213 if (test_signed_zero)
214 {
215 BOOST_CHECK(signbit(changesign(val)));
216 BOOST_CHECK(signbit(changesign(val * 2)));
217 }
218
219 T s = 2;
220 val = 3;
221 BOOST_CHECK_EQUAL(copysign(val, s), 3);
222 BOOST_CHECK_EQUAL(copysign(val, s * -2), -3);
223 BOOST_CHECK_EQUAL(copysign(-2 * val, s), 6);
224 BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), 6);
225 s = -2;
226 BOOST_CHECK_EQUAL(copysign(val, s), -3);
227 BOOST_CHECK_EQUAL(copysign(val, s * -2), 3);
228 BOOST_CHECK_EQUAL(copysign(-2 * val, s), -6);
229 BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), -6);
230 val = -3;
231 BOOST_CHECK_EQUAL(copysign(val, s), -3);
232 BOOST_CHECK_EQUAL(copysign(val, s * -2), 3);
233 BOOST_CHECK_EQUAL(copysign(-2 * val, s), -6);
234 BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), -6);
235 s = 0;
236 BOOST_CHECK_EQUAL(copysign(val, s), 3);
237 // Things involving signed zero, need to detect it first:
238 if (test_signed_zero)
239 {
240 BOOST_CHECK_EQUAL(copysign(val, s * -2), -3);
241 }
242 BOOST_CHECK_EQUAL(copysign(-2 * val, s), 6);
243 BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), 6);
244 // Things involving signed zero, need to detect it first:
245 if (test_signed_zero)
246 {
247 s = changesign(s);
248 if (signbit(s))
249 {
250 BOOST_CHECK_EQUAL(copysign(val, s), -3);
251 BOOST_CHECK_EQUAL(copysign(val, s * -2), 3);
252 BOOST_CHECK_EQUAL(copysign(-2 * val, s), -6);
253 BOOST_CHECK_EQUAL(copysign(-2 * val, 2 * s), -6);
254 }
255 }
256
257 val = 3;
258 BOOST_CHECK_EQUAL(fpclassify(val), FP_NORMAL);
259 BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_NORMAL);
260 BOOST_CHECK(!isinf(val));
261 BOOST_CHECK(!isinf(val + 2));
262 BOOST_CHECK(!isnan(val));
263 BOOST_CHECK(!isnan(val + 2));
264 BOOST_CHECK(isnormal(val));
265 BOOST_CHECK(isnormal(val + 2));
266 val = -3;
267 BOOST_CHECK_EQUAL(fpclassify(val), FP_NORMAL);
268 BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_NORMAL);
269 BOOST_CHECK(!isinf(val));
270 BOOST_CHECK(!isinf(val + 2));
271 BOOST_CHECK(!isnan(val));
272 BOOST_CHECK(!isnan(val + 2));
273 BOOST_CHECK(isnormal(val));
274 BOOST_CHECK(isnormal(val + 2));
275 val = 0;
276 BOOST_CHECK_EQUAL(fpclassify(val), FP_ZERO);
277 BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_ZERO);
278 BOOST_CHECK(!isinf(val));
279 BOOST_CHECK(!isinf(val + 2));
280 BOOST_CHECK(!isnan(val));
281 BOOST_CHECK(!isnan(val + 2));
282 BOOST_CHECK(!isnormal(val));
283 BOOST_CHECK(!isnormal(val * 2));
284 BOOST_CHECK(!isnormal(val * -2));
285 if (std::numeric_limits<T>::has_infinity)
286 {
287 val = std::numeric_limits<T>::infinity();
288 BOOST_CHECK_EQUAL(fpclassify(val), FP_INFINITE);
289 BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_INFINITE);
290 BOOST_CHECK(isinf(val));
291 BOOST_CHECK(isinf(val + 2));
292 BOOST_CHECK(!isnan(val));
293 BOOST_CHECK(!isnan(val + 2));
294 BOOST_CHECK(!isnormal(val));
295 BOOST_CHECK(!isnormal(val + 2));
296 val = -val;
297 BOOST_CHECK_EQUAL(fpclassify(val), FP_INFINITE);
298 BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_INFINITE);
299 BOOST_CHECK(isinf(val));
300 BOOST_CHECK(isinf(val + 2));
301 BOOST_CHECK(!isnan(val));
302 BOOST_CHECK(!isnan(val + 2));
303 BOOST_CHECK(!isnormal(val));
304 BOOST_CHECK(!isnormal(val + 2));
305 }
306 if (std::numeric_limits<T>::has_quiet_NaN)
307 {
308 val = std::numeric_limits<T>::quiet_NaN();
309 BOOST_CHECK_EQUAL(fpclassify(val), FP_NAN);
310 BOOST_CHECK_EQUAL(fpclassify(val * 3), FP_NAN);
311 BOOST_CHECK(!isinf(val));
312 BOOST_CHECK(!isinf(val + 2));
313 BOOST_CHECK(isnan(val));
314 BOOST_CHECK(isnan(val + 2));
315 BOOST_CHECK(!isnormal(val));
316 BOOST_CHECK(!isnormal(val + 2));
317 }
318 s = 8 * std::numeric_limits<T>::epsilon();
319 val = 2.5;
320 BOOST_CHECK_CLOSE_FRACTION(asinh(val), T("1.6472311463710957106248586104436196635044144301932365282203100930843983757633104078778420255069424907777006132075516484778755360595913172299093829522950397895699619540523579875476513967578478619028438291006578604823887119907434"), s);
321 BOOST_CHECK_CLOSE_FRACTION(asinh(val + T(0)), T("1.6472311463710957106248586104436196635044144301932365282203100930843983757633104078778420255069424907777006132075516484778755360595913172299093829522950397895699619540523579875476513967578478619028438291006578604823887119907434"), s);
322 BOOST_CHECK_CLOSE_FRACTION(acosh(val), T("1.5667992369724110786640568625804834938620823510926588639329459980122148134693922696279968499622201141051039184050936311066453565386393240356562374302417843319480223211857615778787272615171906055455922537080327062362258846337050"), s);
323 BOOST_CHECK_CLOSE_FRACTION(acosh(val + T(0)), T("1.5667992369724110786640568625804834938620823510926588639329459980122148134693922696279968499622201141051039184050936311066453565386393240356562374302417843319480223211857615778787272615171906055455922537080327062362258846337050"), s);
324 val = 0.5;
325 BOOST_CHECK_CLOSE_FRACTION(atanh(val), T("0.5493061443340548456976226184612628523237452789113747258673471668187471466093044834368078774068660443939850145329789328711840021129652599105264009353836387053015813845916906835896868494221804799518712851583979557605727959588753"), s);
326 BOOST_CHECK_CLOSE_FRACTION(atanh(val + T(0)), T("0.5493061443340548456976226184612628523237452789113747258673471668187471466093044834368078774068660443939850145329789328711840021129652599105264009353836387053015813845916906835896868494221804799518712851583979557605727959588753"), s);
327 val = 55.25;
328 BOOST_CHECK_CLOSE_FRACTION(cbrt(val), T("3.8087058015466360309383876359583281382991983919300128125378938779672144843676192684301168479657279498120767424724024965319869248797423276064015643361426189576415670917818313417529572608229017809069355688606687557031643655896118"), s);
329 BOOST_CHECK_CLOSE_FRACTION(cbrt(val + T(0)), T("3.8087058015466360309383876359583281382991983919300128125378938779672144843676192684301168479657279498120767424724024965319869248797423276064015643361426189576415670917818313417529572608229017809069355688606687557031643655896118"), s);
330 if (!boost::multiprecision::is_interval_number<T>::value)
331 {
332 val = 2.75;
333 BOOST_CHECK_CLOSE_FRACTION(erf(val), T("0.9998993780778803631630956080249130432349352621422640655161095794654526422025908961447328296681056892975214344779300734620255391682713519265048496199034963706976420982849598189071465666866369396765001072187538732800143945532487"), s);
334 BOOST_CHECK_CLOSE_FRACTION(erf(val + T(0)), T("0.9998993780778803631630956080249130432349352621422640655161095794654526422025908961447328296681056892975214344779300734620255391682713519265048496199034963706976420982849598189071465666866369396765001072187538732800143945532487"), s);
335 BOOST_CHECK_CLOSE_FRACTION(erfc(val), T("0.0001006219221196368369043919750869567650647378577359344838904205345473577974091038552671703318943107024785655220699265379744608317286480734951503800965036293023579017150401810928534333133630603234998927812461267199856054467512"), s);
336 BOOST_CHECK_CLOSE_FRACTION(erfc(val + T(0)), T("0.0001006219221196368369043919750869567650647378577359344838904205345473577974091038552671703318943107024785655220699265379744608317286480734951503800965036293023579017150401810928534333133630603234998927812461267199856054467512"), s);
337 }
338 val = 0.125;
339 BOOST_CHECK_CLOSE_FRACTION(expm1(val), T("0.1331484530668263168290072278117938725655031317451816259128200360788235778800483865139399907949417285732315270156473075657048210452584733998785564025916995261162759280700397984729320345630340659469435372721057879969170503978449"), s);
340 BOOST_CHECK_CLOSE_FRACTION(expm1(val + T(0)), T("0.1331484530668263168290072278117938725655031317451816259128200360788235778800483865139399907949417285732315270156473075657048210452584733998785564025916995261162759280700397984729320345630340659469435372721057879969170503978449"), s);
341
342 val = 20;
343 s = 2;
344 BOOST_CHECK_EQUAL(fdim(val, s), 18);
345 BOOST_CHECK_EQUAL(fdim(s, val), 0);
346 BOOST_CHECK_EQUAL(fdim(val, s * 2), 16);
347 BOOST_CHECK_EQUAL(fdim(s * 2, val), 0);
348 BOOST_CHECK_EQUAL(fdim(val, 2), 18);
349 BOOST_CHECK_EQUAL(fdim(2, val), 0);
350
351 BOOST_CHECK_EQUAL(fmax(val, s), val);
352 BOOST_CHECK_EQUAL(fmax(s, val), val);
353 BOOST_CHECK_EQUAL(fmax(val * 2, s), val * 2);
354 BOOST_CHECK_EQUAL(fmax(val, s * 2), val);
355 BOOST_CHECK_EQUAL(fmax(val * 2, s * 2), val * 2);
356 BOOST_CHECK_EQUAL(fmin(val, s), s);
357 BOOST_CHECK_EQUAL(fmin(s, val), s);
358 BOOST_CHECK_EQUAL(fmin(val * 2, s), s);
359 BOOST_CHECK_EQUAL(fmin(val, s * 2), s * 2);
360 BOOST_CHECK_EQUAL(fmin(val * 2, s * 2), s * 2);
361
362 BOOST_CHECK_EQUAL(fmax(val, 2), val);
363 BOOST_CHECK_EQUAL(fmax(val, 2.0), val);
364 BOOST_CHECK_EQUAL(fmax(20, s), val);
365 BOOST_CHECK_EQUAL(fmax(20.0, s), val);
366 BOOST_CHECK_EQUAL(fmin(val, 2), s);
367 BOOST_CHECK_EQUAL(fmin(val, 2.0), s);
368 BOOST_CHECK_EQUAL(fmin(20, s), s);
369 BOOST_CHECK_EQUAL(fmin(20.0, s), s);
370 if (std::numeric_limits<T>::has_quiet_NaN)
371 {
372 BOOST_CHECK_EQUAL(fmax(val, std::numeric_limits<T>::quiet_NaN()), val);
373 BOOST_CHECK_EQUAL(fmax(std::numeric_limits<T>::quiet_NaN(), val), val);
374 BOOST_CHECK_EQUAL(fmin(val, std::numeric_limits<T>::quiet_NaN()), val);
375 BOOST_CHECK_EQUAL(fmin(std::numeric_limits<T>::quiet_NaN(), val), val);
376 }
377 if (std::numeric_limits<double>::has_quiet_NaN)
378 {
379 BOOST_CHECK_EQUAL(fmax(val, std::numeric_limits<double>::quiet_NaN()), val);
380 BOOST_CHECK_EQUAL(fmax(std::numeric_limits<double>::quiet_NaN(), val), val);
381 BOOST_CHECK_EQUAL(fmin(val, std::numeric_limits<double>::quiet_NaN()), val);
382 BOOST_CHECK_EQUAL(fmin(std::numeric_limits<double>::quiet_NaN(), val), val);
383 }
384
385 test_less(s, val);
386 test_less(2, val);
387 test_less(s, 20);
388 test_less(s + 0, val);
389 test_less(s, val * 1);
390 test_less(s * 1, val * 1);
391 test_less(s * 1, 20);
392 test_less(s + 2, val * 2);
393
394 test_equal(val, val);
395 test_equal(20, val);
396 test_equal(val, 20);
397 test_equal(val + 0, val);
398 test_equal(val, val * 1);
399 test_equal(val * 1, val * 1);
400 test_equal(val * 1, 20);
401 test_equal(val * 20, val * 20);
402
403 if (std::numeric_limits<T>::has_quiet_NaN)
404 {
405 s = std::numeric_limits<T>::quiet_NaN();
406 test_unordered(s, val);
407 test_unordered(s, 20);
408 test_unordered(s + 0, val);
409 test_unordered(s, val * 1);
410 test_unordered(s * 1, val * 1);
411 test_unordered(s * 1, 20);
412 test_unordered(s + 2, val * 2);
413 if (std::numeric_limits<double>::has_quiet_NaN)
414 {
415 double n = std::numeric_limits<double>::quiet_NaN();
416 test_unordered(n, val);
417 }
418 }
419
420 T tol = 8 * std::numeric_limits<T>::epsilon();
421 s = 2;
422 BOOST_CHECK_CLOSE_FRACTION(T(hypot(val, s)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
423 BOOST_CHECK_CLOSE_FRACTION(T(hypot(val, 2)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
424 BOOST_CHECK_CLOSE_FRACTION(T(hypot(val, 2.0)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
425 BOOST_CHECK_CLOSE_FRACTION(T(hypot(20, s)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
426 BOOST_CHECK_CLOSE_FRACTION(T(hypot(20.0, s)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
427 BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, s)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
428 BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, s * 1)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
429 BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, 2)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
430 BOOST_CHECK_CLOSE_FRACTION(T(hypot(val * 1, 2.0)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
431 BOOST_CHECK_CLOSE_FRACTION(T(hypot(20, s * 1)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
432 BOOST_CHECK_CLOSE_FRACTION(T(hypot(20.0, s * 1)), T("20.099751242241780540438529825519152373890046940052754581145656594656982463103940762472355384907904704732599006530"), tol);
433
434 BOOST_CHECK_CLOSE_FRACTION(lgamma(val), T("39.339884187199494036224652394567381081691457206897853119937969989377572554993874476249340525204204720861169039582"), tol);
435 BOOST_CHECK_CLOSE_FRACTION(lgamma(val + 0), T("39.339884187199494036224652394567381081691457206897853119937969989377572554993874476249340525204204720861169039582"), tol);
436
437 BOOST_CHECK_EQUAL(lrint(val), 20);
438 BOOST_CHECK_EQUAL(lrint(val * 2), 40);
439 BOOST_CHECK_EQUAL(llrint(val), 20);
440 BOOST_CHECK_EQUAL(llrint(val * 2), 40);
441
442 val = 0.125;
443 BOOST_CHECK_CLOSE_FRACTION(log1p(val), T("0.117783035656383454538794109470521705068480712564733141107348638794807720528133786929641528638208114949935615070"), tol);
444 BOOST_CHECK_CLOSE_FRACTION(log1p(val + 0), T("0.117783035656383454538794109470521705068480712564733141107348638794807720528133786929641528638208114949935615070"), tol);
445 val = 20;
446 BOOST_CHECK_CLOSE_FRACTION(T(log2(val)), T("4.321928094887362347870319429489390175864831393024580612054756395815934776608625215850139743359370155099657371710"), tol);
447 BOOST_CHECK_CLOSE_FRACTION(T(log2(val + 0)), T("4.321928094887362347870319429489390175864831393024580612054756395815934776608625215850139743359370155099657371710"), tol);
448
449 BOOST_CHECK_EQUAL(T(nearbyint(val)), 20);
450 BOOST_CHECK_EQUAL(T(nearbyint(val + 0.25)), 20);
451 BOOST_CHECK_EQUAL(T(rint(val)), 20);
452 BOOST_CHECK_EQUAL(T(rint(val + 0.25)), 20);
453
454 BOOST_CHECK_GT(nextafter(val, T(200)), val);
455 BOOST_CHECK_GT(nextafter(val + 0, T(200)), val);
456 BOOST_CHECK_GT(nextafter(val + 0, T(200) + 1), val);
457 BOOST_CHECK_GT(nextafter(val, T(200) + 1), val);
458
459 BOOST_CHECK_GT(nexttoward(val, T(200)), val);
460 BOOST_CHECK_GT(nexttoward(val + 0, T(200)), val);
461 BOOST_CHECK_GT(nexttoward(val + 0, T(200) + 1), val);
462 BOOST_CHECK_GT(nexttoward(val, T(200) + 1), val);
463
464 val = 21;
465 s = 5;
466 BOOST_CHECK_EQUAL(T(remainder(val, s)), 1);
467 BOOST_CHECK_EQUAL(T(remainder(val, 5)), 1);
468 BOOST_CHECK_EQUAL(T(remainder(21, s)), 1);
469 BOOST_CHECK_EQUAL(T(remainder(val * 1, s)), 1);
470 BOOST_CHECK_EQUAL(T(remainder(val * 1, s * 1)), 1);
471 BOOST_CHECK_EQUAL(T(remainder(val, s * 1)), 1);
472 BOOST_CHECK_EQUAL(T(remainder(val * 1, 5)), 1);
473 BOOST_CHECK_EQUAL(T(remainder(21, s * 1)), 1);
474 int i(0);
475 BOOST_CHECK_EQUAL(T(remquo(val, s, &i)), 1);
476 BOOST_CHECK_EQUAL(i, 4);
477 i = 0;
478 BOOST_CHECK_EQUAL(T(remquo(val, 5, &i)), 1);
479 BOOST_CHECK_EQUAL(i, 4);
480 i = 0;
481 BOOST_CHECK_EQUAL(T(remquo(21, s, &i)), 1);
482 BOOST_CHECK_EQUAL(i, 4);
483 i = 0;
484 BOOST_CHECK_EQUAL(T(remquo(val * 1, s, &i)), 1);
485 BOOST_CHECK_EQUAL(i, 4);
486 i = 0;
487 BOOST_CHECK_EQUAL(T(remquo(val * 1, s * 1, &i)), 1);
488 BOOST_CHECK_EQUAL(i, 4);
489 i = 0;
490 BOOST_CHECK_EQUAL(T(remquo(val, s * 1, &i)), 1);
491 BOOST_CHECK_EQUAL(i, 4);
492 i = 0;
493 BOOST_CHECK_EQUAL(T(remquo(val * 1, 5, &i)), 1);
494 BOOST_CHECK_EQUAL(i, 4);
495 i = 0;
496 BOOST_CHECK_EQUAL(T(remquo(21, s * 1, &i)), 1);
497 BOOST_CHECK_EQUAL(i, 4);
498 i = 0;
499 val = 5.25;
500 tol = 3000;
501 BOOST_CHECK_CLOSE_FRACTION(tgamma(val), T("35.211611852799685705225257690531248115026311138908448314086859575901217653313145619623624570033258659272301335544"), tol);
502 BOOST_CHECK_CLOSE_FRACTION(tgamma(val + 1), T("184.86096222719834995243260287528905260388813347926935364895601277348139267989401450302402899267460796117958201160"), tol);
503
504 BOOST_CHECK_CLOSE_FRACTION(T(exp2(val)), T("38.054627680087074134959999057935229289375106958842157216608071191022933383261349115865003025220405558913196632792"), tol);
505 BOOST_CHECK_CLOSE_FRACTION(T(exp2(val + 1)), T("76.109255360174148269919998115870458578750213917684314433216142382045866766522698231730006050440811117826393265585"), tol);
506 val = 15;
507 BOOST_CHECK_CLOSE_FRACTION(T(exp2(val)), T(32768uL), tol);
508 BOOST_CHECK_CLOSE_FRACTION(T(exp2(val + 1)), T(65536uL), tol);
509
510 i = fpclassify(val) + isgreaterequal(val, s) + islessequal(val, s) + isnan(val) + isunordered(val, s) + isfinite(val) + isinf(val) + islessgreater(val, s) + isnormal(val) + signbit(val) + isgreater(val, s) + isless(val, s);
511 }
512
513 template <class T>
514 void test_poison()
515 {
516 // use these macros as proxies for determining C99 support:
517 #if defined(FP_ILOGB0) && defined(FP_INFINITE)
518 //
519 // These tests verify that our function overloads for Boost.Multiprecision
520 // don't do anything nasty to the std:: overloads for built in types:
521 //
522 using namespace std;
523 using namespace boost::multiprecision;
524 //using namespace boost::math;
525
526 T a(2), b(0.3f), c(4), result(0);
527 int i;
528
529 result += abs(a);
530 result += cosh(a);
531 result += fmod(a, b);
532 result += logb(a);
533 result += remquo(a, b, &i);
534 result += acos(b);
535 result += erf(a);
536 result += frexp(a, &i);
537 result += lrint(a);
538 result += rint(a);
539 result += acosh(b);
540 result += erfc(b);
541 result += hypot(a, b);
542 result += lround(c);
543 result += round(c);
544 result += asin(b);
545 result += exp2(a);
546 result += ilogb(b);
547 result += modf(a, &b);
548 result += scalbln(a, i);
549 result += asinh(b);
550 result += exp(b);
551 result += ldexp(a, i);
552 result += scalbn(a, i);
553 result += atan(b);
554 result += expm1(a);
555 result += lgamma(a);
556 result += sin(b);
557 result += atan2(a, c);
558 result += fabs(a);
559 result += llrint(a);
560 result += sinh(b);
561 result += atanh(b);
562 result += fdim(a, b);
563 result += llround(a);
564 result += nearbyint(a);
565 result += sqrt(b);
566 result += cbrt(a);
567 result += floor(b);
568 result += log(a);
569 result += nextafter(a, b);
570 result += tan(b);
571 result += ceil(b);
572 result += fma(a, b, c);
573 result += log10(a);
574 result += nexttoward(a, b);
575 result += tanh(a);
576 result += copysign(a, b);
577 result += fmax(a, b);
578 result += log1p(a);
579 result += pow(a, b);
580 result += tgamma(a);
581 result += cos(b);
582 result += fmin(a, b);
583 result += log2(a);
584 result += remainder(a, b);
585 result += trunc(b);
586 result += (min)(a, b);
587 result += (max)(a, b);
588
589 #if !BOOST_WORKAROUND(BOOST_LIBSTDCXX_VERSION, < 60000)
590
591 i = fpclassify(a) + isgreaterequal(a, b) + islessequal(a, b) + isnan(a) + isunordered(a, b) + isfinite(a) + isinf(a) + islessgreater(a, b) + isnormal(a) + signbit(a) + isgreater(a, b) + isless(a, b);
592 #endif
593 #endif
594 }
595
596 template <class T>
597 bool type_sets_errno(const T&)
598 {
599 return true;
600 }
601 #ifdef TEST_MPFR_50
602 template <unsigned Digits10, boost::multiprecision::mpfr_allocation_type AllocateType, boost::multiprecision::expression_template_option ExpressionTemplates>
603 bool type_sets_errno(const boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<Digits10, AllocateType>, ExpressionTemplates>&)
604 {
605 return false;
606 }
607 #endif
608 #ifdef TEST_FLOAT128
609 bool type_sets_errno(const boost::multiprecision::float128&)
610 {
611 return false;
612 }
613 #endif
614
615 template <class T>
616 typename boost::enable_if_c<std::numeric_limits<T>::is_specialized>::type check_invalid(const T& val)
617 {
618 if (std::numeric_limits<T>::has_quiet_NaN)
619 {
620 BOOST_CHECK(isnan(val));
621 }
622 else
623 {
624 BOOST_CHECK_EQUAL(val, 0);
625 }
626 if (type_sets_errno(val))
627 BOOST_CHECK_EQUAL(errno, EDOM);
628 errno = 0;
629 }
630
631 template <class T>
632 typename boost::disable_if_c<std::numeric_limits<T>::is_specialized>::type check_invalid(const T& val)
633 {
634 check_invalid(static_cast<typename T::result_type>(val));
635 }
636
637 template <class T>
638 void check_erange(const T& val)
639 {
640 if (type_sets_errno(val))
641 BOOST_CHECK_EQUAL(errno, ERANGE);
642 errno = 0;
643 }
644
645 template <class T>
646 void test_c99_appendix_F()
647 {
648 //
649 // Tests conformance to non-normative appendix F.9.1 of C99, basically how to handle
650 // special cases, infinities and NaN's.
651 //
652 errno = 0;
653 T tol = std::numeric_limits<T>::epsilon();
654 // F.9.1.1:
655 T arg = 1;
656 T val = acos(arg);
657 BOOST_CHECK_EQUAL(val, 0);
658 BOOST_CHECK(signbit(val) == 0);
659 arg = 2;
660 check_invalid(acos(arg));
661 arg = -2;
662 check_invalid(acos(arg));
663 if (std::numeric_limits<T>::has_infinity)
664 {
665 arg = std::numeric_limits<T>::infinity();
666 check_invalid(acos(arg));
667 arg = -std::numeric_limits<T>::infinity();
668 check_invalid(acos(arg));
669 }
670 if (std::numeric_limits<T>::has_quiet_NaN)
671 {
672 arg = std::numeric_limits<T>::quiet_NaN();
673 check_invalid(acos(arg));
674 arg = -std::numeric_limits<T>::quiet_NaN();
675 check_invalid(acos(arg));
676 }
677 // F.9.1.2:
678 arg = 0;
679 val = asin(arg);
680 BOOST_CHECK_EQUAL(val, 0);
681 BOOST_CHECK(signbit(val) == 0);
682 arg = -arg;
683 if (signbit(arg))
684 {
685 val = asin(arg);
686 BOOST_CHECK_EQUAL(val, 0);
687 BOOST_CHECK(signbit(val));
688 }
689 arg = 2;
690 check_invalid(asin(arg));
691 arg = -2;
692 check_invalid(asin(arg));
693 if (std::numeric_limits<T>::has_infinity)
694 {
695 arg = std::numeric_limits<T>::infinity();
696 check_invalid(asin(arg));
697 arg = -std::numeric_limits<T>::infinity();
698 check_invalid(asin(arg));
699 }
700 if (std::numeric_limits<T>::has_quiet_NaN)
701 {
702 arg = std::numeric_limits<T>::quiet_NaN();
703 check_invalid(asin(arg));
704 arg = -std::numeric_limits<T>::quiet_NaN();
705 check_invalid(asin(arg));
706 }
707 // F.9.1.3:
708 arg = 0;
709 val = atan(arg);
710 BOOST_CHECK_EQUAL(val, 0);
711 BOOST_CHECK(signbit(val) == 0);
712 arg = -arg;
713 if (signbit(arg))
714 {
715 val = atan(arg);
716 BOOST_CHECK_EQUAL(val, 0);
717 BOOST_CHECK(signbit(val));
718 }
719 if (std::numeric_limits<T>::has_infinity)
720 {
721 arg = std::numeric_limits<T>::infinity();
722 val = atan(arg);
723 BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());
724 arg = -std::numeric_limits<T>::infinity();
725 val = atan(arg);
726 BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());
727 }
728 if (std::numeric_limits<T>::has_quiet_NaN)
729 {
730 arg = std::numeric_limits<T>::quiet_NaN();
731 check_invalid(asin(arg));
732 arg = -std::numeric_limits<T>::quiet_NaN();
733 check_invalid(asin(arg));
734 }
735 // F.9.1.4:
736 arg = 0;
737 T arg2 = 0;
738 val = atan2(arg, arg2);
739 BOOST_CHECK_EQUAL(val, 0);
740 BOOST_CHECK(signbit(val) == 0);
741 arg = -arg;
742 if (signbit(arg))
743 {
744 val = atan2(arg, arg2);
745 BOOST_CHECK_EQUAL(val, 0);
746 BOOST_CHECK(signbit(val));
747 }
748 arg2 = -arg2;
749 if (signbit(arg2))
750 {
751 arg = 0;
752 val = atan2(arg, arg2);
753 BOOST_CHECK_EQUAL(val, boost::math::constants::pi<T>());
754 BOOST_CHECK(signbit(val) == 0);
755 arg = -arg;
756 val = atan2(arg, arg2);
757 BOOST_CHECK_EQUAL(val, -boost::math::constants::pi<T>());
758 BOOST_CHECK(signbit(val));
759 }
760 arg = 0;
761 arg2 = -2;
762 val = atan2(arg, arg2);
763 BOOST_CHECK_EQUAL(val, boost::math::constants::pi<T>());
764 arg = -arg;
765 if (signbit(arg))
766 {
767 val = atan2(arg, arg2);
768 BOOST_CHECK_EQUAL(val, -boost::math::constants::pi<T>());
769 }
770 arg = 0;
771 arg2 = 2;
772 val = atan2(arg, arg2);
773 BOOST_CHECK_EQUAL(val, 0);
774 BOOST_CHECK(signbit(val) == 0);
775 arg = -arg;
776 if (signbit(arg))
777 {
778 val = atan2(arg, arg2);
779 BOOST_CHECK_EQUAL(val, 0);
780 BOOST_CHECK(signbit(val));
781 }
782 arg = -2;
783 arg2 = 0;
784 val = atan2(arg, arg2);
785 BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());
786 arg2 = -arg2;
787 if (signbit(arg2))
788 {
789 val = atan2(arg, arg2);
790 BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());
791 }
792 arg = 2;
793 arg2 = 0;
794 val = atan2(arg, arg2);
795 BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());
796 arg2 = -arg2;
797 if (signbit(arg2))
798 {
799 val = atan2(arg, arg2);
800 BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());
801 }
802 if (std::numeric_limits<T>::has_infinity)
803 {
804 arg = 2;
805 arg2 = -std::numeric_limits<T>::infinity();
806 val = atan2(arg, arg2);
807 BOOST_CHECK_EQUAL(val, boost::math::constants::pi<T>());
808 arg = -arg;
809 val = atan2(arg, arg2);
810 BOOST_CHECK_EQUAL(val, -boost::math::constants::pi<T>());
811 arg = 2;
812 arg2 = std::numeric_limits<T>::infinity();
813 val = atan2(arg, arg2);
814 BOOST_CHECK_EQUAL(val, 0);
815 BOOST_CHECK(signbit(val) == 0);
816 arg = -arg;
817 if (signbit(-T(0)))
818 {
819 val = atan2(arg, arg2);
820 BOOST_CHECK_EQUAL(val, 0);
821 BOOST_CHECK(signbit(val));
822 }
823 arg = std::numeric_limits<T>::infinity();
824 arg2 = 2;
825 val = atan2(arg, arg2);
826 BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());
827 arg = -arg;
828 val = atan2(arg, arg2);
829 BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());
830 arg = std::numeric_limits<T>::infinity();
831 arg2 = -2;
832 val = atan2(arg, arg2);
833 BOOST_CHECK_EQUAL(val, boost::math::constants::half_pi<T>());
834 arg = -arg;
835 val = atan2(arg, arg2);
836 BOOST_CHECK_EQUAL(val, -boost::math::constants::half_pi<T>());
837 arg = std::numeric_limits<T>::infinity();
838 arg2 = -std::numeric_limits<T>::infinity();
839 val = atan2(arg, arg2);
840 BOOST_CHECK_CLOSE_FRACTION(val, boost::math::constants::three_quarters_pi<T>(), tol);
841 arg = -arg;
842 val = atan2(arg, arg2);
843 BOOST_CHECK_CLOSE_FRACTION(val, -boost::math::constants::three_quarters_pi<T>(), tol);
844 arg = std::numeric_limits<T>::infinity();
845 arg2 = std::numeric_limits<T>::infinity();
846 val = atan2(arg, arg2);
847 BOOST_CHECK_CLOSE_FRACTION(val, ldexp(boost::math::constants::pi<T>(), -2), tol);
848 arg = -arg;
849 val = atan2(arg, arg2);
850 BOOST_CHECK_CLOSE_FRACTION(val, -ldexp(boost::math::constants::pi<T>(), -2), tol);
851 if (std::numeric_limits<T>::has_quiet_NaN)
852 {
853 arg = std::numeric_limits<T>::quiet_NaN();
854 arg2 = 2;
855 check_invalid(atan2(arg, arg2));
856 std::swap(arg, arg2);
857 check_invalid(atan2(arg, arg2));
858 arg = std::numeric_limits<T>::quiet_NaN();
859 check_invalid(atan2(arg, arg2));
860 }
861 }
862 // F.9.1.5:
863 arg = 0;
864 val = cos(arg);
865 BOOST_CHECK_EQUAL(val, 1);
866 arg = -arg;
867 BOOST_CHECK_EQUAL(val, 1);
868 if (std::numeric_limits<T>::has_infinity)
869 {
870 arg = std::numeric_limits<T>::infinity();
871 check_invalid(cos(arg));
872 arg = -std::numeric_limits<T>::infinity();
873 check_invalid(cos(arg));
874 }
875 if (std::numeric_limits<T>::has_quiet_NaN)
876 {
877 arg = std::numeric_limits<T>::quiet_NaN();
878 check_invalid(cos(arg));
879 arg = -std::numeric_limits<T>::quiet_NaN();
880 check_invalid(cos(arg));
881 }
882 // F.9.1.6:
883 arg = 0;
884 val = sin(arg);
885 BOOST_CHECK_EQUAL(val, 0);
886 BOOST_CHECK(signbit(val) == 0);
887 arg = -arg;
888 if (signbit(arg))
889 {
890 val = sin(arg);
891 BOOST_CHECK_EQUAL(val, 0);
892 BOOST_CHECK(signbit(val));
893 }
894 if (std::numeric_limits<T>::has_infinity)
895 {
896 arg = std::numeric_limits<T>::infinity();
897 check_invalid(sin(arg));
898 arg = -std::numeric_limits<T>::infinity();
899 check_invalid(sin(arg));
900 }
901 if (std::numeric_limits<T>::has_quiet_NaN)
902 {
903 arg = std::numeric_limits<T>::quiet_NaN();
904 check_invalid(sin(arg));
905 arg = -std::numeric_limits<T>::quiet_NaN();
906 check_invalid(sin(arg));
907 }
908 // F.9.1.7:
909 arg = 0;
910 val = tan(arg);
911 BOOST_CHECK_EQUAL(val, 0);
912 BOOST_CHECK(signbit(val) == 0);
913 arg = -arg;
914 if (signbit(arg))
915 {
916 val = tan(arg);
917 BOOST_CHECK_EQUAL(val, 0);
918 BOOST_CHECK(signbit(val));
919 }
920 if (std::numeric_limits<T>::has_infinity)
921 {
922 arg = std::numeric_limits<T>::infinity();
923 check_invalid(tan(arg));
924 arg = -std::numeric_limits<T>::infinity();
925 check_invalid(tan(arg));
926 }
927 if (std::numeric_limits<T>::has_quiet_NaN)
928 {
929 arg = std::numeric_limits<T>::quiet_NaN();
930 check_invalid(tan(arg));
931 arg = -std::numeric_limits<T>::quiet_NaN();
932 check_invalid(tan(arg));
933 }
934 // F.9.2.1:
935 arg = 1;
936 val = acosh(arg);
937 BOOST_CHECK_EQUAL(val, 0);
938 BOOST_CHECK(signbit(val) == 0);
939 arg = -arg;
940 check_invalid(acosh(arg));
941 if (std::numeric_limits<T>::has_infinity)
942 {
943 arg = std::numeric_limits<T>::infinity();
944 val = acosh(arg);
945 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
946
947 arg = -std::numeric_limits<T>::infinity();
948 check_invalid(acosh(arg));
949 }
950 if (std::numeric_limits<T>::has_quiet_NaN)
951 {
952 arg = std::numeric_limits<T>::quiet_NaN();
953 check_invalid(acosh(arg));
954 arg = -std::numeric_limits<T>::quiet_NaN();
955 check_invalid(acosh(arg));
956 }
957 // F.9.2.2:
958 arg = 0;
959 val = asinh(arg);
960 BOOST_CHECK_EQUAL(val, 0);
961 BOOST_CHECK(signbit(val) == 0);
962 arg = -arg;
963 if (signbit(arg))
964 {
965 val = asinh(arg);
966 BOOST_CHECK_EQUAL(val, 0);
967 BOOST_CHECK(signbit(val));
968 }
969 if (std::numeric_limits<T>::has_infinity)
970 {
971 arg = std::numeric_limits<T>::infinity();
972 val = asinh(arg);
973 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
974
975 arg = -std::numeric_limits<T>::infinity();
976 val = asinh(arg);
977 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
978 }
979 if (std::numeric_limits<T>::has_quiet_NaN)
980 {
981 arg = std::numeric_limits<T>::quiet_NaN();
982 check_invalid(asinh(arg));
983 arg = -std::numeric_limits<T>::quiet_NaN();
984 check_invalid(asinh(arg));
985 }
986 // F.9.2.3:
987 arg = 0;
988 val = atanh(arg);
989 BOOST_CHECK_EQUAL(val, 0);
990 BOOST_CHECK(signbit(val) == 0);
991 arg = -arg;
992 if (signbit(arg))
993 {
994 val = atanh(arg);
995 BOOST_CHECK_EQUAL(val, 0);
996 BOOST_CHECK(signbit(val));
997 }
998 arg = 2;
999 check_invalid(atanh(arg));
1000 arg = -3;
1001 check_invalid(atanh(arg));
1002
1003 if (std::numeric_limits<T>::has_infinity)
1004 {
1005 arg = 1;
1006 val = atanh(arg);
1007 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1008 BOOST_CHECK(signbit(val) == 0);
1009 check_erange(val);
1010 arg = -arg;
1011 val = atanh(arg);
1012 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1013 BOOST_CHECK(signbit(val));
1014 check_erange(val);
1015
1016 arg = std::numeric_limits<T>::infinity();
1017 check_invalid(atanh(arg));
1018 arg = -std::numeric_limits<T>::infinity();
1019 check_invalid(atanh(arg));
1020 }
1021 if (std::numeric_limits<T>::has_quiet_NaN)
1022 {
1023 arg = std::numeric_limits<T>::quiet_NaN();
1024 check_invalid(atanh(arg));
1025 arg = -std::numeric_limits<T>::quiet_NaN();
1026 check_invalid(atanh(arg));
1027 }
1028 // F.9.2.4:
1029 arg = 0;
1030 val = cosh(arg);
1031 BOOST_CHECK_EQUAL(val, 1);
1032 arg = -arg;
1033 if (signbit(arg))
1034 {
1035 val = cosh(arg);
1036 BOOST_CHECK_EQUAL(val, 1);
1037 }
1038 if (std::numeric_limits<T>::has_infinity)
1039 {
1040 arg = (std::numeric_limits<T>::max)();
1041 val = cosh(arg);
1042 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1043 arg = -arg;
1044 val = cosh(arg);
1045 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1046 arg = std::numeric_limits<T>::infinity();
1047 val = cosh(arg);
1048 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1049 arg = -arg;
1050 val = cosh(arg);
1051 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1052 }
1053 if (std::numeric_limits<T>::has_quiet_NaN)
1054 {
1055 arg = std::numeric_limits<T>::quiet_NaN();
1056 check_invalid(cosh(arg));
1057 arg = -std::numeric_limits<T>::quiet_NaN();
1058 check_invalid(cosh(arg));
1059 }
1060 // F.9.2.5:
1061 arg = 0;
1062 val = sinh(arg);
1063 BOOST_CHECK_EQUAL(val, 0);
1064 BOOST_CHECK(signbit(val) == 0);
1065 arg = -arg;
1066 if (signbit(arg))
1067 {
1068 val = sinh(arg);
1069 BOOST_CHECK_EQUAL(val, 0);
1070 BOOST_CHECK(signbit(val));
1071 }
1072 if (std::numeric_limits<T>::has_infinity)
1073 {
1074 arg = (std::numeric_limits<T>::max)();
1075 val = sinh(arg);
1076 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1077 arg = -arg;
1078 val = sinh(arg);
1079 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1080 arg = std::numeric_limits<T>::infinity();
1081 val = sinh(arg);
1082 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1083 arg = -arg;
1084 val = sinh(arg);
1085 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1086 }
1087 if (std::numeric_limits<T>::has_quiet_NaN)
1088 {
1089 arg = std::numeric_limits<T>::quiet_NaN();
1090 check_invalid(sinh(arg));
1091 arg = -std::numeric_limits<T>::quiet_NaN();
1092 check_invalid(sinh(arg));
1093 }
1094 // F.9.2.6:
1095 arg = 0;
1096 val = tanh(arg);
1097 BOOST_CHECK_EQUAL(val, 0);
1098 BOOST_CHECK(signbit(val) == 0);
1099 arg = -arg;
1100 if (signbit(arg))
1101 {
1102 val = tanh(arg);
1103 BOOST_CHECK_EQUAL(val, 0);
1104 BOOST_CHECK(signbit(val));
1105 }
1106 arg = (std::numeric_limits<T>::max)();
1107 val = tanh(arg);
1108 BOOST_CHECK_EQUAL(val, 1);
1109 arg = -arg;
1110 val = tanh(arg);
1111 BOOST_CHECK_EQUAL(val, -1);
1112 if (std::numeric_limits<T>::has_infinity)
1113 {
1114 arg = std::numeric_limits<T>::infinity();
1115 val = tanh(arg);
1116 BOOST_CHECK_EQUAL(val, 1);
1117 arg = -arg;
1118 val = tanh(arg);
1119 BOOST_CHECK_EQUAL(val, -1);
1120 }
1121 if (std::numeric_limits<T>::has_quiet_NaN)
1122 {
1123 arg = std::numeric_limits<T>::quiet_NaN();
1124 check_invalid(tanh(arg));
1125 arg = -std::numeric_limits<T>::quiet_NaN();
1126 check_invalid(tanh(arg));
1127 }
1128 // F.9.3.1:
1129 arg = 0;
1130 val = exp(arg);
1131 BOOST_CHECK_EQUAL(val, 1);
1132 arg = -arg;
1133 if (signbit(arg))
1134 {
1135 val = exp(arg);
1136 BOOST_CHECK_EQUAL(val, 1);
1137 }
1138 if (std::numeric_limits<T>::has_infinity)
1139 {
1140 arg = std::numeric_limits<T>::infinity();
1141 val = exp(arg);
1142 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1143 arg = -arg;
1144 val = exp(arg);
1145 BOOST_CHECK_EQUAL(val, 0);
1146 BOOST_CHECK(signbit(val) == 0);
1147 arg = (std::numeric_limits<T>::max)();
1148 val = exp(arg);
1149 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1150 arg = -arg;
1151 val = exp(arg);
1152 BOOST_CHECK_EQUAL(val, 0);
1153 BOOST_CHECK(signbit(val) == 0);
1154 }
1155 if (std::numeric_limits<T>::has_quiet_NaN)
1156 {
1157 arg = std::numeric_limits<T>::quiet_NaN();
1158 check_invalid(exp(arg));
1159 arg = -std::numeric_limits<T>::quiet_NaN();
1160 check_invalid(exp(arg));
1161 }
1162 // F.9.3.2:
1163 arg = 0;
1164 val = exp2(arg);
1165 BOOST_CHECK_EQUAL(val, 1);
1166 arg = -arg;
1167 if (signbit(arg))
1168 {
1169 val = exp2(arg);
1170 BOOST_CHECK_EQUAL(val, 1);
1171 }
1172 if (std::numeric_limits<T>::has_infinity)
1173 {
1174 arg = std::numeric_limits<T>::infinity();
1175 val = exp2(arg);
1176 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1177 arg = -arg;
1178 val = exp2(arg);
1179 BOOST_CHECK_EQUAL(val, 0);
1180 BOOST_CHECK(signbit(val) == 0);
1181 arg = (std::numeric_limits<T>::max)();
1182 val = exp2(arg);
1183 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1184 arg = -arg;
1185 val = exp2(arg);
1186 BOOST_CHECK_EQUAL(val, 0);
1187 BOOST_CHECK(signbit(val) == 0);
1188 }
1189 if (std::numeric_limits<T>::has_quiet_NaN)
1190 {
1191 arg = std::numeric_limits<T>::quiet_NaN();
1192 check_invalid(exp2(arg));
1193 arg = -std::numeric_limits<T>::quiet_NaN();
1194 check_invalid(exp2(arg));
1195 }
1196 // F.9.3.3:
1197 arg = 0;
1198 val = expm1(arg);
1199 BOOST_CHECK_EQUAL(val, 0);
1200 BOOST_CHECK(signbit(val) == 0);
1201 arg = -arg;
1202 if (signbit(arg))
1203 {
1204 val = expm1(arg);
1205 BOOST_CHECK_EQUAL(val, 0);
1206 BOOST_CHECK(signbit(val));
1207 }
1208 if (std::numeric_limits<T>::has_infinity)
1209 {
1210 arg = std::numeric_limits<T>::infinity();
1211 val = expm1(arg);
1212 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1213 arg = -arg;
1214 val = expm1(arg);
1215 BOOST_CHECK_EQUAL(val, -1);
1216 arg = (std::numeric_limits<T>::max)();
1217 val = expm1(arg);
1218 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1219 arg = -arg;
1220 val = expm1(arg);
1221 BOOST_CHECK_EQUAL(val, -1);
1222 }
1223 if (std::numeric_limits<T>::has_quiet_NaN)
1224 {
1225 arg = std::numeric_limits<T>::quiet_NaN();
1226 check_invalid(expm1(arg));
1227 arg = -std::numeric_limits<T>::quiet_NaN();
1228 check_invalid(expm1(arg));
1229 }
1230 // F.9.3.4:
1231 arg = 0;
1232 int ival;
1233 val = frexp(arg, &ival);
1234 BOOST_CHECK_EQUAL(val, 0);
1235 BOOST_CHECK_EQUAL(ival, 0);
1236 BOOST_CHECK(signbit(val) == 0);
1237 arg = -arg;
1238 if (signbit(arg))
1239 {
1240 val = frexp(arg, &ival);
1241 BOOST_CHECK_EQUAL(val, 0);
1242 BOOST_CHECK(signbit(val));
1243 BOOST_CHECK(signbit(val));
1244 }
1245 if (std::numeric_limits<T>::has_infinity)
1246 {
1247 arg = std::numeric_limits<T>::infinity();
1248 val = frexp(arg, &ival);
1249 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1250 arg = -arg;
1251 val = frexp(arg, &ival);
1252 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1253 }
1254 if (std::numeric_limits<T>::has_quiet_NaN)
1255 {
1256 arg = std::numeric_limits<T>::quiet_NaN();
1257 val = frexp(arg, &ival);
1258 BOOST_CHECK(isnan(val));
1259 }
1260 // F.9.3.5:
1261 typename T::backend_type::exponent_type eval;
1262 typename T::backend_type::exponent_type fp_ilogb0 = (std::numeric_limits<typename T::backend_type::exponent_type>::min)();
1263 typename T::backend_type::exponent_type fp_ilogbnan =
1264 #ifdef FP_ILOGBNAN
1265 FP_ILOGBNAN < 0 ? (std::numeric_limits<typename T::backend_type::exponent_type>::min)() : (std::numeric_limits<typename T::backend_type::exponent_type>::max)();
1266 #else
1267 INT_MAX;
1268 #endif
1269
1270 arg = 0;
1271 eval = ilogb(arg);
1272 BOOST_CHECK_EQUAL(eval, fp_ilogb0);
1273 if (std::numeric_limits<T>::has_infinity)
1274 {
1275 arg = std::numeric_limits<T>::infinity();
1276 eval = ilogb(arg);
1277 BOOST_CHECK_EQUAL(eval, (std::numeric_limits<typename T::backend_type::exponent_type>::max)());
1278 arg = -arg;
1279 eval = ilogb(arg);
1280 BOOST_CHECK_EQUAL(eval, (std::numeric_limits<typename T::backend_type::exponent_type>::max)());
1281 }
1282 if (std::numeric_limits<T>::has_quiet_NaN)
1283 {
1284 arg = std::numeric_limits<T>::quiet_NaN();
1285 eval = ilogb(arg);
1286 BOOST_CHECK_EQUAL(eval, fp_ilogbnan);
1287 }
1288 // F.9.3.7:
1289 arg = 1;
1290 val = log(arg);
1291 BOOST_CHECK_EQUAL(val, 0);
1292 BOOST_CHECK(signbit(val) == 0);
1293 if (std::numeric_limits<T>::has_infinity)
1294 {
1295 arg = 0;
1296 val = log(arg);
1297 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1298 check_erange(val);
1299 arg = -arg;
1300 if (signbit(arg))
1301 {
1302 val = log(arg);
1303 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1304 check_erange(val);
1305 }
1306 arg = -1;
1307 check_invalid(log(arg));
1308 arg = -std::numeric_limits<T>::infinity();
1309 check_invalid(log(arg));
1310 arg = std::numeric_limits<T>::infinity();
1311 val = log(arg);
1312 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1313 }
1314 if (std::numeric_limits<T>::has_quiet_NaN)
1315 {
1316 arg = std::numeric_limits<T>::quiet_NaN();
1317 check_invalid(log(arg));
1318 arg = -std::numeric_limits<T>::quiet_NaN();
1319 check_invalid(log(arg));
1320 }
1321 // F.9.3.8:
1322 arg = 1;
1323 val = log10(arg);
1324 BOOST_CHECK_EQUAL(val, 0);
1325 BOOST_CHECK(signbit(val) == 0);
1326 if (std::numeric_limits<T>::has_infinity)
1327 {
1328 arg = 0;
1329 val = log10(arg);
1330 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1331 check_erange(val);
1332 arg = -arg;
1333 if (signbit(arg))
1334 {
1335 val = log10(arg);
1336 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1337 check_erange(val);
1338 }
1339 arg = -1;
1340 check_invalid(log10(arg));
1341 arg = -std::numeric_limits<T>::infinity();
1342 check_invalid(log10(arg));
1343 arg = std::numeric_limits<T>::infinity();
1344 val = log10(arg);
1345 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1346 }
1347 if (std::numeric_limits<T>::has_quiet_NaN)
1348 {
1349 arg = std::numeric_limits<T>::quiet_NaN();
1350 check_invalid(log10(arg));
1351 arg = -std::numeric_limits<T>::quiet_NaN();
1352 check_invalid(log10(arg));
1353 }
1354 // F.9.3.9:
1355 arg = 0;
1356 val = log1p(arg);
1357 BOOST_CHECK_EQUAL(val, 0);
1358 BOOST_CHECK(signbit(val) == 0);
1359 arg = -arg;
1360 if (signbit(arg))
1361 {
1362 val = log1p(arg);
1363 BOOST_CHECK_EQUAL(val, 0);
1364 BOOST_CHECK(signbit(val));
1365 }
1366 if (std::numeric_limits<T>::has_infinity)
1367 {
1368 arg = -1;
1369 val = log1p(arg);
1370 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1371 check_erange(val);
1372 arg = -2;
1373 check_invalid(log1p(arg));
1374 arg = -std::numeric_limits<T>::infinity();
1375 check_invalid(log1p(arg));
1376 arg = std::numeric_limits<T>::infinity();
1377 val = log1p(arg);
1378 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1379 }
1380 if (std::numeric_limits<T>::has_quiet_NaN)
1381 {
1382 arg = std::numeric_limits<T>::quiet_NaN();
1383 check_invalid(log1p(arg));
1384 arg = -std::numeric_limits<T>::quiet_NaN();
1385 check_invalid(log1p(arg));
1386 }
1387 // F.9.3.10:
1388 arg = 1;
1389 val = log2(arg);
1390 BOOST_CHECK_EQUAL(val, 0);
1391 BOOST_CHECK(signbit(val) == 0);
1392 if (std::numeric_limits<T>::has_infinity)
1393 {
1394 arg = 0;
1395 val = log2(arg);
1396 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1397 check_erange(val);
1398 arg = -arg;
1399 if (signbit(arg))
1400 {
1401 val = log2(arg);
1402 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1403 check_erange(val);
1404 }
1405 arg = -1;
1406 check_invalid(log2(arg));
1407 arg = -std::numeric_limits<T>::infinity();
1408 check_invalid(log2(arg));
1409 arg = std::numeric_limits<T>::infinity();
1410 val = log2(arg);
1411 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1412 }
1413 if (std::numeric_limits<T>::has_quiet_NaN)
1414 {
1415 arg = std::numeric_limits<T>::quiet_NaN();
1416 check_invalid(log2(arg));
1417 arg = -std::numeric_limits<T>::quiet_NaN();
1418 check_invalid(log2(arg));
1419 }
1420 // F.9.3.11:
1421 if (std::numeric_limits<T>::has_infinity)
1422 {
1423 arg = 0;
1424 val = logb(arg);
1425 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1426 check_erange(val);
1427 arg = -arg;
1428 if (signbit(arg))
1429 {
1430 val = logb(arg);
1431 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1432 check_erange(val);
1433 }
1434 arg = std::numeric_limits<T>::infinity();
1435 val = logb(arg);
1436 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1437 arg = -std::numeric_limits<T>::infinity();
1438 val = logb(arg);
1439 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1440 }
1441 if (std::numeric_limits<T>::has_quiet_NaN)
1442 {
1443 arg = std::numeric_limits<T>::quiet_NaN();
1444 check_invalid(logb(arg));
1445 arg = -std::numeric_limits<T>::quiet_NaN();
1446 check_invalid(logb(arg));
1447 }
1448 // F.9.3.13:
1449 arg = 0;
1450 val = scalbn(arg, 2);
1451 BOOST_CHECK_EQUAL(val, 0);
1452 BOOST_CHECK(signbit(val) == 0);
1453 arg = -arg;
1454 if (signbit(arg))
1455 {
1456 val = scalbn(arg, 2);
1457 BOOST_CHECK_EQUAL(val, 0);
1458 BOOST_CHECK(signbit(val));
1459 }
1460 if (std::numeric_limits<T>::has_infinity)
1461 {
1462 arg = std::numeric_limits<T>::infinity();
1463 val = scalbn(arg, -100);
1464 BOOST_CHECK_EQUAL(val, arg);
1465 arg = -arg;
1466 val = scalbn(arg, -100);
1467 BOOST_CHECK_EQUAL(val, arg);
1468 }
1469 // F.9.4.1:
1470 arg = 0;
1471 val = cbrt(arg);
1472 BOOST_CHECK_EQUAL(val, 0);
1473 BOOST_CHECK(signbit(val) == 0);
1474 arg = -arg;
1475 if (signbit(arg))
1476 {
1477 val = cbrt(arg);
1478 BOOST_CHECK_EQUAL(val, 0);
1479 BOOST_CHECK(signbit(val));
1480 }
1481 #if !(defined(TEST_FLOAT128) && defined(BOOST_GCC_VERSION) && (BOOST_GCC_VERSION < 40800))
1482 //
1483 // This test fails with early implementations of libquadmath - not our issue!
1484 //
1485 if (std::numeric_limits<T>::has_infinity)
1486 {
1487 arg = std::numeric_limits<T>::infinity();
1488 val = cbrt(arg);
1489 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1490 arg = -std::numeric_limits<T>::infinity();
1491 val = cbrt(arg);
1492 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1493 }
1494 #endif
1495 if (std::numeric_limits<T>::has_quiet_NaN)
1496 {
1497 arg = std::numeric_limits<T>::quiet_NaN();
1498 check_invalid(cbrt(arg));
1499 arg = -std::numeric_limits<T>::quiet_NaN();
1500 check_invalid(cbrt(arg));
1501 }
1502 // F.9.4.2:
1503 arg = 0;
1504 val = fabs(arg);
1505 BOOST_CHECK_EQUAL(val, 0);
1506 BOOST_CHECK(signbit(val) == 0);
1507 arg = -arg;
1508 if (signbit(arg))
1509 {
1510 val = fabs(arg);
1511 BOOST_CHECK_EQUAL(val, 0);
1512 BOOST_CHECK(signbit(val) == 0);
1513 }
1514 if (std::numeric_limits<T>::has_infinity)
1515 {
1516 arg = std::numeric_limits<T>::infinity();
1517 val = fabs(arg);
1518 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1519 arg = -std::numeric_limits<T>::infinity();
1520 val = fabs(arg);
1521 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1522 }
1523 // F.9.4.3:
1524 arg = 2;
1525 arg2 = 0;
1526 val = hypot(arg, arg2);
1527 BOOST_CHECK_EQUAL(val, arg);
1528 arg2 = -arg2;
1529 val = hypot(arg, arg2);
1530 BOOST_CHECK_EQUAL(val, arg);
1531 if (std::numeric_limits<T>::has_infinity)
1532 {
1533 arg = std::numeric_limits<T>::infinity();
1534 arg2 = 2;
1535 val = hypot(arg, arg2);
1536 BOOST_CHECK_EQUAL(val, arg);
1537 arg = -arg;
1538 val = hypot(arg, arg2);
1539 BOOST_CHECK_EQUAL(val, -arg);
1540 arg2 = std::numeric_limits<T>::quiet_NaN();
1541 val = hypot(arg, arg2);
1542 BOOST_CHECK_EQUAL(val, -arg);
1543 arg = -arg;
1544 val = hypot(arg, arg2);
1545 BOOST_CHECK_EQUAL(val, arg);
1546 }
1547 // F.9.4.4:
1548 if (std::numeric_limits<T>::has_infinity)
1549 {
1550 arg = 0;
1551 arg2 = -3;
1552 val = pow(arg, arg2);
1553 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1554 check_erange(val);
1555 arg = -arg;
1556 if (signbit(arg))
1557 {
1558 val = pow(arg, arg2);
1559 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1560 check_erange(val);
1561 }
1562 arg = 0;
1563 arg2 = -2;
1564 val = pow(arg, arg2);
1565 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1566 check_erange(val);
1567 arg = -arg;
1568 if (signbit(arg))
1569 {
1570 val = pow(arg, arg2);
1571 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1572 check_erange(val);
1573 }
1574 arg = 0;
1575 arg2 = 3;
1576 val = pow(arg, arg2);
1577 BOOST_CHECK_EQUAL(val, 0);
1578 BOOST_CHECK(signbit(val) == 0);
1579 arg = -arg;
1580 if (signbit(arg))
1581 {
1582 val = pow(arg, arg2);
1583 BOOST_CHECK_EQUAL(val, 0);
1584 BOOST_CHECK(signbit(val));
1585 }
1586 arg = 0;
1587 arg2 = 2;
1588 val = pow(arg, arg2);
1589 BOOST_CHECK_EQUAL(val, 0);
1590 BOOST_CHECK(signbit(val) == 0);
1591 arg = -arg;
1592 if (signbit(arg))
1593 {
1594 val = pow(arg, arg2);
1595 BOOST_CHECK_EQUAL(val, 0);
1596 BOOST_CHECK(signbit(val) == 0);
1597 }
1598 arg = -1;
1599 arg2 = std::numeric_limits<T>::infinity();
1600 val = pow(arg, arg2);
1601 BOOST_CHECK_EQUAL(val, 1);
1602 arg2 = -std::numeric_limits<T>::infinity();
1603 val = pow(arg, arg2);
1604 BOOST_CHECK_EQUAL(val, 1);
1605 arg = 1;
1606 arg2 = 0;
1607 val = pow(arg, arg2);
1608 BOOST_CHECK_EQUAL(val, 1);
1609 arg2 = std::numeric_limits<T>::infinity();
1610 val = pow(arg, arg2);
1611 BOOST_CHECK_EQUAL(val, 1);
1612 arg2 = -std::numeric_limits<T>::infinity();
1613 val = pow(arg, arg2);
1614 BOOST_CHECK_EQUAL(val, 1);
1615 arg2 = std::numeric_limits<T>::quiet_NaN();
1616 val = pow(arg, arg2);
1617 BOOST_CHECK_EQUAL(val, 1);
1618 arg = 0;
1619 arg2 = 0;
1620 val = pow(arg, arg2);
1621 BOOST_CHECK_EQUAL(val, 1);
1622 arg2 = -arg2;
1623 val = pow(arg, arg2);
1624 BOOST_CHECK_EQUAL(val, 1);
1625 arg = std::numeric_limits<T>::infinity();
1626 val = pow(arg, arg2);
1627 BOOST_CHECK_EQUAL(val, 1);
1628 arg2 = -arg2;
1629 val = pow(arg, arg2);
1630 BOOST_CHECK_EQUAL(val, 1);
1631 arg = std::numeric_limits<T>::quiet_NaN();
1632 val = pow(arg, arg2);
1633 BOOST_CHECK_EQUAL(val, 1);
1634 arg2 = -arg2;
1635 val = pow(arg, arg2);
1636 BOOST_CHECK_EQUAL(val, 1);
1637 }
1638 if (std::numeric_limits<T>::has_quiet_NaN)
1639 {
1640 arg = -2.5;
1641 arg2 = 2.5;
1642 check_invalid(pow(arg, arg2));
1643 }
1644 if (std::numeric_limits<T>::has_infinity)
1645 {
1646 arg = 0.5;
1647 arg2 = -std::numeric_limits<T>::infinity();
1648 val = pow(arg, arg2);
1649 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1650 arg = -0.25;
1651 val = pow(arg, arg2);
1652 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1653 arg = 2.5;
1654 arg2 = -std::numeric_limits<T>::infinity();
1655 val = pow(arg, arg2);
1656 BOOST_CHECK_EQUAL(val, 0);
1657 arg = -arg;
1658 val = pow(arg, arg2);
1659 BOOST_CHECK_EQUAL(val, 0);
1660 arg = 2.5;
1661 arg2 = std::numeric_limits<T>::infinity();
1662 val = pow(arg, arg2);
1663 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1664 arg = -arg;
1665 val = pow(arg, arg2);
1666 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1667 arg = -std::numeric_limits<T>::infinity();
1668 arg2 = -3;
1669 val = pow(arg, arg2);
1670 BOOST_CHECK_EQUAL(val, 0);
1671 if (signbit(-T(0)))
1672 BOOST_CHECK(signbit(val));
1673 arg2 = -2;
1674 val = pow(arg, arg2);
1675 BOOST_CHECK_EQUAL(val, 0);
1676 BOOST_CHECK(signbit(val) == 0);
1677 arg2 = -2.5;
1678 val = pow(arg, arg2);
1679 BOOST_CHECK_EQUAL(val, 0);
1680 BOOST_CHECK(signbit(val) == 0);
1681 arg2 = 3;
1682 val = pow(arg, arg2);
1683 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1684 arg2 = 2;
1685 val = pow(arg, arg2);
1686 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1687 arg2 = 2.5;
1688 val = pow(arg, arg2);
1689 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1690 arg = -arg; // +INF
1691 arg2 = -2;
1692 val = pow(arg, arg2);
1693 BOOST_CHECK_EQUAL(val, 0);
1694 BOOST_CHECK(signbit(val) == 0);
1695 arg2 = -3;
1696 val = pow(arg, arg2);
1697 BOOST_CHECK_EQUAL(val, 0);
1698 BOOST_CHECK(signbit(val) == 0);
1699 arg2 = -3.5;
1700 val = pow(arg, arg2);
1701 BOOST_CHECK_EQUAL(val, 0);
1702 BOOST_CHECK(signbit(val) == 0);
1703 arg2 = 2;
1704 val = pow(arg, arg2);
1705 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1706 arg2 = 3;
1707 val = pow(arg, arg2);
1708 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1709 arg2 = 3.5;
1710 val = pow(arg, arg2);
1711 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1712 }
1713 // F.9.4.5:
1714 arg = 0;
1715 val = sqrt(arg);
1716 BOOST_CHECK_EQUAL(val, 0);
1717 BOOST_CHECK(signbit(val) == 0);
1718 arg = -arg;
1719 if (signbit(arg))
1720 {
1721 val = sqrt(arg);
1722 BOOST_CHECK_EQUAL(val, 0);
1723 BOOST_CHECK(signbit(val));
1724 }
1725 #if !(defined(TEST_FLOAT128) && defined(BOOST_GCC_VERSION) && (BOOST_GCC_VERSION < 40800))
1726 //
1727 // This test fails with early implementations of libquadmath - not our issue!
1728 //
1729 if (std::numeric_limits<T>::has_infinity)
1730 {
1731 arg = std::numeric_limits<T>::infinity();
1732 val = sqrt(arg);
1733 BOOST_CHECK_EQUAL(val, arg);
1734 arg = -arg;
1735 check_invalid(sqrt(arg));
1736 }
1737 #endif
1738 if (std::numeric_limits<T>::has_quiet_NaN)
1739 {
1740 arg = std::numeric_limits<T>::quiet_NaN();
1741 check_invalid(sqrt(arg));
1742 }
1743 // F.9.5.1:
1744 arg = 0;
1745 val = erf(arg);
1746 BOOST_CHECK_EQUAL(val, 0);
1747 BOOST_CHECK(signbit(val) == 0);
1748 arg = -arg;
1749 if (signbit(arg))
1750 {
1751 val = erf(arg);
1752 BOOST_CHECK_EQUAL(val, 0);
1753 BOOST_CHECK(signbit(val));
1754 }
1755 if (std::numeric_limits<T>::has_infinity)
1756 {
1757 arg = std::numeric_limits<T>::infinity();
1758 val = erf(arg);
1759 BOOST_CHECK_EQUAL(val, 1);
1760 arg = -arg;
1761 val = erf(arg);
1762 BOOST_CHECK_EQUAL(val, -1);
1763 }
1764 if (std::numeric_limits<T>::has_quiet_NaN)
1765 {
1766 arg = std::numeric_limits<T>::quiet_NaN();
1767 check_invalid(erf(arg));
1768 }
1769 // F.9.5.2:
1770 if (std::numeric_limits<T>::has_infinity)
1771 {
1772 arg = std::numeric_limits<T>::infinity();
1773 val = erfc(arg);
1774 BOOST_CHECK_EQUAL(val, 0);
1775 BOOST_CHECK(signbit(val) == 0);
1776 arg = -arg;
1777 val = erfc(arg);
1778 BOOST_CHECK_EQUAL(val, 2);
1779 }
1780 if (std::numeric_limits<T>::has_quiet_NaN)
1781 {
1782 arg = std::numeric_limits<T>::quiet_NaN();
1783 check_invalid(erfc(arg));
1784 }
1785 // F.9.5.3:
1786 arg = 1;
1787 val = lgamma(arg);
1788 BOOST_CHECK_EQUAL(val, 0);
1789 BOOST_CHECK(signbit(val) == 0);
1790 arg = 2;
1791 val = lgamma(arg);
1792 BOOST_CHECK_EQUAL(val, 0);
1793 BOOST_CHECK(signbit(val) == 0);
1794 #if !defined(BOOST_MPFR_VERSION) || (BOOST_MPFR_VERSION > 30103)
1795 arg = 0;
1796 val = lgamma(arg);
1797 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1798 check_erange(val);
1799 arg = -1;
1800 val = lgamma(arg);
1801 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1802 check_erange(val);
1803 arg = -2;
1804 val = lgamma(arg);
1805 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1806 check_erange(val);
1807 arg = -std::numeric_limits<T>::infinity();
1808 val = lgamma(arg);
1809 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1810 #endif
1811 arg = std::numeric_limits<T>::infinity();
1812 val = lgamma(arg);
1813 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1814 if (std::numeric_limits<T>::has_quiet_NaN)
1815 {
1816 arg = std::numeric_limits<T>::quiet_NaN();
1817 check_invalid(lgamma(arg));
1818 }
1819 // F.9.5.4:
1820 if (std::numeric_limits<T>::has_infinity)
1821 {
1822 arg = 0;
1823 val = tgamma(arg);
1824 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1825 check_erange(val);
1826 arg = -arg;
1827 if (signbit(arg))
1828 {
1829 val = tgamma(arg);
1830 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1831 check_erange(val);
1832 }
1833 arg = -1;
1834 check_invalid(tgamma(arg));
1835 arg = -std::numeric_limits<T>::infinity();
1836 check_invalid(tgamma(arg));
1837 arg = std::numeric_limits<T>::infinity();
1838 val = tgamma(arg);
1839 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1840 }
1841 if (std::numeric_limits<T>::has_quiet_NaN)
1842 {
1843 arg = std::numeric_limits<T>::quiet_NaN();
1844 check_invalid(tgamma(arg));
1845 }
1846 // F.9.6.1:
1847 arg = 0;
1848 val = ceil(arg);
1849 BOOST_CHECK_EQUAL(val, 0);
1850 BOOST_CHECK(signbit(val) == 0);
1851 arg = -arg;
1852 if (signbit(arg))
1853 {
1854 val = ceil(arg);
1855 BOOST_CHECK_EQUAL(val, 0);
1856 BOOST_CHECK(signbit(val));
1857 }
1858 if (std::numeric_limits<T>::has_infinity)
1859 {
1860 arg = std::numeric_limits<T>::infinity();
1861 val = ceil(arg);
1862 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1863 arg = -arg;
1864 val = ceil(arg);
1865 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1866 }
1867 if (std::numeric_limits<T>::has_quiet_NaN)
1868 {
1869 arg = std::numeric_limits<T>::quiet_NaN();
1870 check_invalid(ceil(arg));
1871 }
1872 // F.9.6.2:
1873 arg = 0;
1874 val = floor(arg);
1875 BOOST_CHECK_EQUAL(val, 0);
1876 BOOST_CHECK(signbit(val) == 0);
1877 arg = -arg;
1878 if (signbit(arg))
1879 {
1880 val = floor(arg);
1881 BOOST_CHECK_EQUAL(val, 0);
1882 BOOST_CHECK(signbit(val));
1883 }
1884 if (std::numeric_limits<T>::has_infinity)
1885 {
1886 arg = std::numeric_limits<T>::infinity();
1887 val = floor(arg);
1888 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1889 arg = -arg;
1890 val = floor(arg);
1891 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1892 }
1893 if (std::numeric_limits<T>::has_quiet_NaN)
1894 {
1895 arg = std::numeric_limits<T>::quiet_NaN();
1896 check_invalid(floor(arg));
1897 }
1898 // F.9.6.3:
1899 arg = 0;
1900 val = nearbyint(arg);
1901 BOOST_CHECK_EQUAL(val, 0);
1902 BOOST_CHECK(signbit(val) == 0);
1903 arg = -arg;
1904 if (signbit(arg))
1905 {
1906 val = nearbyint(arg);
1907 BOOST_CHECK_EQUAL(val, 0);
1908 BOOST_CHECK(signbit(val));
1909 }
1910 if (std::numeric_limits<T>::has_infinity)
1911 {
1912 arg = std::numeric_limits<T>::infinity();
1913 val = nearbyint(arg);
1914 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1915 arg = -arg;
1916 val = nearbyint(arg);
1917 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1918 }
1919 if (std::numeric_limits<T>::has_quiet_NaN)
1920 {
1921 arg = std::numeric_limits<T>::quiet_NaN();
1922 check_invalid(nearbyint(arg));
1923 }
1924 // F.9.6.4:
1925 arg = 0;
1926 val = rint(arg);
1927 BOOST_CHECK_EQUAL(val, 0);
1928 BOOST_CHECK(signbit(val) == 0);
1929 arg = -arg;
1930 if (signbit(arg))
1931 {
1932 val = rint(arg);
1933 BOOST_CHECK_EQUAL(val, 0);
1934 BOOST_CHECK(signbit(val));
1935 }
1936 if (std::numeric_limits<T>::has_infinity)
1937 {
1938 arg = std::numeric_limits<T>::infinity();
1939 val = rint(arg);
1940 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1941 arg = -arg;
1942 val = rint(arg);
1943 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1944 }
1945 if (std::numeric_limits<T>::has_quiet_NaN)
1946 {
1947 arg = std::numeric_limits<T>::quiet_NaN();
1948 check_invalid(rint(arg));
1949 }
1950 // F.9.6.6:
1951 arg = 0;
1952 val = round(arg);
1953 BOOST_CHECK_EQUAL(val, 0);
1954 BOOST_CHECK(signbit(val) == 0);
1955 arg = -arg;
1956 if (signbit(arg))
1957 {
1958 val = round(arg);
1959 BOOST_CHECK_EQUAL(val, 0);
1960 BOOST_CHECK(signbit(val));
1961 }
1962 if (std::numeric_limits<T>::has_infinity)
1963 {
1964 arg = std::numeric_limits<T>::infinity();
1965 val = round(arg);
1966 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1967 arg = -arg;
1968 val = round(arg);
1969 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1970 }
1971 if (std::numeric_limits<T>::has_quiet_NaN)
1972 {
1973 arg = std::numeric_limits<T>::quiet_NaN();
1974 check_invalid(round(arg));
1975 }
1976 // F.9.6.8:
1977 arg = 0;
1978 val = trunc(arg);
1979 BOOST_CHECK_EQUAL(val, 0);
1980 BOOST_CHECK(signbit(val) == 0);
1981 arg = -arg;
1982 if (signbit(arg))
1983 {
1984 val = trunc(arg);
1985 BOOST_CHECK_EQUAL(val, 0);
1986 BOOST_CHECK(signbit(val));
1987 }
1988 if (std::numeric_limits<T>::has_infinity)
1989 {
1990 arg = std::numeric_limits<T>::infinity();
1991 val = trunc(arg);
1992 BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
1993 arg = -arg;
1994 val = trunc(arg);
1995 BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
1996 }
1997 if (std::numeric_limits<T>::has_quiet_NaN)
1998 {
1999 arg = std::numeric_limits<T>::quiet_NaN();
2000 check_invalid(trunc(arg));
2001 }
2002 // F.9.7.1:
2003 arg = 0;
2004 arg2 = 2;
2005 val = fmod(arg, arg2);
2006 BOOST_CHECK_EQUAL(val, 0);
2007 BOOST_CHECK(signbit(val) == 0);
2008 arg = -arg;
2009 if (signbit(arg))
2010 {
2011 val = fmod(arg, arg2);
2012 BOOST_CHECK_EQUAL(val, 0);
2013 BOOST_CHECK(signbit(val));
2014 }
2015 if (std::numeric_limits<T>::has_infinity)
2016 {
2017 arg = std::numeric_limits<T>::infinity();
2018 check_invalid(fmod(arg, arg2));
2019 arg = -arg;
2020 check_invalid(fmod(arg, arg2));
2021 arg = 2;
2022 arg2 = 0;
2023 check_invalid(fmod(arg, arg2));
2024 check_invalid(fmod(arg, -arg2));
2025 }
2026 if (std::numeric_limits<T>::has_quiet_NaN)
2027 {
2028 arg = std::numeric_limits<T>::quiet_NaN();
2029 arg2 = 2;
2030 check_invalid(fmod(arg, arg2));
2031 swap(arg, arg2);
2032 check_invalid(fmod(arg, arg2));
2033 check_invalid(fmod(arg2, arg2));
2034 }
2035 //
2036 // Bugs:
2037 //
2038 int sign = 0;
2039 boost::math::lgamma(T(0.000001), &sign);
2040 BOOST_CHECK_EQUAL(sign, 1);
2041 sign = 0;
2042 boost::math::lgamma(T(0.5), &sign);
2043 BOOST_CHECK_EQUAL(sign, 1);
2044 sign = 0;
2045 boost::math::lgamma(T(0.9), &sign);
2046 BOOST_CHECK_EQUAL(sign, 1);
2047 sign = 0;
2048 boost::math::lgamma(T(1.1), &sign);
2049 BOOST_CHECK_EQUAL(sign, 1);
2050 sign = 0;
2051 boost::math::lgamma(T(1.9), &sign);
2052 BOOST_CHECK_EQUAL(sign, 1);
2053 sign = 0;
2054 boost::math::lgamma(T(2.1), &sign);
2055 BOOST_CHECK_EQUAL(sign, 1);
2056 sign = 0;
2057 boost::math::lgamma(T(20), &sign);
2058 BOOST_CHECK_EQUAL(sign, 1);
2059 sign = 0;
2060 boost::math::lgamma(T(-0.0000000000001), &sign);
2061 BOOST_CHECK_EQUAL(sign, -1);
2062 sign = 0;
2063 boost::math::lgamma(T(-0.5), &sign);
2064 BOOST_CHECK_EQUAL(sign, -1);
2065 sign = 0;
2066 boost::math::lgamma(T(-1.5), &sign);
2067 BOOST_CHECK_EQUAL(sign, 1);
2068 sign = 0;
2069 boost::math::lgamma(T(-2.5), &sign);
2070 BOOST_CHECK_EQUAL(sign, -1);
2071 sign = 0;
2072 boost::math::lgamma(T(-3.5), &sign);
2073 BOOST_CHECK_EQUAL(sign, 1);
2074 }
2075
2076 int main()
2077 {
2078 test_poison<float>();
2079 test_poison<double>();
2080 #ifdef TEST_MPF_50
2081 test<boost::multiprecision::mpf_float_50>();
2082 test<boost::multiprecision::mpf_float_100>();
2083 #endif
2084 #ifdef TEST_MPFR_50
2085 std::cout << "Testing MPFR: " << MPFR_VERSION_STRING << std::endl;
2086 test<boost::multiprecision::mpfr_float_50>();
2087 test<boost::multiprecision::mpfr_float_100>();
2088 test_c99_appendix_F<boost::multiprecision::mpfr_float_50>();
2089 #endif
2090 #ifdef TEST_MPFI_50
2091 test<boost::multiprecision::mpfi_float_50>();
2092 test<boost::multiprecision::mpfi_float_100>();
2093 #endif
2094 #ifdef TEST_CPP_DEC_FLOAT
2095 test<boost::multiprecision::cpp_dec_float_50>();
2096 #if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise
2097 test<boost::multiprecision::cpp_dec_float_100>();
2098 #endif
2099 test_c99_appendix_F<boost::multiprecision::cpp_dec_float_50>();
2100 #endif
2101 #ifdef TEST_CPP_DEC_FLOAT_2
2102 // Some "peculiar" digit counts which stress our code:
2103 test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();
2104 #if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise
2105 test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();
2106 #endif
2107 #endif
2108 #ifdef TEST_CPP_DEC_FLOAT_3
2109 test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();
2110 #if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise
2111 test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();
2112 #endif
2113 #endif
2114 #ifdef TEST_CPP_DEC_FLOAT_4
2115 test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();
2116 #if !(defined(__GNUC__) && defined(_WIN32)) // Object file too large otherwise
2117 test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();
2118 #endif
2119 #endif
2120 #ifdef TEST_CPP_DEC_FLOAT_5
2121 test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();
2122 #endif
2123 #ifdef TEST_CPP_DEC_FLOAT_6
2124 test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();
2125 #endif
2126 #ifdef TEST_CPP_BIN_FLOAT
2127 test<boost::multiprecision::cpp_bin_float_50>();
2128 test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_on> >();
2129 #endif
2130 #ifdef TEST_CPP_BIN_FLOAT_2
2131 test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >();
2132 #endif
2133 #ifdef TEST_CPP_BIN_FLOAT_3
2134 test_c99_appendix_F<boost::multiprecision::cpp_bin_float_50>();
2135 test_c99_appendix_F<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<100>, boost::multiprecision::et_on> >();
2136 #endif
2137 #ifdef TEST_FLOAT128
2138 test<boost::multiprecision::float128>();
2139 test_c99_appendix_F<boost::multiprecision::float128>();
2140 #endif
2141
2142 return boost::report_errors();
2143 }