mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 13:10:19 -04:00 
			
		
		
		
	
		
			
	
	
		
			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)
 | ||
|  | */ | ||
|  | 
 | ||
|  | 
 |