1 //[preprocessed_pi
2 
3 // Preprocessed pi constant, annotated.
4 
5 namespace boost
6 {
7   namespace math
8   {
9     namespace constants
10     {
11       namespace detail
12       {
13         template <class T> struct constant_pi
14         {
15           private:
16             // Default implementations from string of decimal digits:
get_from_stringboost::math::constants::detail::constant_pi17             static inline T get_from_string()
18             {
19             static const T result
20                = detail::convert_from_string<T>("3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00",
21                boost::is_convertible<const char*, T>());
22               return result;
23             }
24             template <int N> static T compute();
25 
26           public:
27             // Default implementations from string of decimal digits:
getboost::math::constants::detail::constant_pi28             static inline T get(const mpl::int_<construct_from_string>&)
29             {
30               constant_initializer<T, & constant_pi<T>::get_from_string >::do_nothing();
31               return get_from_string();
32             }
33             // Float, double and long double versions:
getboost::math::constants::detail::constant_pi34             static inline T get(const mpl::int_<construct_from_float>)
35             {
36               return 3.141592653589793238462643383279502884e+00F;
37             }
getboost::math::constants::detail::constant_pi38             static inline  T get(const mpl::int_<construct_from_double>&)
39             {
40               return 3.141592653589793238462643383279502884e+00;
41             }
getboost::math::constants::detail::constant_pi42             static inline  T get(const mpl::int_<construct_from_long_double>&)
43             {
44               return 3.141592653589793238462643383279502884e+00L;
45             }
46             // For very high precision that is nonetheless can be calculated at compile time:
getboost::math::constants::detail::constant_pi47             template <int N> static inline T get(const mpl::int_<N>& n)
48             {
49               constant_initializer2<T, N, & constant_pi<T>::template compute<N> >::do_nothing();
50               return compute<N>();
51             }
52             //For true arbitrary precision, which may well vary at runtime.
getboost::math::constants::detail::constant_pi53             static inline T get(const mpl::int_<0>&)
54             {
55               return tools::digits<T>() > max_string_digits ? compute<0>() : get(mpl::int_<construct_from_string>());
56             }
57          }; // template <class T> struct constant_pi
58       } //  namespace detail
59 
60       // The actual forwarding function (including policy to control precision).
pi()61       template <class T, class Policy> inline T pi( )
62       {
63         return detail:: constant_pi<T>::get(typename construction_traits<T, Policy>::type());
64       }
65       // The actual forwarding function (using default policy to control precision).
pi()66       template <class T> inline  T pi()
67       {
68         return pi<T, boost::math::policies::policy<> >()
69       }
70     } //     namespace constants
71 
72     // Namespace specific versions, for the three built-in floats:
73     namespace float_constants
74     {
75       static const float pi = 3.141592653589793238462643383279502884e+00F;
76     }
77     namespace double_constants
78     {
79       static const double pi = 3.141592653589793238462643383279502884e+00;
80     }
81     namespace long_double_constants
82     {
83       static const long double pi = 3.141592653589793238462643383279502884e+00L;
84     }
85     namespace constants{;
86     } // namespace constants
87   } // namespace math
88 } // namespace boost
89 
90 //] [/preprocessed_pi]
91 
92 /*
93   Copyright 2012 John Maddock and Paul A. Bristow.
94   Distributed under the Boost Software License, Version 1.0.
95   (See accompanying file LICENSE_1_0.txt or copy at
96   http://www.boost.org/LICENSE_1_0.txt)
97 */
98 
99 
100