57cba0eef4
[SVN r84143]
100 lines
3.4 KiB
C++
100 lines
3.4 KiB
C++
//[preprocessed_pi
|
|
|
|
// Preprocessed pi constant, annotated.
|
|
|
|
namespace boost
|
|
{
|
|
namespace math
|
|
{
|
|
namespace constants
|
|
{
|
|
namespace detail
|
|
{
|
|
template <class T> struct constant_pi
|
|
{
|
|
private:
|
|
// Default implementations from string of decimal digits:
|
|
static inline T get_from_string()
|
|
{
|
|
static const T result
|
|
= detail::convert_from_string<T>("3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00",
|
|
boost::is_convertible<const char*, T>());
|
|
return result;
|
|
}
|
|
template <int N> static T compute();
|
|
|
|
public:
|
|
// Default implementations from string of decimal digits:
|
|
static inline T get(const mpl::int_<construct_from_string>&)
|
|
{
|
|
constant_initializer<T, & constant_pi<T>::get_from_string >::do_nothing();
|
|
return get_from_string();
|
|
}
|
|
// Float, double and long double versions:
|
|
static inline T get(const mpl::int_<construct_from_float>)
|
|
{
|
|
return 3.141592653589793238462643383279502884e+00F;
|
|
}
|
|
static inline T get(const mpl::int_<construct_from_double>&)
|
|
{
|
|
return 3.141592653589793238462643383279502884e+00;
|
|
}
|
|
static inline T get(const mpl::int_<construct_from_long_double>&)
|
|
{
|
|
return 3.141592653589793238462643383279502884e+00L;
|
|
}
|
|
// For very high precision that is nonetheless can be calculated at compile time:
|
|
template <int N> static inline T get(const mpl::int_<N>& n)
|
|
{
|
|
constant_initializer2<T, N, & constant_pi<T>::template compute<N> >::do_nothing();
|
|
return compute<N>();
|
|
}
|
|
//For true arbitrary precision, which may well vary at runtime.
|
|
static inline T get(const mpl::int_<0>&)
|
|
{
|
|
return tools::digits<T>() > max_string_digits ? compute<0>() : get(mpl::int_<construct_from_string>());
|
|
}
|
|
}; // template <class T> struct constant_pi
|
|
} // namespace detail
|
|
|
|
// The actual forwarding function (including policy to control precision).
|
|
template <class T, class Policy> inline T pi( )
|
|
{
|
|
return detail:: constant_pi<T>::get(typename construction_traits<T, Policy>::type());
|
|
}
|
|
// The actual forwarding function (using default policy to control precision).
|
|
template <class T> inline T pi()
|
|
{
|
|
return pi<T, boost::math::policies::policy<> >()
|
|
}
|
|
} // namespace constants
|
|
|
|
// Namespace specific versions, for the three built-in floats:
|
|
namespace float_constants
|
|
{
|
|
static const float pi = 3.141592653589793238462643383279502884e+00F;
|
|
}
|
|
namespace double_constants
|
|
{
|
|
static const double pi = 3.141592653589793238462643383279502884e+00;
|
|
}
|
|
namespace long_double_constants
|
|
{
|
|
static const long double pi = 3.141592653589793238462643383279502884e+00L;
|
|
}
|
|
namespace constants{;
|
|
} // namespace constants
|
|
} // namespace math
|
|
} // namespace boost
|
|
|
|
//] [/preprocessed_pi]
|
|
|
|
/*
|
|
Copyright 2012 John Maddock and Paul A. Bristow.
|
|
Distributed under 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)
|
|
*/
|
|
|
|
|