| // Copyright John Maddock 2006. |
| // Use, modification and distribution are subject to the |
| // Boost Software License, Version 1.0. (See accompanying file |
| // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| |
| #define BOOST_MATH_ASSERT_UNDEFINED_POLICY false |
| |
| #include <boost/math/concepts/std_real_concept.hpp> |
| #include <boost/math/concepts/distributions.hpp> |
| |
| #include "instantiate.hpp" |
| |
| // |
| // The purpose of this test is to verify that our code compiles |
| // cleanly with a type whose std lib functions are in namespace |
| // std and can *not* be found by ADL. This verifies that we're |
| // not finding std lib functions that are in the global namespace |
| // for example calling ::pow(double) rather than std::pow(long double). |
| // This is a silent error that does the wrong thing at runtime, and |
| // of course we can't call std::pow() directly because we want |
| // the functions to be found by ADL when that's appropriate. |
| // |
| // Furthermore our code does different things internally depending |
| // on numeric_limits<>::digits, so there are some macros that can |
| // be defined that cause our concept-archetype to emulate various |
| // floating point types: |
| // |
| // EMULATE32: 32-bit float |
| // EMULATE64: 64-bit double |
| // EMULATE80: 80-bit long double |
| // EMULATE128: 128-bit long double |
| // |
| // In order to ensure total code coverage this file must be |
| // compiled with each of the above macros in turn, and then |
| // without any of the above as well! |
| // |
| |
| #define NULL_MACRO /**/ |
| #ifdef EMULATE32 |
| namespace std{ |
| template<> |
| struct numeric_limits<boost::math::concepts::std_real_concept> |
| { |
| static const bool is_specialized = true; |
| static boost::math::concepts::std_real_concept min NULL_MACRO() throw(); |
| static boost::math::concepts::std_real_concept max NULL_MACRO() throw(); |
| static const int digits = 24; |
| static const int digits10 = 6; |
| static const bool is_signed = true; |
| static const bool is_integer = false; |
| static const bool is_exact = false; |
| static const int radix = 2; |
| static boost::math::concepts::std_real_concept epsilon() throw(); |
| static boost::math::concepts::std_real_concept round_error() throw(); |
| static const int min_exponent = -125; |
| static const int min_exponent10 = -37; |
| static const int max_exponent = 128; |
| static const int max_exponent10 = 38; |
| static const bool has_infinity = true; |
| static const bool has_quiet_NaN = true; |
| static const bool has_signaling_NaN = true; |
| static const float_denorm_style has_denorm = denorm_absent; |
| static const bool has_denorm_loss = false; |
| static boost::math::concepts::std_real_concept infinity() throw(); |
| static boost::math::concepts::std_real_concept quiet_NaN() throw(); |
| static boost::math::concepts::std_real_concept signaling_NaN() throw(); |
| static boost::math::concepts::std_real_concept denorm_min() throw(); |
| static const bool is_iec559 = true; |
| static const bool is_bounded = false; |
| static const bool is_modulo = false; |
| static const bool traps = false; |
| static const bool tinyness_before = false; |
| static const float_round_style round_style = round_toward_zero; |
| }; |
| } |
| #endif |
| #ifdef EMULATE64 |
| namespace std{ |
| template<> |
| struct numeric_limits<boost::math::concepts::std_real_concept> |
| { |
| static const bool is_specialized = true; |
| static boost::math::concepts::std_real_concept min NULL_MACRO() throw(); |
| static boost::math::concepts::std_real_concept max NULL_MACRO() throw(); |
| static const int digits = 53; |
| static const int digits10 = 15; |
| static const bool is_signed = true; |
| static const bool is_integer = false; |
| static const bool is_exact = false; |
| static const int radix = 2; |
| static boost::math::concepts::std_real_concept epsilon() throw(); |
| static boost::math::concepts::std_real_concept round_error() throw(); |
| static const int min_exponent = -1021; |
| static const int min_exponent10 = -307; |
| static const int max_exponent = 1024; |
| static const int max_exponent10 = 308; |
| static const bool has_infinity = true; |
| static const bool has_quiet_NaN = true; |
| static const bool has_signaling_NaN = true; |
| static const float_denorm_style has_denorm = denorm_absent; |
| static const bool has_denorm_loss = false; |
| static boost::math::concepts::std_real_concept infinity() throw(); |
| static boost::math::concepts::std_real_concept quiet_NaN() throw(); |
| static boost::math::concepts::std_real_concept signaling_NaN() throw(); |
| static boost::math::concepts::std_real_concept denorm_min() throw(); |
| static const bool is_iec559 = true; |
| static const bool is_bounded = false; |
| static const bool is_modulo = false; |
| static const bool traps = false; |
| static const bool tinyness_before = false; |
| static const float_round_style round_style = round_toward_zero; |
| }; |
| } |
| #endif |
| #ifdef EMULATE80 |
| namespace std{ |
| template<> |
| struct numeric_limits<boost::math::concepts::std_real_concept> |
| { |
| static const bool is_specialized = true; |
| static boost::math::concepts::std_real_concept min NULL_MACRO() throw(); |
| static boost::math::concepts::std_real_concept max NULL_MACRO() throw(); |
| static const int digits = 64; |
| static const int digits10 = 18; |
| static const bool is_signed = true; |
| static const bool is_integer = false; |
| static const bool is_exact = false; |
| static const int radix = 2; |
| static boost::math::concepts::std_real_concept epsilon() throw(); |
| static boost::math::concepts::std_real_concept round_error() throw(); |
| static const int min_exponent = -16381; |
| static const int min_exponent10 = -4931; |
| static const int max_exponent = 16384; |
| static const int max_exponent10 = 4932; |
| static const bool has_infinity = true; |
| static const bool has_quiet_NaN = true; |
| static const bool has_signaling_NaN = true; |
| static const float_denorm_style has_denorm = denorm_absent; |
| static const bool has_denorm_loss = false; |
| static boost::math::concepts::std_real_concept infinity() throw(); |
| static boost::math::concepts::std_real_concept quiet_NaN() throw(); |
| static boost::math::concepts::std_real_concept signaling_NaN() throw(); |
| static boost::math::concepts::std_real_concept denorm_min() throw(); |
| static const bool is_iec559 = true; |
| static const bool is_bounded = false; |
| static const bool is_modulo = false; |
| static const bool traps = false; |
| static const bool tinyness_before = false; |
| static const float_round_style round_style = round_toward_zero; |
| }; |
| } |
| #endif |
| #ifdef EMULATE128 |
| namespace std{ |
| template<> |
| struct numeric_limits<boost::math::concepts::std_real_concept> |
| { |
| static const bool is_specialized = true; |
| static boost::math::concepts::std_real_concept min NULL_MACRO() throw(); |
| static boost::math::concepts::std_real_concept max NULL_MACRO() throw(); |
| static const int digits = 113; |
| static const int digits10 = 33; |
| static const bool is_signed = true; |
| static const bool is_integer = false; |
| static const bool is_exact = false; |
| static const int radix = 2; |
| static boost::math::concepts::std_real_concept epsilon() throw(); |
| static boost::math::concepts::std_real_concept round_error() throw(); |
| static const int min_exponent = -16381; |
| static const int min_exponent10 = -4931; |
| static const int max_exponent = 16384; |
| static const int max_exponent10 = 4932; |
| static const bool has_infinity = true; |
| static const bool has_quiet_NaN = true; |
| static const bool has_signaling_NaN = true; |
| static const float_denorm_style has_denorm = denorm_absent; |
| static const bool has_denorm_loss = false; |
| static boost::math::concepts::std_real_concept infinity() throw(); |
| static boost::math::concepts::std_real_concept quiet_NaN() throw(); |
| static boost::math::concepts::std_real_concept signaling_NaN() throw(); |
| static boost::math::concepts::std_real_concept denorm_min() throw(); |
| static const bool is_iec559 = true; |
| static const bool is_bounded = false; |
| static const bool is_modulo = false; |
| static const bool traps = false; |
| static const bool tinyness_before = false; |
| static const float_round_style round_style = round_toward_zero; |
| }; |
| } |
| #endif |
| |
| |
| |
| int main(int argc, char*[]) |
| { |
| #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS |
| if(argc > 1000) |
| instantiate(boost::math::concepts::std_real_concept(0)); |
| #endif |
| } |
| |