1 // Copyright Paul Bristow 2007, 2011.
2 // Copyright John Maddock 2006, 2011.
4 // Use, modification and distribution are subject to the
5 // Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt
7 // or copy at http://www.boost.org/LICENSE_1_0.txt)
11 // Check values of constants are drawn from an independent source, or calculated.
12 // Both must be at long double precision for the most precise compilers floating-point implementation.
13 // So all values use static_cast<RealType>() of values at least 40 decimal digits
14 // and that have suffix L to ensure floating-point type is long double.
16 // Steve Moshier's command interpreter V1.3 100 digits calculator used for some values.
19 # pragma warning(disable : 4127) // conditional expression is constant.
22 #include <boost/math/concepts/real_concept.hpp> // for real_concept
23 #define BOOST_TEST_MAIN
24 #include <boost/test/unit_test.hpp> // Boost.Test
25 #include <boost/test/floating_point_comparison.hpp>
27 #include <boost/math/constants/constants.hpp>
28 #include <boost/math/tools/test.hpp>
29 #include <boost/static_assert.hpp>
30 #include <boost/utility/enable_if.hpp>
32 // Check at compile time that the construction method for constants of type float, is "construct from a float", or "construct from a double", ...
33 BOOST_STATIC_ASSERT((boost::is_same
<boost::math::constants::construction_traits
<float, boost::math::policies::policy
<> >::type
, boost::mpl::int_
<boost::math::constants::construct_from_float
> >::value
));
34 BOOST_STATIC_ASSERT((boost::is_same
<boost::math::constants::construction_traits
<double, boost::math::policies::policy
<> >::type
, boost::mpl::int_
<boost::math::constants::construct_from_double
> >::value
));
35 BOOST_STATIC_ASSERT((boost::is_same
<boost::math::constants::construction_traits
<long double, boost::math::policies::policy
<> >::type
, boost::mpl::int_
<(sizeof(double) == sizeof(long double) ? boost::math::constants::construct_from_double
: boost::math::constants::construct_from_long_double
)> >::value
));
36 BOOST_STATIC_ASSERT((boost::is_same
<boost::math::constants::construction_traits
<boost::math::concepts::real_concept
, boost::math::policies::policy
<> >::type
, boost::mpl::int_
<0> >::value
));
38 // Policy to set precision at maximum possible using long double.
39 typedef boost::math::policies::policy
<boost::math::policies::digits2
<std::numeric_limits
<long double>::digits
> > real_concept_policy_1
;
40 // Policy with precision +2 (could be any reasonable value),
41 // forces the precision of the policy to be greater than
42 // that of a long double, and therefore triggers different code (construct from string).
43 #ifdef BOOST_MATH_USE_FLOAT128
44 typedef boost::math::policies::policy
<boost::math::policies::digits2
<115> > real_concept_policy_2
;
46 typedef boost::math::policies::policy
<boost::math::policies::digits2
<std::numeric_limits
<long double>::digits
+ 2> > real_concept_policy_2
;
48 // Policy with precision greater than the string representations, forces computation of values (i.e. different code path):
49 typedef boost::math::policies::policy
<boost::math::policies::digits2
<400> > real_concept_policy_3
;
51 BOOST_STATIC_ASSERT((boost::is_same
<boost::math::constants::construction_traits
<boost::math::concepts::real_concept
, real_concept_policy_1
>::type
, boost::mpl::int_
<(sizeof(double) == sizeof(long double) ? boost::math::constants::construct_from_double
: boost::math::constants::construct_from_long_double
) > >::value
));
52 BOOST_STATIC_ASSERT((boost::is_same
<boost::math::constants::construction_traits
<boost::math::concepts::real_concept
, real_concept_policy_2
>::type
, boost::mpl::int_
<boost::math::constants::construct_from_string
> >::value
));
53 BOOST_STATIC_ASSERT((boost::math::constants::construction_traits
<boost::math::concepts::real_concept
, real_concept_policy_3
>::type::value
>= 5));
55 #ifndef BOOST_NO_CXX11_CONSTEXPR
57 constexpr float fval
= boost::math::constants::pi
<float>();
58 constexpr double dval
= boost::math::constants::pi
<double>();
59 constexpr long double ldval
= boost::math::constants::pi
<long double>();
61 constexpr float fval2
= boost::math::float_constants::pi
;
62 constexpr double dval2
= boost::math::double_constants::pi
;
63 constexpr long double ldval2
= boost::math::long_double_constants::pi
;
67 // We need to declare a conceptual type whose precision is unknown at
68 // compile time, and is so enormous when checked at runtime,
69 // that we're forced to calculate the values of the constants ourselves.
71 namespace boost
{ namespace math
{ namespace concepts
{
73 class big_real_concept
: public real_concept
78 big_real_concept(const T
& t
, typename enable_if
<is_convertible
<T
, real_concept
> >::type
* = 0) : real_concept(t
) {}
81 inline int itrunc(const big_real_concept
& val
)
84 return itrunc(val
.value());
91 inline BOOST_MATH_CONSTEXPR
int digits
<concepts::big_real_concept
>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T
)) BOOST_NOEXCEPT
93 return 2 * boost::math::constants::max_string_digits
;
98 template <class RealType
>
99 void test_spots(RealType
)
101 // Basic sanity checks for constants,
102 // where template parameter RealType can be float, double, long double,
103 // or real_concept, a prototype for user-defined floating-point types.
105 // Parameter RealType is only used to communicate the RealType,
106 // and is an arbitrary zero for all tests.
108 // Actual tolerance is never really smaller than epsilon for long double,
109 // because it's just a wrapper around a long double,
110 // so although it's pretending to be something else (in order to exercise our code),
111 // it can never really have precision greater than a long double.
113 typedef typename
boost::math::constants::construction_traits
<RealType
, boost::math::policies::policy
<> >::type construction_type
;
114 RealType tolerance
= (std::max
)(static_cast<RealType
>(boost::math::tools::epsilon
<long double>()), boost::math::tools::epsilon
<RealType
>()) * 2; // double
115 if((construction_type::value
== 0) && (boost::math::tools::digits
<RealType
>() > boost::math::constants::max_string_digits
))
116 tolerance
*= 30; // Allow a little extra tolerance
117 // for calculated (perhaps using a series representation) constants.
118 std::cout
<< "Tolerance for type " << typeid(RealType
).name() << " is " << tolerance
<< "." << std::endl
;
120 //typedef typename boost::math::policies::precision<RealType, boost::math::policies::policy<> >::type t1;
121 // A precision of zero means we don't know what the precision of this type is until runtime.
122 //std::cout << "Precision for type " << typeid(RealType).name() << " is " << t1::value << "." << std::endl;
124 using namespace boost::math::constants
;
127 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L, pi
<RealType
>(), tolerance
);
128 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L), root_pi
<RealType
>(), tolerance
);
129 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L/2), root_half_pi
<RealType
>(), tolerance
);
130 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L * 2), root_two_pi
<RealType
>(), tolerance
);
131 BOOST_CHECK_CLOSE_FRACTION(sqrt(log(4.0L)), root_ln_four
<RealType
>(), tolerance
);
132 BOOST_CHECK_CLOSE_FRACTION(2.71828182845904523536028747135266249775724709369995L, e
<RealType
>(), tolerance
);
133 BOOST_CHECK_CLOSE_FRACTION(0.5L, half
<RealType
>(), tolerance
);
134 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104259335L, euler
<RealType
>(), tolerance
);
135 BOOST_CHECK_CLOSE_FRACTION(sqrt(2.0L), root_two
<RealType
>(), tolerance
);
136 BOOST_CHECK_CLOSE_FRACTION(log(2.0L), ln_two
<RealType
>(), tolerance
);
137 BOOST_CHECK_CLOSE_FRACTION(log(10.0L), ln_ten
<RealType
>(), tolerance
);
138 BOOST_CHECK_CLOSE_FRACTION(log(log(2.0L)), ln_ln_two
<RealType
>(), tolerance
);
140 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(1)/3, third
<RealType
>(), tolerance
);
141 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(2)/3, twothirds
<RealType
>(), tolerance
);
142 BOOST_CHECK_CLOSE_FRACTION(0.14159265358979323846264338327950288419716939937510L, pi_minus_three
<RealType
>(), tolerance
);
143 BOOST_CHECK_CLOSE_FRACTION(4.L
- 3.14159265358979323846264338327950288419716939937510L, four_minus_pi
<RealType
>(), tolerance
);
144 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
145 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510L), 2.71828182845904523536028747135266249775724709369995L), pi_pow_e
<RealType
>(), tolerance
);
146 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510L), 0.33333333333333333333333333333333333333333333333333L), cbrt_pi
<RealType
>(), tolerance
);
147 BOOST_CHECK_CLOSE_FRACTION(exp(-0.5L), exp_minus_half
<RealType
>(), tolerance
);
148 BOOST_CHECK_CLOSE_FRACTION(pow(2.71828182845904523536028747135266249775724709369995L, 3.14159265358979323846264338327950288419716939937510L), e_pow_pi
<RealType
>(), tolerance
);
151 #else // Only double, so no suffix L.
152 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510), 2.71828182845904523536028747135266249775724709369995), pi_pow_e
<RealType
>(), tolerance
);
153 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510), 0.33333333333333333333333333333333333333333333333333), cbrt_pi
<RealType
>(), tolerance
);
154 BOOST_CHECK_CLOSE_FRACTION(exp(-0.5), exp_minus_half
<RealType
>(), tolerance
);
156 // Rational fractions.
157 BOOST_CHECK_CLOSE_FRACTION(0.333333333333333333333333333333333333333L, third
<RealType
>(), tolerance
);
158 BOOST_CHECK_CLOSE_FRACTION(0.666666666666666666666666666666666666667L, two_thirds
<RealType
>(), tolerance
);
159 BOOST_CHECK_CLOSE_FRACTION(0.75L, three_quarters
<RealType
>(), tolerance
);
161 BOOST_CHECK_CLOSE_FRACTION(sqrt(2.L
), root_two
<RealType
>(), tolerance
);
162 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.L
), root_three
<RealType
>(), tolerance
);
163 BOOST_CHECK_CLOSE_FRACTION(sqrt(2.L
)/2, half_root_two
<RealType
>(), tolerance
);
164 BOOST_CHECK_CLOSE_FRACTION(log(2.L
), ln_two
<RealType
>(), tolerance
);
165 BOOST_CHECK_CLOSE_FRACTION(log(log(2.0L)), ln_ln_two
<RealType
>(), tolerance
);
166 BOOST_CHECK_CLOSE_FRACTION(sqrt(log(4.0L)), root_ln_four
<RealType
>(), tolerance
);
167 BOOST_CHECK_CLOSE_FRACTION(1/sqrt(2.0L), one_div_root_two
<RealType
>(), tolerance
);
170 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L, pi
<RealType
>(), tolerance
);
171 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L/2, half_pi
<RealType
>(), tolerance
);
172 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L/3, third_pi
<RealType
>(), tolerance
);
173 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L/6, sixth_pi
<RealType
>(), tolerance
);
174 BOOST_CHECK_CLOSE_FRACTION(2 * 3.14159265358979323846264338327950288419716939937510L, two_pi
<RealType
>(), tolerance
);
175 BOOST_CHECK_CLOSE_FRACTION(3 * 3.14159265358979323846264338327950288419716939937510L / 4, three_quarters_pi
<RealType
>(), tolerance
);
176 BOOST_CHECK_CLOSE_FRACTION(4 * 3.14159265358979323846264338327950288419716939937510L / 3, four_thirds_pi
<RealType
>(), tolerance
);
177 BOOST_CHECK_CLOSE_FRACTION(1 / (2 * 3.14159265358979323846264338327950288419716939937510L), one_div_two_pi
<RealType
>(), tolerance
);
178 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L), root_pi
<RealType
>(), tolerance
);
179 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L / 2), root_half_pi
<RealType
>(), tolerance
);
180 BOOST_CHECK_CLOSE_FRACTION(sqrt(2 * 3.14159265358979323846264338327950288419716939937510L), root_two_pi
<RealType
>(), tolerance
);
181 BOOST_CHECK_CLOSE_FRACTION(1 / sqrt(3.14159265358979323846264338327950288419716939937510L), one_div_root_pi
<RealType
>(), tolerance
);
182 BOOST_CHECK_CLOSE_FRACTION(1 / sqrt(2 * 3.14159265358979323846264338327950288419716939937510L), one_div_root_two_pi
<RealType
>(), tolerance
);
183 BOOST_CHECK_CLOSE_FRACTION(sqrt(1. / 3.14159265358979323846264338327950288419716939937510L), root_one_div_pi
<RealType
>(), tolerance
);
184 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L - 3.L
, pi_minus_three
<RealType
>(), tolerance
* 4 ); // tolerance * 2 because of cancellation loss.
185 BOOST_CHECK_CLOSE_FRACTION(4.L
- 3.14159265358979323846264338327950288419716939937510L, four_minus_pi
<RealType
>(), tolerance
);
187 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510L), 2.71828182845904523536028747135266249775724709369995L), pi_pow_e
<RealType
>(), tolerance
); // See above.
188 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L, pi_sqr
<RealType
>(), tolerance
); // See above.
189 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L/6, pi_sqr_div_six
<RealType
>(), tolerance
); // See above.
190 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L, pi_cubed
<RealType
>(), tolerance
); // See above.
192 // BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L, cbrt_pi<RealType>(), tolerance); // See above.
193 BOOST_CHECK_CLOSE_FRACTION(cbrt_pi
<RealType
>() * cbrt_pi
<RealType
>() * cbrt_pi
<RealType
>(), pi
<RealType
>(), tolerance
);
194 BOOST_CHECK_CLOSE_FRACTION((1)/cbrt_pi
<RealType
>(), one_div_cbrt_pi
<RealType
>(), tolerance
);
197 BOOST_CHECK_CLOSE_FRACTION(2.71828182845904523536028747135266249775724709369995L, e
<RealType
>(), tolerance
);
199 //BOOST_CHECK_CLOSE_FRACTION(exp(-0.5L), exp_minus_half<RealType>(), tolerance); // See above.
200 BOOST_CHECK_CLOSE_FRACTION(pow(e
<RealType
>(), pi
<RealType
>()), e_pow_pi
<RealType
>(), tolerance
); // See also above.
201 BOOST_CHECK_CLOSE_FRACTION(sqrt(e
<RealType
>()), root_e
<RealType
>(), tolerance
);
202 BOOST_CHECK_CLOSE_FRACTION(log10(e
<RealType
>()), log10_e
<RealType
>(), tolerance
);
203 BOOST_CHECK_CLOSE_FRACTION(1/log10(e
<RealType
>()), one_div_log10_e
<RealType
>(), tolerance
);
206 BOOST_CHECK_CLOSE_FRACTION(pi
<RealType
>()/180, degree
<RealType
>(), tolerance
);
207 BOOST_CHECK_CLOSE_FRACTION(180 / pi
<RealType
>(), radian
<RealType
>(), tolerance
);
208 BOOST_CHECK_CLOSE_FRACTION(sin(1.L
), sin_one
<RealType
>(), tolerance
);
209 BOOST_CHECK_CLOSE_FRACTION(cos(1.L
), cos_one
<RealType
>(), tolerance
);
210 BOOST_CHECK_CLOSE_FRACTION(sinh(1.L
), sinh_one
<RealType
>(), tolerance
);
211 BOOST_CHECK_CLOSE_FRACTION(cosh(1.L
), cosh_one
<RealType
>(), tolerance
);
214 BOOST_CHECK_CLOSE_FRACTION((1.L
+ sqrt(5.L
)) /2, phi
<RealType
>(), tolerance
);
215 BOOST_CHECK_CLOSE_FRACTION(log((1.L
+ sqrt(5.L
)) /2), ln_phi
<RealType
>(), tolerance
);
216 BOOST_CHECK_CLOSE_FRACTION(1.L
/ log((1.L
+ sqrt(5.L
)) /2), one_div_ln_phi
<RealType
>(), tolerance
);
219 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992L, euler
<RealType
>(), tolerance
); // (sequence A001620 in OEIS).
220 BOOST_CHECK_CLOSE_FRACTION(1.L
/ 0.57721566490153286060651209008240243104215933593992L, one_div_euler
<RealType
>(), tolerance
); // (from sequence A001620 in OEIS).
221 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992L * 0.57721566490153286060651209008240243104215933593992L, euler_sqr
<RealType
>(), tolerance
); // (from sequence A001620 in OEIS).
224 BOOST_CHECK_CLOSE_FRACTION(1.644934066848226436472415166646025189218949901206L, zeta_two
<RealType
>(), tolerance
); // A013661 as a constant (usually base 10) in OEIS.
225 BOOST_CHECK_CLOSE_FRACTION(1.20205690315959428539973816151144999076498629234049888179227L, zeta_three
<RealType
>(), tolerance
); // (sequence A002117 in OEIS)
226 BOOST_CHECK_CLOSE_FRACTION(.91596559417721901505460351493238411077414937428167213L, catalan
<RealType
>(), tolerance
); // A006752 as a constant in OEIS.
227 BOOST_CHECK_CLOSE_FRACTION(1.1395470994046486574927930193898461120875997958365518247216557100852480077060706857071875468869385150L, extreme_value_skewness
<RealType
>(), tolerance
); // Mathematica: N[12 Sqrt[6] Zeta[3]/Pi^3, 1101]
228 BOOST_CHECK_CLOSE_FRACTION(0.6311106578189371381918993515442277798440422031347194976580945856929268196174737254599050270325373067L, rayleigh_skewness
<RealType
>(), tolerance
); // Mathematica: N[2 Sqrt[Pi] (Pi - 3)/((4 - Pi)^(3/2)), 1100]
229 BOOST_CHECK_CLOSE_FRACTION(2.450893006876380628486604106197544154e-01L, rayleigh_kurtosis_excess
<RealType
>(), tolerance
* 2);
230 BOOST_CHECK_CLOSE_FRACTION(2.68545200106530644530971483548179569382038229399446295305115234555721885953715200280114117493184769799515L, khinchin
<RealType
>(), tolerance
); // A002210 as a constant https://oeis.org/A002210/constant
231 BOOST_CHECK_CLOSE_FRACTION(1.2824271291006226368753425688697917277676889273250011L, glaisher
<RealType
>(), tolerance
); // https://oeis.org/A074962/constant
234 // Last of all come the test cases that behave differently if we're calculating the constants on the fly:
236 if(boost::math::tools::digits
<RealType
>() > boost::math::constants::max_string_digits
)
238 // This suffers from cancellation error, so increased tolerance:
239 BOOST_CHECK_CLOSE_FRACTION(static_cast<RealType
>(4. - 3.14159265358979323846264338327950288419716939937510L), four_minus_pi
<RealType
>(), tolerance
* 3);
240 BOOST_CHECK_CLOSE_FRACTION(static_cast<RealType
>(0.14159265358979323846264338327950288419716939937510L), pi_minus_three
<RealType
>(), tolerance
* 3);
244 BOOST_CHECK_CLOSE_FRACTION(static_cast<RealType
>(4. - 3.14159265358979323846264338327950288419716939937510L), four_minus_pi
<RealType
>(), tolerance
);
245 BOOST_CHECK_CLOSE_FRACTION(static_cast<RealType
>(0.14159265358979323846264338327950288419716939937510L), pi_minus_three
<RealType
>(), tolerance
);
247 } // template <class RealType>void test_spots(RealType)
249 void test_float_spots()
251 // Basic sanity checks for constants in boost::math::float_constants::
252 // for example: boost::math::float_constants::pi
253 // (rather than boost::math::constants::pi<float>() ).
255 float tolerance
= boost::math::tools::epsilon
<float>() * 2;
257 using namespace boost::math::float_constants
;
260 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510F
), pi
, tolerance
);
261 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(3.14159265358979323846264338327950288419716939937510F
)), root_pi
, tolerance
);
262 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(3.14159265358979323846264338327950288419716939937510F
/2)), root_half_pi
, tolerance
);
263 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(3.14159265358979323846264338327950288419716939937510F
* 2)), root_two_pi
, tolerance
);
264 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(log(4.0F
))), root_ln_four
, tolerance
);
265 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(2.71828182845904523536028747135266249775724709369995F
), e
, tolerance
);
266 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(0.5), half
, tolerance
);
267 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(0.57721566490153286060651209008240243104259335F
), euler
, tolerance
);
268 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(2.0F
)), root_two
, tolerance
);
269 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(log(2.0F
)), ln_two
, tolerance
);
270 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(log(log(2.0F
))), ln_ln_two
, tolerance
);
271 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(1)/3, third
, tolerance
);
272 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(2)/3, twothirds
, tolerance
);
273 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(0.14159265358979323846264338327950288419716939937510F
), pi_minus_three
, tolerance
);
274 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(4.F
- 3.14159265358979323846264338327950288419716939937510F
), four_minus_pi
, tolerance
);
275 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
276 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(pow((3.14159265358979323846264338327950288419716939937510F
), 2.71828182845904523536028747135266249775724709369995F
)), pi_pow_e
, tolerance
);
277 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(pow((3.14159265358979323846264338327950288419716939937510F
), 0.33333333333333333333333333333333333333333333333333F
)), cbrt_pi
, tolerance
);
278 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(exp(-0.5F
)), exp_minus_half
, tolerance
);
279 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(pow(2.71828182845904523536028747135266249775724709369995F
, 3.14159265358979323846264338327950288419716939937510F
)), e_pow_pi
, tolerance
);
282 #else // Only double, so no suffix F.
283 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(pow((3.14159265358979323846264338327950288419716939937510), 2.71828182845904523536028747135266249775724709369995)), pi_pow_e
, tolerance
);
284 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(pow((3.14159265358979323846264338327950288419716939937510), 0.33333333333333333333333333333333333333333333333333)), cbrt_pi
, tolerance
);
285 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(exp(-0.5)), exp_minus_half
, tolerance
);
287 // Rational fractions.
288 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(0.333333333333333333333333333333333333333F
), third
, tolerance
);
289 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(0.666666666666666666666666666666666666667F
), two_thirds
, tolerance
);
290 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(0.75F
), three_quarters
, tolerance
);
292 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(2.F
)), root_two
, tolerance
);
293 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(3.F
)), root_three
, tolerance
);
294 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(2.F
)/2), half_root_two
, tolerance
);
295 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(log(2.F
)), ln_two
, tolerance
);
296 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(log(log(2.0F
))), ln_ln_two
, tolerance
);
297 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(log(4.0F
))), root_ln_four
, tolerance
);
298 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(1/sqrt(2.0F
)), one_div_root_two
, tolerance
);
301 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510F
), pi
, tolerance
);
302 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510F
/2), half_pi
, tolerance
);
303 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510F
/3), third_pi
, tolerance
);
304 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510F
/6), sixth_pi
, tolerance
);
305 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(2 * 3.14159265358979323846264338327950288419716939937510F
), two_pi
, tolerance
);
306 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3 * 3.14159265358979323846264338327950288419716939937510F
/ 4), three_quarters_pi
, tolerance
);
307 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(4 * 3.14159265358979323846264338327950288419716939937510F
/ 3), four_thirds_pi
, tolerance
);
308 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(1 / (2 * 3.14159265358979323846264338327950288419716939937510F
)), one_div_two_pi
, tolerance
);
309 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(3.14159265358979323846264338327950288419716939937510F
)), root_pi
, tolerance
);
310 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(3.14159265358979323846264338327950288419716939937510F
/ 2)), root_half_pi
, tolerance
);
311 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(2 * 3.14159265358979323846264338327950288419716939937510F
)), root_two_pi
, tolerance
);
312 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(1 / sqrt(3.14159265358979323846264338327950288419716939937510F
)), one_div_root_pi
, tolerance
);
313 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(1 / sqrt(2 * 3.14159265358979323846264338327950288419716939937510F
)), one_div_root_two_pi
, tolerance
);
314 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(sqrt(1. / 3.14159265358979323846264338327950288419716939937510F
)), root_one_div_pi
, tolerance
);
315 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510L - 3.L
), pi_minus_three
, tolerance
* 2 ); // tolerance * 2 because of cancellation loss.
316 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(4.L
- 3.14159265358979323846264338327950288419716939937510L), four_minus_pi
, tolerance
);
318 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(pow((3.14159265358979323846264338327950288419716939937510F
), 2.71828182845904523536028747135266249775724709369995F
)), pi_pow_e
, tolerance
); // See above.
319 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510F
* 3.14159265358979323846264338327950288419716939937510F
), pi_sqr
, tolerance
); // See above.
320 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510F
* 3.14159265358979323846264338327950288419716939937510F
/6), pi_sqr_div_six
, tolerance
); // See above.
321 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510F
* 3.14159265358979323846264338327950288419716939937510F
* 3.14159265358979323846264338327950288419716939937510F
), pi_cubed
, tolerance
); // See above.
323 // BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(3.14159265358979323846264338327950288419716939937510F * 3.14159265358979323846264338327950288419716939937510F), cbrt_pi, tolerance); // See above.
324 BOOST_CHECK_CLOSE_FRACTION(cbrt_pi
* cbrt_pi
* cbrt_pi
, pi
, tolerance
);
325 BOOST_CHECK_CLOSE_FRACTION((static_cast<float>(1)/cbrt_pi
), one_div_cbrt_pi
, tolerance
);
328 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(2.71828182845904523536028747135266249775724709369995F
), e
, tolerance
);
330 //BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(exp(-0.5F)), exp_minus_half, tolerance); // See above.
331 BOOST_CHECK_CLOSE_FRACTION(pow(e
, pi
), e_pow_pi
, tolerance
); // See also above.
332 BOOST_CHECK_CLOSE_FRACTION(sqrt(e
), root_e
, tolerance
);
333 BOOST_CHECK_CLOSE_FRACTION(log10(e
), log10_e
, tolerance
);
334 BOOST_CHECK_CLOSE_FRACTION(static_cast<float>(1)/log10(e
), one_div_log10_e
, tolerance
);
337 BOOST_CHECK_CLOSE_FRACTION(pi
/180, degree
, tolerance
);
338 BOOST_CHECK_CLOSE_FRACTION(180 / pi
, radian
, tolerance
);
339 BOOST_CHECK_CLOSE_FRACTION(sin(1.F
), sin_one
, tolerance
);
340 BOOST_CHECK_CLOSE_FRACTION(cos(1.F
), cos_one
, tolerance
);
341 BOOST_CHECK_CLOSE_FRACTION(sinh(1.F
), sinh_one
, tolerance
);
342 BOOST_CHECK_CLOSE_FRACTION(cosh(1.F
), cosh_one
, tolerance
);
345 BOOST_CHECK_CLOSE_FRACTION((1.F
+ sqrt(5.F
)) /2, phi
, tolerance
);
346 BOOST_CHECK_CLOSE_FRACTION(log((1.F
+ sqrt(5.F
)) /2), ln_phi
, tolerance
);
347 BOOST_CHECK_CLOSE_FRACTION(1.F
/ log((1.F
+ sqrt(5.F
)) /2), one_div_ln_phi
, tolerance
);
350 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992F
, euler
, tolerance
); // (sequence A001620 in OEIS).
351 BOOST_CHECK_CLOSE_FRACTION(1.F
/ 0.57721566490153286060651209008240243104215933593992F
, one_div_euler
, tolerance
); // (from sequence A001620 in OEIS).
352 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992F
* 0.57721566490153286060651209008240243104215933593992F
, euler_sqr
, tolerance
); // (from sequence A001620 in OEIS).
355 BOOST_CHECK_CLOSE_FRACTION(1.644934066848226436472415166646025189218949901206F
, zeta_two
, tolerance
); // A013661 as a constant (usually base 10) in OEIS.
356 BOOST_CHECK_CLOSE_FRACTION(1.20205690315959428539973816151144999076498629234049888179227F
, zeta_three
, tolerance
); // (sequence A002117 in OEIS)
357 BOOST_CHECK_CLOSE_FRACTION(.91596559417721901505460351493238411077414937428167213F
, catalan
, tolerance
); // A006752 as a constant in OEIS.
358 BOOST_CHECK_CLOSE_FRACTION(1.1395470994046486574927930193898461120875997958365518247216557100852480077060706857071875468869385150F
, extreme_value_skewness
, tolerance
); // Mathematica: N[12 Sqrt[6] Zeta[3]/Pi^3, 1101]
359 BOOST_CHECK_CLOSE_FRACTION(0.6311106578189371381918993515442277798440422031347194976580945856929268196174737254599050270325373067F
, rayleigh_skewness
, tolerance
); // Mathematica: N[2 Sqrt[Pi] (Pi - 3)/((4 - Pi)^(3/2)), 1100]
360 BOOST_CHECK_CLOSE_FRACTION(2.450893006876380628486604106197544154e-01F
, rayleigh_kurtosis_excess
, tolerance
);
361 BOOST_CHECK_CLOSE_FRACTION(2.68545200106530644530971483548179569382038229399446295305115234555721885953715200280114117493184769799515F
, khinchin
, tolerance
); // A002210 as a constant https://oeis.org/A002210/constant
362 BOOST_CHECK_CLOSE_FRACTION(1.2824271291006226368753425688697917277676889273250011F
, glaisher
, tolerance
); // https://oeis.org/A074962/constant
364 } // template <class RealType>void test_spots(RealType)
366 void test_double_spots()
368 // Basic sanity checks for constants in boost::math::double_constants::
369 // for example: boost::math::double_constants::pi
370 // (rather than boost::math::constants::pi<double>() ).
372 double tolerance
= boost::math::tools::epsilon
<double>() * 2;
374 using namespace boost::math::double_constants
;
377 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510), pi
, tolerance
);
378 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(3.14159265358979323846264338327950288419716939937510)), root_pi
, tolerance
);
379 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(3.14159265358979323846264338327950288419716939937510/2)), root_half_pi
, tolerance
);
380 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(3.14159265358979323846264338327950288419716939937510 * 2)), root_two_pi
, tolerance
);
381 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(log(4.0))), root_ln_four
, tolerance
);
382 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(2.71828182845904523536028747135266249775724709369995), e
, tolerance
);
383 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(0.5), half
, tolerance
);
384 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(0.57721566490153286060651209008240243104259335), euler
, tolerance
);
385 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(2.0)), root_two
, tolerance
);
386 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(log(2.0)), ln_two
, tolerance
);
387 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(log(log(2.0))), ln_ln_two
, tolerance
);
388 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(1)/3, third
, tolerance
);
389 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(2)/3, twothirds
, tolerance
);
390 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(0.14159265358979323846264338327950288419716939937510), pi_minus_three
, tolerance
);
391 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(4. - 3.14159265358979323846264338327950288419716939937510), four_minus_pi
, tolerance
);
392 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
393 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(pow((3.14159265358979323846264338327950288419716939937510), 2.71828182845904523536028747135266249775724709369995)), pi_pow_e
, tolerance
);
394 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(pow((3.14159265358979323846264338327950288419716939937510), 0.33333333333333333333333333333333333333333333333333)), cbrt_pi
, tolerance
);
395 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(exp(-0.5)), exp_minus_half
, tolerance
);
396 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(pow(2.71828182845904523536028747135266249775724709369995, 3.14159265358979323846264338327950288419716939937510)), e_pow_pi
, tolerance
);
399 #else // Only double, so no suffix .
400 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(pow((3.14159265358979323846264338327950288419716939937510), 2.71828182845904523536028747135266249775724709369995)), pi_pow_e
, tolerance
);
401 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(pow((3.14159265358979323846264338327950288419716939937510), 0.33333333333333333333333333333333333333333333333333)), cbrt_pi
, tolerance
);
402 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(exp(-0.5)), exp_minus_half
, tolerance
);
404 // Rational fractions.
405 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(0.333333333333333333333333333333333333333), third
, tolerance
);
406 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(0.666666666666666666666666666666666666667), two_thirds
, tolerance
);
407 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(0.75), three_quarters
, tolerance
);
409 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(2.)), root_two
, tolerance
);
410 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(3.)), root_three
, tolerance
);
411 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(2.)/2), half_root_two
, tolerance
);
412 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(log(2.)), ln_two
, tolerance
);
413 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(log(log(2.0))), ln_ln_two
, tolerance
);
414 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(log(4.0))), root_ln_four
, tolerance
);
415 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(1/sqrt(2.0)), one_div_root_two
, tolerance
);
418 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510), pi
, tolerance
);
419 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510/2), half_pi
, tolerance
);
420 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510/3), third_pi
, tolerance
);
421 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510/6), sixth_pi
, tolerance
);
422 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(2 * 3.14159265358979323846264338327950288419716939937510), two_pi
, tolerance
);
423 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3 * 3.14159265358979323846264338327950288419716939937510 / 4), three_quarters_pi
, tolerance
);
424 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(4 * 3.14159265358979323846264338327950288419716939937510 / 3), four_thirds_pi
, tolerance
);
425 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(1 / (2 * 3.14159265358979323846264338327950288419716939937510)), one_div_two_pi
, tolerance
);
426 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(3.14159265358979323846264338327950288419716939937510)), root_pi
, tolerance
);
427 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(3.14159265358979323846264338327950288419716939937510 / 2)), root_half_pi
, tolerance
);
428 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(2 * 3.14159265358979323846264338327950288419716939937510)), root_two_pi
, tolerance
);
429 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(1 / sqrt(3.14159265358979323846264338327950288419716939937510)), one_div_root_pi
, tolerance
);
430 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(1 / sqrt(2 * 3.14159265358979323846264338327950288419716939937510)), one_div_root_two_pi
, tolerance
);
431 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(sqrt(1. / 3.14159265358979323846264338327950288419716939937510)), root_one_div_pi
, tolerance
);
432 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510 - 3.), pi_minus_three
, tolerance
* 2 ); // tolerance * 2 because of cancellation loss.
433 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(4. - 3.14159265358979323846264338327950288419716939937510), four_minus_pi
, tolerance
);
435 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(pow((3.14159265358979323846264338327950288419716939937510), 2.71828182845904523536028747135266249775724709369995)), pi_pow_e
, tolerance
); // See above.
436 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510 * 3.14159265358979323846264338327950288419716939937510), pi_sqr
, tolerance
); // See above.
437 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510 * 3.14159265358979323846264338327950288419716939937510/6), pi_sqr_div_six
, tolerance
); // See above.
438 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510 * 3.14159265358979323846264338327950288419716939937510 * 3.14159265358979323846264338327950288419716939937510), pi_cubed
, tolerance
); // See above.
440 // BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(3.14159265358979323846264338327950288419716939937510 * 3.14159265358979323846264338327950288419716939937510), cbrt_pi, tolerance); // See above.
441 BOOST_CHECK_CLOSE_FRACTION(cbrt_pi
* cbrt_pi
* cbrt_pi
, pi
, tolerance
);
442 BOOST_CHECK_CLOSE_FRACTION((static_cast<double>(1)/cbrt_pi
), one_div_cbrt_pi
, tolerance
);
445 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(2.71828182845904523536028747135266249775724709369995), e
, tolerance
);
447 //BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(exp(-0.5)), exp_minus_half, tolerance); // See above.
448 BOOST_CHECK_CLOSE_FRACTION(pow(e
, pi
), e_pow_pi
, tolerance
); // See also above.
449 BOOST_CHECK_CLOSE_FRACTION(sqrt(e
), root_e
, tolerance
);
450 BOOST_CHECK_CLOSE_FRACTION(log10(e
), log10_e
, tolerance
);
451 BOOST_CHECK_CLOSE_FRACTION(static_cast<double>(1)/log10(e
), one_div_log10_e
, tolerance
);
454 BOOST_CHECK_CLOSE_FRACTION(pi
/180, degree
, tolerance
);
455 BOOST_CHECK_CLOSE_FRACTION(180 / pi
, radian
, tolerance
);
456 BOOST_CHECK_CLOSE_FRACTION(sin(1.), sin_one
, tolerance
);
457 BOOST_CHECK_CLOSE_FRACTION(cos(1.), cos_one
, tolerance
);
458 BOOST_CHECK_CLOSE_FRACTION(sinh(1.), sinh_one
, tolerance
);
459 BOOST_CHECK_CLOSE_FRACTION(cosh(1.), cosh_one
, tolerance
);
462 BOOST_CHECK_CLOSE_FRACTION((1. + sqrt(5.)) /2, phi
, tolerance
);
463 BOOST_CHECK_CLOSE_FRACTION(log((1. + sqrt(5.)) /2), ln_phi
, tolerance
);
464 BOOST_CHECK_CLOSE_FRACTION(1. / log((1. + sqrt(5.)) /2), one_div_ln_phi
, tolerance
);
467 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992, euler
, tolerance
); // (sequence A001620 in OEIS).
468 BOOST_CHECK_CLOSE_FRACTION(1./ 0.57721566490153286060651209008240243104215933593992, one_div_euler
, tolerance
); // (from sequence A001620 in OEIS).
469 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992 * 0.57721566490153286060651209008240243104215933593992, euler_sqr
, tolerance
); // (from sequence A001620 in OEIS).
472 BOOST_CHECK_CLOSE_FRACTION(1.644934066848226436472415166646025189218949901206, zeta_two
, tolerance
); // A013661 as a constant (usually base 10) in OEIS.
473 BOOST_CHECK_CLOSE_FRACTION(1.20205690315959428539973816151144999076498629234049888179227, zeta_three
, tolerance
); // (sequence A002117 in OEIS)
474 BOOST_CHECK_CLOSE_FRACTION(.91596559417721901505460351493238411077414937428167213, catalan
, tolerance
); // A006752 as a constant in OEIS.
475 BOOST_CHECK_CLOSE_FRACTION(1.1395470994046486574927930193898461120875997958365518247216557100852480077060706857071875468869385150, extreme_value_skewness
, tolerance
); // Mathematica: N[12 Sqrt[6] Zeta[3]/Pi^3, 1101]
476 BOOST_CHECK_CLOSE_FRACTION(0.6311106578189371381918993515442277798440422031347194976580945856929268196174737254599050270325373067, rayleigh_skewness
, tolerance
); // Mathematica: N[2 Sqrt[Pi] (Pi - 3)/((4 - Pi)^(3/2)), 1100]
477 BOOST_CHECK_CLOSE_FRACTION(2.450893006876380628486604106197544154e-01, rayleigh_kurtosis_excess
, tolerance
);
478 BOOST_CHECK_CLOSE_FRACTION(2.68545200106530644530971483548179569382038229399446295305115234555721885953715200280114117493184769799515, khinchin
, tolerance
); // A002210 as a constant https://oeis.org/A002210/constant
479 BOOST_CHECK_CLOSE_FRACTION(1.2824271291006226368753425688697917277676889273250011, glaisher
, tolerance
); // https://oeis.org/A074962/constant
481 } // template <class RealType>void test_spots(RealType)
483 void test_long_double_spots()
485 // Basic sanity checks for constants in boost::math::long double_constants::
486 // for example: boost::math::long_double_constants::pi
487 // (rather than boost::math::constants::pi<long double>() ).
489 // All constants are tested here using at least long double precision
490 // with independent calculated or listed values,
491 // or calculations using long double (sometime a little less accurate).
493 long double tolerance
= boost::math::tools::epsilon
<long double>() * 2;
495 using namespace boost::math::long_double_constants
;
498 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L), pi
, tolerance
);
499 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(3.14159265358979323846264338327950288419716939937510L)), root_pi
, tolerance
);
500 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(3.14159265358979323846264338327950288419716939937510L/2)), root_half_pi
, tolerance
);
501 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(3.14159265358979323846264338327950288419716939937510L * 2)), root_two_pi
, tolerance
);
502 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(log(4.0L))), root_ln_four
, tolerance
);
503 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(2.71828182845904523536028747135266249775724709369995L), e
, tolerance
);
504 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(0.5), half
, tolerance
);
505 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(0.57721566490153286060651209008240243104259335L), euler
, tolerance
);
506 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(2.0L)), root_two
, tolerance
);
507 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(log(2.0L)), ln_two
, tolerance
);
508 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(log(log(2.0L))), ln_ln_two
, tolerance
);
509 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(1)/3, third
, tolerance
);
510 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(2)/3, twothirds
, tolerance
);
511 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(0.14159265358979323846264338327950288419716939937510L), pi_minus_three
, tolerance
);
512 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(4.L
- 3.14159265358979323846264338327950288419716939937510L), four_minus_pi
, tolerance
);
513 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
514 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(pow((3.14159265358979323846264338327950288419716939937510L), 2.71828182845904523536028747135266249775724709369995L)), pi_pow_e
, tolerance
);
515 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(pow((3.14159265358979323846264338327950288419716939937510L), 0.33333333333333333333333333333333333333333333333333L)), cbrt_pi
, tolerance
);
516 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(exp(-0.5L)), exp_minus_half
, tolerance
);
517 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(pow(2.71828182845904523536028747135266249775724709369995L, 3.14159265358979323846264338327950288419716939937510L)), e_pow_pi
, tolerance
);
520 #else // Only double, so no suffix L.
521 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(pow((3.14159265358979323846264338327950288419716939937510), 2.71828182845904523536028747135266249775724709369995)), pi_pow_e
, tolerance
);
522 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(pow((3.14159265358979323846264338327950288419716939937510), 0.33333333333333333333333333333333333333333333333333)), cbrt_pi
, tolerance
);
523 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(exp(-0.5)), exp_minus_half
, tolerance
);
525 // Rational fractions.
526 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(0.333333333333333333333333333333333333333L), third
, tolerance
);
527 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(0.666666666666666666666666666666666666667L), two_thirds
, tolerance
);
528 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(0.75L), three_quarters
, tolerance
);
530 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(2.L
)), root_two
, tolerance
);
531 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(3.L
)), root_three
, tolerance
);
532 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(2.L
)/2), half_root_two
, tolerance
);
533 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(log(2.L
)), ln_two
, tolerance
);
534 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(log(log(2.0L))), ln_ln_two
, tolerance
);
535 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(log(4.0L))), root_ln_four
, tolerance
);
536 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(1/sqrt(2.0L)), one_div_root_two
, tolerance
);
539 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L), pi
, tolerance
);
540 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L/2), half_pi
, tolerance
);
541 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L/3), third_pi
, tolerance
);
542 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L/6), sixth_pi
, tolerance
);
543 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(2 * 3.14159265358979323846264338327950288419716939937510L), two_pi
, tolerance
);
544 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3 * 3.14159265358979323846264338327950288419716939937510L / 4), three_quarters_pi
, tolerance
);
545 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(4 * 3.14159265358979323846264338327950288419716939937510L / 3), four_thirds_pi
, tolerance
);
546 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(1 / (2 * 3.14159265358979323846264338327950288419716939937510L)), one_div_two_pi
, tolerance
);
547 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(3.14159265358979323846264338327950288419716939937510L)), root_pi
, tolerance
);
548 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(3.14159265358979323846264338327950288419716939937510L / 2)), root_half_pi
, tolerance
);
549 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(2 * 3.14159265358979323846264338327950288419716939937510L)), root_two_pi
, tolerance
);
550 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(1 / sqrt(3.14159265358979323846264338327950288419716939937510L)), one_div_root_pi
, tolerance
);
551 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(1 / sqrt(2 * 3.14159265358979323846264338327950288419716939937510L)), one_div_root_two_pi
, tolerance
);
552 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(sqrt(1. / 3.14159265358979323846264338327950288419716939937510L)), root_one_div_pi
, tolerance
);
553 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L - 3.L
), pi_minus_three
, tolerance
* 4 ); // tolerance * 2 because of cancellation loss.
554 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(4.L
- 3.14159265358979323846264338327950288419716939937510L), four_minus_pi
, tolerance
);
556 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(pow((3.14159265358979323846264338327950288419716939937510L), 2.71828182845904523536028747135266249775724709369995L)), pi_pow_e
, tolerance
); // See above.
557 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L), pi_sqr
, tolerance
); // See above.
558 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L/6), pi_sqr_div_six
, tolerance
); // See above.
559 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L), pi_cubed
, tolerance
); // See above.
561 // BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L), cbrt_pi, tolerance); // See above.
562 BOOST_CHECK_CLOSE_FRACTION(cbrt_pi
* cbrt_pi
* cbrt_pi
, pi
, tolerance
);
563 BOOST_CHECK_CLOSE_FRACTION((static_cast<long double>(1)/cbrt_pi
), one_div_cbrt_pi
, tolerance
);
565 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(6.366197723675813430755350534900574481378385829618257E-1L), two_div_pi
, tolerance
* 3); // 2/pi
566 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(7.97884560802865355879892119868763736951717262329869E-1L), root_two_div_pi
, tolerance
* 3); // sqrt(2/pi)
569 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(2.71828182845904523536028747135266249775724709369995L), e
, tolerance
);
571 //BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(exp(-0.5L)), exp_minus_half, tolerance); // See above.
572 BOOST_CHECK_CLOSE_FRACTION(pow(e
, pi
), e_pow_pi
, tolerance
); // See also above.
573 BOOST_CHECK_CLOSE_FRACTION(sqrt(e
), root_e
, tolerance
);
574 BOOST_CHECK_CLOSE_FRACTION(log10(e
), log10_e
, tolerance
);
575 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(1)/log10(e
), one_div_log10_e
, tolerance
);
578 BOOST_CHECK_CLOSE_FRACTION(pi
/180, degree
, tolerance
);
579 BOOST_CHECK_CLOSE_FRACTION(180 / pi
, radian
, tolerance
);
580 BOOST_CHECK_CLOSE_FRACTION(sin(1.L
), sin_one
, tolerance
);
581 BOOST_CHECK_CLOSE_FRACTION(cos(1.L
), cos_one
, tolerance
);
582 BOOST_CHECK_CLOSE_FRACTION(sinh(1.L
), sinh_one
, tolerance
);
583 BOOST_CHECK_CLOSE_FRACTION(cosh(1.L
), cosh_one
, tolerance
);
586 BOOST_CHECK_CLOSE_FRACTION((1.L
+ sqrt(5.L
)) /2, phi
, tolerance
);
587 BOOST_CHECK_CLOSE_FRACTION(log((1.L
+ sqrt(5.L
)) /2), ln_phi
, tolerance
);
588 BOOST_CHECK_CLOSE_FRACTION(1.L
/ log((1.L
+ sqrt(5.L
)) /2), one_div_ln_phi
, tolerance
);
591 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992L, euler
, tolerance
); // (sequence A001620 in OEIS).
592 BOOST_CHECK_CLOSE_FRACTION(1.L
/ 0.57721566490153286060651209008240243104215933593992L, one_div_euler
, tolerance
); // (from sequence A001620 in OEIS).
593 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992L * 0.57721566490153286060651209008240243104215933593992L, euler_sqr
, tolerance
); // (from sequence A001620 in OEIS).
596 BOOST_CHECK_CLOSE_FRACTION(1.644934066848226436472415166646025189218949901206L, zeta_two
, tolerance
); // A013661 as a constant (usually base 10) in OEIS.
597 BOOST_CHECK_CLOSE_FRACTION(1.20205690315959428539973816151144999076498629234049888179227L, zeta_three
, tolerance
); // (sequence A002117 in OEIS)
598 BOOST_CHECK_CLOSE_FRACTION(.91596559417721901505460351493238411077414937428167213L, catalan
, tolerance
); // A006752 as a constant in OEIS.
599 BOOST_CHECK_CLOSE_FRACTION(1.1395470994046486574927930193898461120875997958365518247216557100852480077060706857071875468869385150L, extreme_value_skewness
, tolerance
); // Mathematica: N[12 Sqrt[6] Zeta[3]/Pi^3, 1101]
600 BOOST_CHECK_CLOSE_FRACTION(0.6311106578189371381918993515442277798440422031347194976580945856929268196174737254599050270325373067L, rayleigh_skewness
, tolerance
); // Mathematica: N[2 Sqrt[Pi] (Pi - 3)/((4 - Pi)^(3/2)), 1100]
601 BOOST_CHECK_CLOSE_FRACTION(2.450893006876380628486604106197544154e-01L, rayleigh_kurtosis_excess
, tolerance
);
602 BOOST_CHECK_CLOSE_FRACTION(2.68545200106530644530971483548179569382038229399446295305115234555721885953715200280114117493184769799515L, khinchin
, tolerance
); // A002210 as a constant https://oeis.org/A002210/constant
603 BOOST_CHECK_CLOSE_FRACTION(1.2824271291006226368753425688697917277676889273250011L, glaisher
, tolerance
); // https://oeis.org/A074962/constant
605 } // template <class RealType>void test_spots(RealType)
607 template <class Policy
>
608 void test_real_concept_policy(const Policy
&)
610 // Basic sanity checks for constants using real_concept.
611 // Parameter Policy is used to control precision.
613 using boost::math::concepts::real_concept
;
615 boost::math::concepts::real_concept tolerance
= boost::math::tools::epsilon
<real_concept
>() * 2; // double
616 if(Policy::precision_type::value
> 200)
618 std::cout
<< "Tolerance for type " << typeid(real_concept
).name() << " is " << tolerance
<< "." << std::endl
;
620 //typedef typename boost::math::policies::precision<boost::math::concepts::real_concept, boost::math::policies::policy<> >::type t1;
621 // A precision of zero means we don't know what the precision of this type is until runtime.
622 //std::cout << "Precision for type " << typeid(boost::math::concepts::real_concept).name() << " is " << t1::value << "." << std::endl;
624 using namespace boost::math::constants
;
627 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L, (pi
<real_concept
, Policy
>)(), tolerance
);
628 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L), (root_pi
<real_concept
, Policy
>)(), tolerance
);
629 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L/2), (root_half_pi
<real_concept
, Policy
>)(), tolerance
);
630 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L * 2), (root_two_pi
<real_concept
, Policy
>)(), tolerance
);
631 BOOST_CHECK_CLOSE_FRACTION(sqrt(log(4.0L)), (root_ln_four
<real_concept
, Policy
>)(), tolerance
);
632 BOOST_CHECK_CLOSE_FRACTION(2.71828182845904523536028747135266249775724709369995L, (e
<real_concept
, Policy
>)(), tolerance
);
633 BOOST_CHECK_CLOSE_FRACTION(0.5, (half
<real_concept
, Policy
>)(), tolerance
);
634 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104259335L, (euler
<real_concept
, Policy
>)(), tolerance
);
635 BOOST_CHECK_CLOSE_FRACTION(sqrt(2.0L), (root_two
<real_concept
, Policy
>)(), tolerance
);
636 BOOST_CHECK_CLOSE_FRACTION(log(2.0L), (ln_two
<real_concept
, Policy
>)(), tolerance
);
637 BOOST_CHECK_CLOSE_FRACTION(log(log(2.0L)), (ln_ln_two
<real_concept
, Policy
>)(), tolerance
);
638 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(1)/3, (third
<real_concept
, Policy
>)(), tolerance
);
639 BOOST_CHECK_CLOSE_FRACTION(static_cast<long double>(2)/3, (twothirds
<real_concept
, Policy
>)(), tolerance
);
640 BOOST_CHECK_CLOSE_FRACTION(0.14159265358979323846264338327950288419716939937510L, (pi_minus_three
<real_concept
, Policy
>)(), tolerance
);
641 BOOST_CHECK_CLOSE_FRACTION(4.L
- 3.14159265358979323846264338327950288419716939937510L, (four_minus_pi
<real_concept
, Policy
>)(), tolerance
);
642 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
643 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510L), 2.71828182845904523536028747135266249775724709369995L), (pi_pow_e
<real_concept
, Policy
>)(), tolerance
);
644 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510L), 0.33333333333333333333333333333333333333333333333333L), (cbrt_pi
<real_concept
, Policy
>)(), tolerance
);
645 BOOST_CHECK_CLOSE_FRACTION(exp(-0.5L), (exp_minus_half
<real_concept
, Policy
>)(), tolerance
);
646 BOOST_CHECK_CLOSE_FRACTION(pow(2.71828182845904523536028747135266249775724709369995L, 3.14159265358979323846264338327950288419716939937510L), (e_pow_pi
<real_concept
, Policy
>)(), tolerance
);
649 #else // Only double, so no suffix L.
650 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510), 2.71828182845904523536028747135266249775724709369995), (pi_pow_e
<real_concept
, Policy
>)(), tolerance
);
651 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510), 0.33333333333333333333333333333333333333333333333333), (cbrt_pi
<real_concept
, Policy
>)(), tolerance
);
652 BOOST_CHECK_CLOSE_FRACTION(exp(-0.5), (exp_minus_half
<real_concept
, Policy
>)(), tolerance
);
654 // Rational fractions.
655 BOOST_CHECK_CLOSE_FRACTION(0.333333333333333333333333333333333333333L, (third
<real_concept
, Policy
>)(), tolerance
);
656 BOOST_CHECK_CLOSE_FRACTION(0.666666666666666666666666666666666666667L, (two_thirds
<real_concept
, Policy
>)(), tolerance
);
657 BOOST_CHECK_CLOSE_FRACTION(0.75L, (three_quarters
<real_concept
, Policy
>)(), tolerance
);
659 BOOST_CHECK_CLOSE_FRACTION(sqrt(2.L
), (root_two
<real_concept
, Policy
>)(), tolerance
);
660 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.L
), (root_three
<real_concept
, Policy
>)(), tolerance
);
661 BOOST_CHECK_CLOSE_FRACTION(sqrt(2.L
)/2, (half_root_two
<real_concept
, Policy
>)(), tolerance
);
662 BOOST_CHECK_CLOSE_FRACTION(log(2.L
), (ln_two
<real_concept
, Policy
>)(), tolerance
);
663 BOOST_CHECK_CLOSE_FRACTION(log(log(2.0L)), (ln_ln_two
<real_concept
, Policy
>)(), tolerance
);
664 BOOST_CHECK_CLOSE_FRACTION(sqrt(log(4.0L)), (root_ln_four
<real_concept
, Policy
>)(), tolerance
);
665 BOOST_CHECK_CLOSE_FRACTION(1/sqrt(2.0L), (one_div_root_two
<real_concept
, Policy
>)(), tolerance
);
668 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L, (pi
<real_concept
, Policy
>)(), tolerance
);
669 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L/2, (half_pi
<real_concept
, Policy
>)(), tolerance
);
670 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L/3, (third_pi
<real_concept
, Policy
>)(), tolerance
);
671 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L/6, (sixth_pi
<real_concept
, Policy
>)(), tolerance
);
672 BOOST_CHECK_CLOSE_FRACTION(2 * 3.14159265358979323846264338327950288419716939937510L, (two_pi
<real_concept
, Policy
>)(), tolerance
);
673 BOOST_CHECK_CLOSE_FRACTION(3 * 3.14159265358979323846264338327950288419716939937510L / 4, (three_quarters_pi
<real_concept
, Policy
>)(), tolerance
);
674 BOOST_CHECK_CLOSE_FRACTION(4 * 3.14159265358979323846264338327950288419716939937510L / 3, (four_thirds_pi
<real_concept
, Policy
>)(), tolerance
);
675 BOOST_CHECK_CLOSE_FRACTION(1 / (2 * 3.14159265358979323846264338327950288419716939937510L), (one_div_two_pi
<real_concept
, Policy
>)(), tolerance
);
676 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L), (root_pi
<real_concept
, Policy
>)(), tolerance
);
677 BOOST_CHECK_CLOSE_FRACTION(sqrt(3.14159265358979323846264338327950288419716939937510L / 2), (root_half_pi
<real_concept
, Policy
>)(), tolerance
);
678 BOOST_CHECK_CLOSE_FRACTION(sqrt(2 * 3.14159265358979323846264338327950288419716939937510L), (root_two_pi
<real_concept
, Policy
>)(), tolerance
);
679 BOOST_CHECK_CLOSE_FRACTION(1 / sqrt(3.14159265358979323846264338327950288419716939937510L), (one_div_root_pi
<real_concept
, Policy
>)(), tolerance
);
680 BOOST_CHECK_CLOSE_FRACTION(1 / sqrt(2 * 3.14159265358979323846264338327950288419716939937510L), (one_div_root_two_pi
<real_concept
, Policy
>)(), tolerance
);
681 BOOST_CHECK_CLOSE_FRACTION(sqrt(1. / 3.14159265358979323846264338327950288419716939937510L), (root_one_div_pi
<real_concept
, Policy
>)(), tolerance
);
682 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L - 3.L
, (pi_minus_three
<real_concept
, Policy
>)(), tolerance
* 4 ); // tolerance * 2 because of cancellation loss.
683 BOOST_CHECK_CLOSE_FRACTION(4.L
- 3.14159265358979323846264338327950288419716939937510L, (four_minus_pi
<real_concept
, Policy
>)(), tolerance
);
685 BOOST_CHECK_CLOSE_FRACTION(pow((3.14159265358979323846264338327950288419716939937510L), 2.71828182845904523536028747135266249775724709369995L), (pi_pow_e
<real_concept
, Policy
>)(), tolerance
); // See above.
686 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L, (pi_sqr
<real_concept
, Policy
>)(), tolerance
); // See above.
687 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L/6, (pi_sqr_div_six
<real_concept
, Policy
>)(), tolerance
); // See above.
688 BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L, (pi_cubed
<real_concept
, Policy
>)(), tolerance
); // See above.
690 // BOOST_CHECK_CLOSE_FRACTION(3.14159265358979323846264338327950288419716939937510L * 3.14159265358979323846264338327950288419716939937510L, (cbrt_pi<real_concept, Policy>)(), tolerance); // See above.
691 BOOST_CHECK_CLOSE_FRACTION((cbrt_pi
<real_concept
, Policy
>)() * (cbrt_pi
<real_concept
, Policy
>)() * (cbrt_pi
<real_concept
, Policy
>)(), (pi
<real_concept
, Policy
>)(), tolerance
);
692 BOOST_CHECK_CLOSE_FRACTION((1)/(cbrt_pi
<real_concept
, Policy
>)(), (one_div_cbrt_pi
<real_concept
, Policy
>)(), tolerance
);
695 BOOST_CHECK_CLOSE_FRACTION(2.71828182845904523536028747135266249775724709369995L, (e
<real_concept
, Policy
>)(), tolerance
);
697 //BOOST_CHECK_CLOSE_FRACTION(exp(-0.5L), (exp_minus_half<real_concept, Policy>)(), tolerance); // See above.
698 BOOST_CHECK_CLOSE_FRACTION(pow(e
<real_concept
, Policy
>(), (pi
<real_concept
, Policy
>)()), (e_pow_pi
<real_concept
, Policy
>)(), tolerance
); // See also above.
699 BOOST_CHECK_CLOSE_FRACTION(sqrt(e
<real_concept
, Policy
>()), (root_e
<real_concept
, Policy
>)(), tolerance
);
700 BOOST_CHECK_CLOSE_FRACTION(log10(e
<real_concept
, Policy
>()), (log10_e
<real_concept
, Policy
>)(), tolerance
);
701 BOOST_CHECK_CLOSE_FRACTION(1/log10(e
<real_concept
, Policy
>()), (one_div_log10_e
<real_concept
, Policy
>)(), tolerance
);
704 BOOST_CHECK_CLOSE_FRACTION((pi
<real_concept
, Policy
>)()/180, (degree
<real_concept
, Policy
>)(), tolerance
);
705 BOOST_CHECK_CLOSE_FRACTION(180 / (pi
<real_concept
, Policy
>)(), (radian
<real_concept
, Policy
>)(), tolerance
);
706 BOOST_CHECK_CLOSE_FRACTION(sin(1.L
), (sin_one
<real_concept
, Policy
>)(), tolerance
);
707 BOOST_CHECK_CLOSE_FRACTION(cos(1.L
), (cos_one
<real_concept
, Policy
>)(), tolerance
);
708 BOOST_CHECK_CLOSE_FRACTION(sinh(1.L
), (sinh_one
<real_concept
, Policy
>)(), tolerance
);
709 BOOST_CHECK_CLOSE_FRACTION(cosh(1.L
), (cosh_one
<real_concept
, Policy
>)(), tolerance
);
712 BOOST_CHECK_CLOSE_FRACTION((1.L
+ sqrt(5.L
)) /2, (phi
<real_concept
, Policy
>)(), tolerance
);
713 BOOST_CHECK_CLOSE_FRACTION(log((1.L
+ sqrt(5.L
)) /2), (ln_phi
<real_concept
, Policy
>)(), tolerance
);
714 BOOST_CHECK_CLOSE_FRACTION(1.L
/ log((1.L
+ sqrt(5.L
)) /2), (one_div_ln_phi
<real_concept
, Policy
>)(), tolerance
);
717 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992L, (euler
<real_concept
, Policy
>)(), tolerance
); // (sequence A001620 in OEIS).
718 BOOST_CHECK_CLOSE_FRACTION(1.L
/ 0.57721566490153286060651209008240243104215933593992L, (one_div_euler
<real_concept
, Policy
>)(), tolerance
); // (from sequence A001620 in OEIS).
719 BOOST_CHECK_CLOSE_FRACTION(0.57721566490153286060651209008240243104215933593992L * 0.57721566490153286060651209008240243104215933593992L, (euler_sqr
<real_concept
, Policy
>)(), tolerance
); // (from sequence A001620 in OEIS).
722 BOOST_CHECK_CLOSE_FRACTION(1.644934066848226436472415166646025189218949901206L, (zeta_two
<real_concept
, Policy
>)(), tolerance
); // A013661 as a constant (usually base 10) in OEIS.
723 BOOST_CHECK_CLOSE_FRACTION(1.20205690315959428539973816151144999076498629234049888179227L, (zeta_three
<real_concept
, Policy
>)(), tolerance
); // (sequence A002117 in OEIS)
724 BOOST_CHECK_CLOSE_FRACTION(.91596559417721901505460351493238411077414937428167213L, (catalan
<real_concept
, Policy
>)(), tolerance
); // A006752 as a constant in OEIS.
725 BOOST_CHECK_CLOSE_FRACTION(1.1395470994046486574927930193898461120875997958365518247216557100852480077060706857071875468869385150L, (extreme_value_skewness
<real_concept
, Policy
>)(), tolerance
); // Mathematica: N[12 Sqrt[6] Zeta[3]/Pi^3, 1101]
726 BOOST_CHECK_CLOSE_FRACTION(0.6311106578189371381918993515442277798440422031347194976580945856929268196174737254599050270325373067L, (rayleigh_skewness
<real_concept
, Policy
>)(), tolerance
); // Mathematica: N[2 Sqrt[Pi] (Pi - 3)/((4 - Pi)^(3/2)), 1100]
727 BOOST_CHECK_CLOSE_FRACTION(2.450893006876380628486604106197544154e-01L, (rayleigh_kurtosis_excess
<real_concept
, Policy
>)(), tolerance
);
728 BOOST_CHECK_CLOSE_FRACTION(2.68545200106530644530971483548179569382038229399446295305115234555721885953715200280114117493184769799515L, (khinchin
<real_concept
, Policy
>)(), tolerance
); // A002210 as a constant https://oeis.org/A002210/constant
729 BOOST_CHECK_CLOSE_FRACTION(1.2824271291006226368753425688697917277676889273250011L, (glaisher
<real_concept
, Policy
>)(), tolerance
); // https://oeis.org/A074962/constant
732 // Last of all come the test cases that behave differently if we're calculating the constants on the fly:
734 if(boost::math::tools::digits
<real_concept
>() > boost::math::constants::max_string_digits
)
736 // This suffers from cancellation error, so increased tolerance:
737 BOOST_CHECK_CLOSE_FRACTION((static_cast<real_concept
>(4. - 3.14159265358979323846264338327950288419716939937510L)), (four_minus_pi
<real_concept
, Policy
>)(), tolerance
* 3);
738 BOOST_CHECK_CLOSE_FRACTION((static_cast<real_concept
>(0.14159265358979323846264338327950288419716939937510L)), (pi_minus_three
<real_concept
, Policy
>)(), tolerance
* 3);
742 BOOST_CHECK_CLOSE_FRACTION((static_cast<real_concept
>(4. - 3.14159265358979323846264338327950288419716939937510L)), (four_minus_pi
<real_concept
, Policy
>)(), tolerance
);
743 BOOST_CHECK_CLOSE_FRACTION((static_cast<real_concept
>(0.14159265358979323846264338327950288419716939937510L)), (pi_minus_three
<real_concept
, Policy
>)(), tolerance
);
746 } // template <class boost::math::concepts::real_concept>void test_spots(boost::math::concepts::real_concept)
748 #ifdef BOOST_MATH_USE_FLOAT128
751 static const __float128 eps
= 1.92592994438723585305597794258492732e-34Q
;
753 __float128 p
= boost::math::constants::pi
<__float128
>();
754 __float128 r
= 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651Q
;
755 __float128 err
= (p
- r
) / r
;
758 BOOST_CHECK(err
< 2 * eps
);
762 void test_constexpr()
764 #ifndef BOOST_NO_CXX11_CONSTEXPR
765 constexpr float f1
= boost::math::constants::pi
<float>();
766 constexpr double f2
= boost::math::constants::pi
<double>();
767 constexpr long double f3
= boost::math::constants::pi
<long double>();
771 #ifdef BOOST_MATH_USE_FLOAT128
772 constexpr __float128 f4
= boost::math::constants::pi
<__float128
>();
778 BOOST_AUTO_TEST_CASE( test_main
)
780 // Basic sanity-check spot values.
782 test_float_spots(); // Test float_constants, like boost::math::float_constants::pi;
783 test_double_spots(); // Test double_constants.
784 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
785 test_long_double_spots(); // Test long_double_constants.
786 #ifdef BOOST_MATH_USE_FLOAT128
791 test_real_concept_policy(real_concept_policy_1());
792 test_real_concept_policy(real_concept_policy_2()); // Increased precision forcing construction from string.
793 test_real_concept_policy(real_concept_policy_3()); // Increased precision forcing caching of computed values.
794 test_real_concept_policy(boost::math::policies::policy
<>()); // Default.
796 // (Parameter value, arbitrarily zero, only communicates the floating-point type).
797 test_spots(0.0F
); // Test float.
798 test_spots(0.0); // Test double.
799 #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
800 test_spots(0.0L); // Test long double.
801 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0582))
802 test_spots(boost::math::concepts::real_concept(0.)); // Test real concept.
803 test_spots(boost::math::concepts::big_real_concept(0.)); // Test real concept.
806 std::cout
<< "<note>The long double tests have been disabled on this platform "
807 "either because the long double overloads of the usual math functions are "
808 "not available at all, or because they are too inaccurate for these tests "
809 "to pass.</note>" << std::endl
;
812 } // BOOST_AUTO_TEST_CASE( test_main )
821 test_constants.vcxproj -> J:\Cpp\MathToolkit\test\Math_test\Debug\test_constants.exe
822 Running 1 test case...
823 Tolerance for type class boost::math::concepts::real_concept is 4.44089e-016.
824 Tolerance for type class boost::math::concepts::real_concept is 4.44089e-016.
825 Tolerance for type class boost::math::concepts::real_concept is 4.44089e-016.
826 Tolerance for type float is 2.38419e-007.
827 Tolerance for type double is 4.44089e-016.
828 Tolerance for type long double is 4.44089e-016.
829 Tolerance for type class boost::math::concepts::real_concept is 4.44089e-016.
830 Tolerance for type class boost::math::concepts::big_real_concept is 1.33227e-014.
832 *** No errors detected