📄 std_real_concept_check.cpp
字号:
// 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 "compile_test/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 EMULATE32namespace 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 EMULATE64namespace 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 EMULATE80namespace 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 EMULATE128namespace 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;};}#endifint main(){ instantiate(boost::math::concepts::std_real_concept(0));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -