1 ///////////////////////////////////////////////////////////////
2 // Copyright 2011 John Maddock. Distributed under the Boost
3 // Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
7 #define _SCL_SECURE_NO_WARNINGS
12 #if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_MPZ) && \
13 !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPQ) && \
14 !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT)
21 #define TEST_CPP_DEC_FLOAT
27 #define TEST_CPP_BIN_FLOAT
30 #pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
33 #pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
38 #if defined(TEST_MPF_50) || defined(TEST_MPF) || defined(TEST_MPZ) || defined(TEST_MPQ)
39 #include <boost/multiprecision/gmp.hpp>
42 #include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
44 #ifdef TEST_CPP_DEC_FLOAT
45 #include <boost/multiprecision/cpp_dec_float.hpp>
47 #if defined(TEST_MPFR) || defined(TEST_MPFR_50)
48 #include <boost/multiprecision/mpfr.hpp>
50 #if defined(TEST_MPFI_50)
51 #include <boost/multiprecision/mpfi.hpp>
54 #include <boost/multiprecision/tommath.hpp>
57 #include <boost/multiprecision/cpp_int.hpp>
60 #include <boost/multiprecision/float128.hpp>
62 #ifdef TEST_CPP_BIN_FLOAT
63 #include <boost/multiprecision/cpp_bin_float.hpp>
67 #pragma warning(disable : 4127)
71 std::cout << BOOST_STRINGIZE(x) << " = " << std::numeric_limits<Number>::x << std::endl;
73 template <class Number
>
74 void test_specific(const std::integral_constant
<int, boost::multiprecision::number_kind_floating_point
>&)
77 minv
= (std::numeric_limits
<Number
>::min
)();
78 maxv
= (std::numeric_limits
<Number
>::max
)();
79 BOOST_CHECK((boost::math::isnormal
)(minv
));
80 BOOST_CHECK((boost::math::isnormal
)(maxv
));
81 BOOST_CHECK((boost::math::isnormal
)(log(minv
)));
82 BOOST_CHECK((boost::math::isnormal
)(log(maxv
)));
83 BOOST_CHECK((boost::math::isnormal
)(sqrt(minv
)));
84 BOOST_CHECK((boost::math::isnormal
)(sqrt(maxv
)));
86 if (std::numeric_limits
<Number
>::is_specialized
)
88 if (std::numeric_limits
<Number
>::has_quiet_NaN
)
90 BOOST_TEST((boost::math::isnan
)(std::numeric_limits
<Number
>::quiet_NaN()));
91 BOOST_TEST(FP_NAN
== (boost::math::fpclassify
)(std::numeric_limits
<Number
>::quiet_NaN()));
92 BOOST_TEST(!(boost::math::isfinite
)(std::numeric_limits
<Number
>::quiet_NaN()));
93 BOOST_TEST(!(boost::math::isnormal
)(std::numeric_limits
<Number
>::quiet_NaN()));
94 BOOST_TEST(!(boost::math::isinf
)(std::numeric_limits
<Number
>::quiet_NaN()));
96 if (std::numeric_limits
<Number
>::has_signaling_NaN
)
98 BOOST_TEST((boost::math::isnan
)(std::numeric_limits
<Number
>::signaling_NaN()));
99 BOOST_TEST(FP_NAN
== (boost::math::fpclassify
)(std::numeric_limits
<Number
>::signaling_NaN()));
100 BOOST_TEST(!(boost::math::isfinite
)(std::numeric_limits
<Number
>::signaling_NaN()));
101 BOOST_TEST(!(boost::math::isnormal
)(std::numeric_limits
<Number
>::signaling_NaN()));
102 BOOST_TEST(!(boost::math::isinf
)(std::numeric_limits
<Number
>::signaling_NaN()));
104 if (std::numeric_limits
<Number
>::has_infinity
)
106 BOOST_TEST((boost::math::isinf
)(std::numeric_limits
<Number
>::infinity()));
107 BOOST_TEST(FP_INFINITE
== (boost::math::fpclassify
)(std::numeric_limits
<Number
>::infinity()));
108 BOOST_TEST(!(boost::math::isfinite
)(std::numeric_limits
<Number
>::infinity()));
109 BOOST_TEST(!(boost::math::isnormal
)(std::numeric_limits
<Number
>::infinity()));
110 BOOST_TEST(!(boost::math::isnan
)(std::numeric_limits
<Number
>::infinity()));
112 if (std::numeric_limits
<Number
>::has_denorm
== std::denorm_present
)
114 BOOST_TEST(FP_SUBNORMAL
== (boost::math::fpclassify
)(std::numeric_limits
<Number
>::denorm_min()));
115 BOOST_TEST(FP_SUBNORMAL
== (boost::math::fpclassify
)((std::numeric_limits
<Number
>::min
)() / 2));
116 BOOST_TEST((boost::math::isfinite
)(std::numeric_limits
<Number
>::denorm_min()));
117 BOOST_TEST(!(boost::math::isnormal
)(std::numeric_limits
<Number
>::denorm_min()));
118 BOOST_TEST(!(boost::math::isinf
)(std::numeric_limits
<Number
>::denorm_min()));
119 BOOST_TEST(!(boost::math::isnan
)(std::numeric_limits
<Number
>::denorm_min()));
120 BOOST_TEST(0 == std::numeric_limits
<Number
>::denorm_min() / 2);
121 BOOST_TEST(0 != (std::numeric_limits
<Number
>::min
)() / 2);
122 BOOST_TEST(0 != std::numeric_limits
<Number
>::denorm_min());
126 BOOST_TEST((boost::math::fpclassify
)(n
) == FP_ZERO
);
127 BOOST_TEST((boost::math::isfinite
)(n
));
128 BOOST_TEST(!(boost::math::isnormal
)(n
));
129 BOOST_TEST(!(boost::math::isinf
)(n
));
130 BOOST_TEST(!(boost::math::isnan
)(n
));
132 BOOST_TEST((boost::math::fpclassify
)(n
) == FP_NORMAL
);
133 BOOST_TEST((boost::math::isfinite
)(n
));
134 BOOST_TEST((boost::math::isnormal
)(n
));
135 BOOST_TEST(!(boost::math::isinf
)(n
));
136 BOOST_TEST(!(boost::math::isnan
)(n
));
138 if (std::numeric_limits
<Number
>::round_style
== std::round_to_nearest
)
140 BOOST_CHECK_EQUAL(std::numeric_limits
<Number
>::round_error(), 0.5);
142 else if (std::numeric_limits
<Number
>::round_style
!= std::round_indeterminate
)
144 // Round error is 1.0:
145 BOOST_CHECK_EQUAL(std::numeric_limits
<Number
>::round_error(), 1);
149 // Round error is presumably somewhere between 0.5 and 1:
150 BOOST_CHECK((std::numeric_limits
<Number
>::round_error() <= 1) && (std::numeric_limits
<Number
>::round_error() >= 0.5));
154 template <class Number
>
155 void test_specific(const std::integral_constant
<int, boost::multiprecision::number_kind_integer
>&)
157 if (std::numeric_limits
<Number
>::is_modulo
)
159 if (!std::numeric_limits
<Number
>::is_signed
)
161 BOOST_TEST(1 + (std::numeric_limits
<Number
>::max
)() == 0);
162 BOOST_TEST(--Number(0) == (std::numeric_limits
<Number
>::max
)());
167 template <class Number
, class T
>
168 void test_specific(const T
&)
172 template <class Number
>
175 typedef typename
std::conditional
<
176 std::numeric_limits
<Number
>::is_specialized
,
177 typename
boost::multiprecision::number_category
<Number
>::type
,
178 std::integral_constant
<int, 500> // not a number type
179 >::type fp_test_type
;
181 test_specific
<Number
>(fp_test_type());
184 // Note really a test just yet, but we can at least print out all the values:
186 std::cout
<< "numeric_limits values for type " << typeid(Number
).name() << std::endl
;
188 PRINT(is_specialized
);
189 if (std::numeric_limits
<Number
>::is_integer
)
191 std::cout
<< std::hex
<< std::showbase
;
194 << " = " << (std::numeric_limits
<Number
>::max
)() << std::endl
;
195 if (std::numeric_limits
<Number
>::is_integer
)
197 std::cout
<< std::dec
;
200 << " = " << (std::numeric_limits
<Number
>::max
)() << std::endl
;
202 << " = " << (std::numeric_limits
<Number
>::min
)() << std::endl
;
212 PRINT(round_error());
214 PRINT(min_exponent10
);
216 PRINT(max_exponent10
);
218 PRINT(has_quiet_NaN
);
219 PRINT(has_signaling_NaN
);
221 PRINT(has_denorm_loss
);
224 PRINT(signaling_NaN());
230 PRINT(tinyness_before
);
237 test
<boost::multiprecision::number
<boost::multiprecision::concepts::number_backend_float_architype
> >();
240 test
<boost::multiprecision::mpf_float_50
>();
243 boost::multiprecision::mpf_float::default_precision(1000);
245 boost::multiprecision::mpf_float r;
247 BOOST_TEST(r.precision() >= 50);
249 BOOST_TEST(boost::multiprecision::mpf_float::default_precision() == 1000);
250 test
<boost::multiprecision::mpf_float
>();
253 test
<boost::multiprecision::mpz_int
>();
256 test
<boost::multiprecision::mpq_rational
>();
258 #ifdef TEST_CPP_DEC_FLOAT
259 test
<boost::multiprecision::cpp_dec_float_50
>();
260 test
<boost::multiprecision::cpp_dec_float_100
>();
263 test
<boost::multiprecision::mpfr_float
>();
266 test
<boost::multiprecision::mpfr_float_50
>();
269 test
<boost::multiprecision::mpfi_float_50
>();
270 test
<boost::multiprecision::mpfi_float
>();
273 test
<boost::multiprecision::tom_int
>();
276 test
<boost::multiprecision::cpp_int
>();
277 test
<boost::multiprecision::int256_t
>();
278 test
<boost::multiprecision::uint512_t
>();
279 test
<boost::multiprecision::number
<boost::multiprecision::cpp_int_backend
<200, 200, boost::multiprecision::unsigned_magnitude
, boost::multiprecision::checked
, void> > >();
280 test
<boost::multiprecision::number
<boost::multiprecision::cpp_int_backend
<70, 70, boost::multiprecision::signed_magnitude
, boost::multiprecision::unchecked
, void> > >();
283 test
<boost::multiprecision::float128
>();
285 #ifdef TEST_CPP_BIN_FLOAT
286 test
<boost::multiprecision::cpp_bin_float_50
>();
288 return boost::report_errors();