• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1[mathpart constants..Mathematical Constants]
2
3[section:constants_intro Introduction]
4
5Boost.Math provides a collection of mathematical constants.
6
7[h4 Why use Boost.Math mathematical constants?]
8
9* Readable. For the very many jobs just using built-in like `double`, you can just write expressions like
10``double area = pi * r * r;``
11(If that's all you want, jump direct to [link math_toolkit.tutorial.non_templ use in non-template code]!)
12* Effortless - avoiding a search of reference sources.
13* Usable with both builtin floating point types, and user-defined, possibly extended precision, types such as
14NTL, MPFR/GMP, mp_float: in the latter case the constants are computed to the necessary precision and then cached.
15* Accurate - ensuring that the values are as accurate as possible for the
16chosen floating-point type
17  * No loss of accuracy from repeated rounding of intermediate computations.
18  * Result is computed with higher precision and only rounded once.
19  * Less risk of inaccurate result from functions pow, trig and log at [@http://en.wikipedia.org/wiki/Corner_case corner cases].
20  * Less risk of [@http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html cancellation error].
21* Portable - as possible between different systems using different floating-point precisions:
22see [link math_toolkit.tutorial.templ use in template code].
23* Tested - by comparison with other published sources, or separately computed at long double precision.
24* Faster - can avoid (re-)calculation at runtime.
25  * If the value returned is a builtin type then it's returned by value as a `constexpr` (C++11 feature, if available).
26  * If the value is computed and cached (or constructed from a string representation and cached), then it's returned by constant reference.
27
28  This can be
29significant if:
30    * Functions pow, trig or log are used.
31    * Inside an inner loop.
32    * Using a high-precision UDT like __multiprecision.
33    * Compiler optimizations possible with built-in types, especially `double`, are not available.
34
35[endsect] [/section:intro Introduction]
36
37[section:tutorial Tutorial]
38
39[section:non_templ Use in non-template code]
40
41When using the math constants at your chosen fixed precision in non-template code,
42you can simply add a `using namespace` declaration, for example,
43`using namespace boost::math::double_constants`,
44to make the constants of the correct precision for your code
45visible in the current scope, and then use each constant ['as a simple variable - sans brackets]:
46
47   #include <boost/math/constants/constants.hpp>
48
49   double area(double r)
50   {
51      using namespace boost::math::double_constants;
52      return pi * r * r;
53   }
54
55Had our function been written as taking a `float` rather than a `double`,
56we could have written instead:
57
58   #include <boost/math/constants/constants.hpp>
59
60   float area(float r)
61   {
62      using namespace boost::math::float_constants;
63      return pi * r * r;
64   }
65
66Likewise, constants that are suitable for use at `long double` precision
67are available in the namespace `boost::math::long_double_constants`.
68
69You can see the full list of available constants at [link math_toolkit.constants].
70
71Some examples of using constants are at [@../../example/constants_eg1.cpp constants_eg1].
72
73[endsect] [/section:non_templ Use in non-template code]
74
75[section:templ Use in template code]
76
77When using the constants inside a function template, we need to ensure that
78we use a constant of the correct precision for our template parameters.
79We can do this by calling the function-template versions, `pi<FPType>()`, of the constants
80like this:
81
82   #include <boost/math/constants/constants.hpp>
83
84   template <class Real>
85   Real area(Real r)
86   {
87      using namespace boost::math::constants;
88      return pi<Real>() * r * r;
89   }
90
91Although this syntax is a little less "cute" than the non-template version,
92the code is no less efficient
93(at least for the built-in types `float`, `double` and `long double`) :
94the function template versions of the constants are simple inline functions that
95return a constant of the correct precision for the type used. In addition, these
96functions are declared `constexp` for those compilers that support this, allowing
97the result to be used in constant-expressions provided the template argument is a literal type.
98
99[tip Keep in mind the difference between the variable version,
100just `pi`, and the template-function version:
101the template-function requires both a <[~floating-point-type]>
102and function call `()` brackets, for example: `pi<double>()`.
103You cannot write `double p = pi<>()`, nor `double p = pi()`.]
104
105[note You can always use [*both] variable and template-function versions
106[*provided calls are fully qualified], for example:
107``
108double my_pi1 = boost::math::constants::pi<double>();
109double my_pi2 = boost::math::double_constants::pi;
110``
111]
112
113[warning It may be tempting to simply define
114``
115using namespace boost::math::double_constants;
116using namespace boost::math::constants;
117``
118but if you do define two namespaces, this will, of course, create ambiguity!
119``
120double my_pi = pi(); // error C2872: 'pi' : ambiguous symbol
121double my_pi2 = pi; // Context does not allow for disambiguation of overloaded function
122``
123Although the  mistake above is fairly obvious,
124it is also not too difficult to do this accidentally, or worse, create it in someone elses code.
125
126Therefore is it prudent to avoid this risk by [*localising the scope of such definitions], as shown above.]
127
128[tip Be very careful with the type provided as parameter.
129For example, providing an [*integer] instead of a floating-point type can be disastrous (a C++ feature).
130
131``cout << "Area = " << area(2) << endl; // Area = 12!!!``
132
133You should get a compiler warning
134[pre
135warning : 'return' : conversion from 'double' to 'int', possible loss of data
136] [/pre]
137Failure to heed this warning can lead to very wrong answers!
138
139You can also avoid this by being explicit about the type of `Area`.
140``cout << "Area = " << area<double>(2) << endl; // Area = 12.566371``
141]
142
143[endsect] [/section:templ Use in template code]
144
145[section:user_def Use With User-Defined Types]
146
147The most common example of a high-precision user-defined type will probably be __multiprecision.
148
149The syntax for using the function-call constants with user-defined types is the same
150as it is in the template class, which is to say we use:
151
152   #include <boost/math/constants/constants.hpp>
153
154   boost::math::constants::pi<UserDefinedType>();
155
156For example:
157
158  boost::math::constants::pi<boost::multiprecision::cpp_dec_float_50>();
159
160giving [pi] with a precision of 50 decimal digits.
161
162However, since the precision of the user-defined type may be much greater than that
163of the built-in floating point types, how the value returned is created is as follows:
164
165* If the precision of the type is known at compile time:
166   * If the precision is less than or equal to that of a `float` and the type is constructable from a `float`
167     then our code returns a `float` literal.  If the user-defined type is a literal type
168     then the function call that returns the constant will be a `constexp`.
169   * If the precision is less than or equal to that of a `double` and the type is constructable from a `double`
170     then our code returns a `double` literal.  If the user-defined type is a literal type
171     then the function call that returns the constant will be a `constexp`.
172   * If the precision is less than or equal to that of a `long double` and the type is constructable from a `long double`
173     then our code returns a `long double` literal.  If the user-defined type is a literal type
174     then the function call that returns the constant will be a `constexp`.
175   * If the precision is less than or equal to that of a `__float128` (and the compiler supports such a type)
176     and the type is constructable from a `__float128`
177     then our code returns a `__float128` literal.  If the user-defined type is a literal type
178     then the function call that returns the constant will be a `constexp`.
179   * If the precision is less than 100 decimal digits, then the constant will be constructed
180      (just the once, then cached in a thread-safe manner) from a string representation of the constant.
181      In this case the value is returned as a const reference to the cached value.
182   * Otherwise the value is computed (just once, then cached in a thread-safe manner).
183     In this case the value is returned as a const reference to the cached value.
184* If the precision is unknown at compile time then:
185   * If the runtime precision (obtained from a call to `boost::math::tools::digits<T>()`) is
186     less than 100 decimal digits, then the constant is constructed "on the fly" from the string
187     representation of the constant.
188   * Otherwise the value is constructed "on the fly" by calculating then value of the constant
189     using the current default precision of the type.  Note that this can make use of the constants
190     rather expensive.
191
192In addition, it is possible to pass a `Policy` type as a second template argument, and use this to control
193the precision:
194
195   #include <boost/math/constants/constants.hpp>
196
197   typedef boost::math::policies::policy<boost::math::policies::digits2<80> > my_policy_type;
198   boost::math::constants::pi<MyType, my_policy_type>();
199
200[note Boost.Math doesn't know how to control the internal precision of `MyType`, the policy
201just controls how the selection process above is carried out, and the calculation precision
202if the result is computed.]
203
204It is also possible to control which method is used to construct the constant by specialising
205the traits class `construction_traits`:
206
207   namespace boost{ namespace math{ namespace constant{
208
209   template <class T, class Policy>
210   struct construction_traits
211   {
212      typedef boost::integral_constant<int, N> type;
213   };
214
215   }}} // namespaces
216
217Where ['N] takes one of the following values:
218
219[table
220[[['N]][Meaning]]
221[[0][The precision is unavailable at compile time;
222either construct from a decimal digit string or calculate on the fly depending upon the runtime precision.]]
223[[1][Return a float precision constant.]]
224[[2][Return a double precision constant.]]
225[[3][Return a long double precision constant.]]
226[[4][Construct the result from the string representation, and cache the result.]]
227[[Any other value ['N]][Sets the compile time precision to ['N] bits.]]
228]
229
230[h5 Custom Specializing a constant]
231
232In addition, for user-defined types that need special handling, it's possible to partially-specialize
233the internal structure used by each constant.  For example, suppose we're using the C++ wrapper around MPFR
234`mpfr_class`: this has its own representation of Pi which we may well wish to use in place of the above
235mechanism.  We can achieve this by specialising the class template `boost::math::constants::detail::constant_pi`:
236
237   namespace boost{ namespace math{ namespace constants{ namespace detail{
238
239   template<>
240   struct constant_pi<mpfr_class>
241   {
242      template<int N>
243      static mpfr_class get(const boost::integral_constant<int, N>&)
244      {
245         // The template param N is one of the values in the table above,
246         // we can either handle all cases in one as is the case here,
247         // or overload "get" for the different options.
248         mpfr_class result;
249         mpfr_const_pi(result.get_mpfr_t(), GMP_RNDN);
250         return result;
251      }
252   };
253
254   }}}} // namespaces
255
256[h5 Diagnosing what meta-programmed code is doing]
257
258Finally, since it can be tricky to diagnose what meta-programmed code is doing, there is a
259diagnostic routine that prints information about how this library will handle a specific type,
260it can be used like this:
261
262   #include <boost/math/constants/info.hpp>
263
264   int main()
265   {
266      boost::math::constants::print_info_on_type<MyType>();
267   }
268
269If you wish, you can also pass an optional std::ostream argument to the `print_info_on_type` function.
270Typical output for a user-defined type looks like this:
271
272[pre
273Information on the Implementation and Handling of
274Mathematical Constants for Type class boost::math::concepts::real_concept
275
276Checking for std::numeric_limits<class boost::math::concepts::real_concept> specialisation: no
277boost::math::policies::precision<class boost::math::concepts::real_concept, Policy>
278reports that there is no compile type precision available.
279boost::math::tools::digits<class boost::math::concepts::real_concept>()
280reports that the current runtime precision is
28153 binary digits.
282No compile time precision is available, the construction method
283will be decided at runtime and results will not be cached
284- this may lead to poor runtime performance.
285Current runtime precision indicates that
286the constant will be constructed from a string on each call.
287]
288
289[endsect] [/section:user_def Use With User Defined Types]
290
291[endsect] [/section:tutorial Tutorial]
292
293[section:constants The Mathematical Constants]
294
295This section lists the mathematical constants, their use(s) (and sometimes rationale for their inclusion).
296[table Mathematical Constants
297[[name] [formula] [Value (6 decimals)] [Uses and Rationale]]
298[[[*Rational fractions]] [] [] [] ]
299[[half] [1/2] [0.5] [] ]
300[[third] [1/3] [0.333333] [] ]
301[[two_thirds] [2/3] [0.66667] [] ]
302[[three_quarters] [3/4] [0.75] [] ]
303
304[[[*two and related]] [] [] [] ]
305[[root_two] [[radic]2] [1.41421] [Equivalent to POSIX constant M_SQRT2] ]
306[[root_three] [[radic]3] [1.73205] [] ]
307[[half_root_two] [[radic]2 /2] [0.707106] [] ]
308[[ln_two] [ln(2)] [0.693147] [Equivalent to POSIX constant M_LN2] ]
309[[ln_ten] [ln(10)] [2.30258] [Equivalent to POSIX constant M_LN10] ]
310[[ln_ln_two] [ln(ln(2))] [-0.366512] [Gumbel distribution median] ]
311[[root_ln_four] [[radic]ln(4)] [1.177410] [] ]
312[[one_div_root_two] [1/[radic]2] [0.707106] [Equivalent to POSIX constant M_SQRT1_2] ]
313
314[[[*[pi] and related]] [] [] [] ]
315[[pi] [pi] [3.14159] [Ubiquitous. Archimedes constant [@http://en.wikipedia.org/wiki/Pi [pi]].  Equivalent to POSIX constant M_PI]]
316[[half_pi] [[pi]/2] [1.570796] [Equivalent to POSIX constant M_PI2] ]
317[[third_pi] [[pi]/3] [1.04719] [] ]
318[[quarter_pi] [[pi]/4] [0.78539816] [Equivalent to POSIX constant M_PI_4] ]
319[[sixth_pi] [[pi]/6] [0.523598] [] ]
320[[two_pi] [2[pi]] [6.28318] [Many uses, most simply, circumference of a circle]]
321[[two_thirds_pi] [2/3 [pi]] [2.09439] [[@http://en.wikipedia.org/wiki/Sphere#Volume_of_a_sphere volume of a hemi-sphere] = 4/3 [pi] r[cubed]]]
322[[three_quarters_pi] [3/4 [pi]] [2.35619] [ = 3/4 [pi] ]]
323[[four_thirds_pi] [4/3 [pi]] [4.18879] [[@http://en.wikipedia.org/wiki/Sphere#Volume_of_a_sphere volume of a sphere] = 4/3 [pi] r[cubed]]]
324[[one_div_two_pi] [1/(2[pi])] [1.59155] [Widely used]]
325[[root_pi] [[radic][pi]][1.77245] [Widely used]]
326[[root_half_pi] [[radic] [pi]/2] [1.25331] [Widely used]]
327[[root_two_pi][[radic] [pi]*2] [2.50662] [Widely used]]
328[[one_div_pi] [1/[pi]] [0.31830988] [Equivalent to POSIX constant M_1_PI] ]
329[[two_div_pi] [2/[pi]] [0.63661977] [Equivalent to POSIX constant M_2_PI] ]
330[[one_div_root_pi] [1/[radic][pi]] [0.564189] [] ]
331[[two_div_root_pi] [2/[radic][pi]] [1.128379] [Equivalent to POSIX constant M_2_SQRTPI] ]
332[[one_div_root_two_pi] [1/[radic](2[pi])] [0.398942] [] ]
333[[root_one_div_pi] [[radic](1/[pi]] [0.564189] [] ]
334[[pi_minus_three] [[pi]-3] [0.141593] [] ]
335[[four_minus_pi] [4 -[pi]] [0.858407] [] ]
336[[pi_pow_e] [[pi][super e]] [22.4591] [] ]
337
338[[pi_sqr] [[pi][super 2]] [9.86960] [] ]
339[[pi_sqr_div_six] [[pi][super 2]/6] [1.64493] [] ]
340[[pi_cubed] [[pi][super 3]] [31.00627] [] ]
341[[cbrt_pi] [[radic][super 3] [pi]] [1.46459] [] ]
342[[one_div_cbrt_pi] [1/[radic][super 3] [pi]] [0.682784] [] ]
343
344[[[*Euler's e and related]] [] [] [] ]
345[[e] [e] [2.71828] [[@http://en.wikipedia.org/wiki/E_(mathematical_constant) Euler's constant e], equivalent to POSIX constant M_E] ]
346[[exp_minus_half] [e [super -1/2]] [0.606530] [] ]
347[[e_pow_pi] [e [super [pi]]] [23.14069] [] ]
348[[root_e] [[radic] e] [1.64872] [] ]
349[[log10_e] [log10(e)] [0.434294] [Equivalent to POSIX constant M_LOG10E] ]
350[[one_div_log10_e] [1/log10(e)] [2.30258] [] ]
351[[log2_e] [log[sub 2](e)] [1.442695] [This is the same as 1/ln(2) and is equivalent to POSIX constant M_LOG2E] ]
352
353[[[*Trigonometric]] [] [] [] ]
354[[degree] [radians = [pi] / 180] [0.017453] [] ]
355[[radian] [degrees = 180 / [pi]] [57.2957] [] ]
356[[sin_one] [sin(1)] [0.841470] [] ]
357[[cos_one] [cos(1)] [0.54030] [] ]
358[[sinh_one] [sinh(1)] [1.17520] [] ]
359[[cosh_one] [cosh(1)] [1.54308] [] ]
360
361[[[*Phi]] [ Phidias golden ratio] [[@http://en.wikipedia.org/wiki/Golden_ratio Phidias golden ratio]] [] ]
362[[phi] [(1 + [radic]5) /2] [1.61803] [finance] ]
363[[ln_phi] [ln([phi])] [0.48121] [] ]
364[[one_div_ln_phi] [1/ln([phi])] [2.07808] [] ]
365
366[[[*Euler's Gamma]] [] [] [] ]
367[[euler] [euler] [0.577215] [[@http://en.wikipedia.org/wiki/Euler%E2%80%93Mascheroni_constant Euler-Mascheroni gamma constant]] ]
368[[one_div_euler] [1/euler] [1.73245] [] ]
369[[euler_sqr] [euler[super 2]] [0.333177] [] ]
370
371[[[*Misc]] [] [] [] ]
372[[zeta_two] [[zeta](2)] [1.64493] [[@http://en.wikipedia.org/wiki/Riemann_zeta_function Riemann zeta function]] ]
373[[zeta_three] [[zeta](3)] [1.20205] [[@http://en.wikipedia.org/wiki/Riemann_zeta_function Riemann zeta function]] ]
374[[catalan] [['K]] [0.915965] [[@http://mathworld.wolfram.com/CatalansConstant.html Catalan (or Glaisher) combinatorial constant] ]]
375[[glaisher] [['A]] [1.28242] [[@https://oeis.org/A074962/constant Decimal expansion of Glaisher-Kinkelin constant] ]]
376[[khinchin] [['k]] [2.685452] [[@https://oeis.org/A002210/constant Decimal expansion of Khinchin constant] ]]
377
378[[extreme_value_skewness] [12[radic]6 [zeta](3)/ [pi][super 3]] [1.139547] [Extreme value distribution] ]
379[[rayleigh_skewness] [2[radic][pi]([pi]-3)/(4 - [pi])[super 3/2]] [0.631110] [Rayleigh distribution skewness] ]
380[[rayleigh_kurtosis_excess] [-(6[pi][super 2]-24[pi]+16)/(4-[pi])[super 2]] [0.245089] [[@http://en.wikipedia.org/wiki/Rayleigh_distribution Rayleigh distribution kurtosis excess]] ]
381[[rayleigh_kurtosis] [3+(6[pi][super 2]-24[pi]+16)/(4-[pi])[super 2]] [3.245089] [Rayleigh distribution kurtosis] ]
382
383] [/table]
384
385
386[note Integer values are [*not included] in this list of math constants, however interesting,
387because they can be so easily and exactly constructed, even for UDT, for example: `static_cast<cpp_float>(42)`.]
388
389[tip If you know the approximate value of the constant, you can search for the value to find Boost.Math chosen name in this table.]
390[tip Bernoulli numbers are available at __bernoulli_numbers.]
391[tip Factorials are available at __factorial.]
392
393[endsect]  [/section:constants The constants]
394
395[section:new_const Defining New Constants]
396
397The library provides some helper code to assist in defining new constants;
398the process for defining a constant called `my_constant` goes like this:
399
4001. [*Define a function that calculates the value of the constant].
401This should be a template function, and be placed in `boost/math/constants/calculate_constants.hpp`
402if the constant is to be added to this library,
403or else defined at the top of your source file if not.
404
405The function should look like this:
406
407  namespace boost{ namespace math{ namespace constants{ namespace detail{
408
409  template <class Real>
410  template <int N>
411  Real constant_my_constant<Real>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((boost::integral_constant<int, N>)))
412  {
413    int required_precision = N ? N : tools::digits<Real>();
414    Real result = /* value computed to required_precision bits */ ;
415    return result;
416  }
417
418  }}}} // namespaces
419
420Then define a placeholder for the constant itself:
421
422   namespace boost{ namespace math{ namespace constants{
423
424   BOOST_DEFINE_MATH_CONSTANT(my_constant, 0.0, "0");
425
426   }}}
427
428
429For example, to calculate [pi]/2, add to `boost/math/constants/calculate_constants.hpp`
430
431  template <class T>
432  template<int N>
433  inline T constant_half_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((boost::integral_constant<int, N>)))
434  {
435     BOOST_MATH_STD_USING
436     return pi<T, policies::policy<policies::digits2<N> > >() / static_cast<T>(2);
437  }
438
439Then to `boost/math/constants/constants.hpp` add:
440
441   BOOST_DEFINE_MATH_CONSTANT(half_pi, 0.0, "0");  // Actual values are temporary, we'll replace them later.
442
443[note Previously defined constants like pi and e can be used, but by *not simply calling* `pi<T>()`;
444specifying the precision via the policy
445`pi<T, policies::policy<policies::digits2<N> > >()`
446is essential to ensure full accuracy.]
447
448[warning Newly defined constants can only be used once they are included in
449`boost/math/constants/constants.hpp`. So if you add
450`template <class T, class N> T constant_my_constant{...}`,
451then you cannot define `constant_my_constant`
452until you add the temporary `BOOST_DEFINE_MATH_CONSTANT(my_constant, 0.0, "0")`.
453Failing to do this will result in surprising compile errors:
454``
455  error C2143: syntax error : missing ';' before '<'
456  error C2433: 'constant_root_two_div_pi' : 'inline' not permitted on data declarations
457  error C2888: 'T constant_root_two_div_pi' : symbol cannot be defined within namespace 'detail'
458  error C2988: unrecognizable template declaration/definition
459``
460]
461
4622. [*You will need an arbitrary precision type to use to calculate the value]. This library
463currently supports either `cpp_float`, `NTL::RR` or `mpfr_class` used via the bindings in `boost/math/bindings`.
464The default is to use `NTL::RR` unless you define an alternate macro, for example,
465`USE_MPFR` or `USE_CPP_FLOAT` at the start of your program.
466
4673. It is necessary to link to the Boost.Regex library,
468and probably to your chosen arbitrary precision type library.
469
4704. You need to add `libs\math\include_private` to your compiler's include path as the needed
471header is not installed in the usual places by default (this avoids a cyclic dependency between
472the Math and Multiprecision library's headers).
473
4745. The complete program to generate the constant `half_pi` using function `calculate_half_pi` is then:
475
476   #define USE_CPP_FLOAT // If required.
477   #include <boost/math/constants/generate.hpp>
478
479   int main()
480   {
481      BOOST_CONSTANTS_GENERATE(half_pi);
482   }
483
484The output from the program is a snippet of C++ code
485(actually a macro call) that can be cut and pasted
486into `boost/math/constants/constants.hpp` or else into your own code, for example:
487
488[pre
489  BOOST_DEFINE_MATH_CONSTANT(half_pi, 1.570796326794896619231321691639751442e+00, "1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404326e+00");
490]
491
492This macro BOOST_DEFINE_MATH_CONSTANT  inserts a C++ struct code snippet that
493declares the `float`, `double` and `long double` versions of the constant,
494plus a decimal digit string representation correct to 100 decimal
495digits, and all the meta-programming machinery needed to select between them.
496
497The result of an expanded macro for Pi is shown below.
498
499[import ./pp_pi.hpp]
500
501[preprocessed_pi]
502
503
504[endsect] [/section:new_const Defining New Constants]
505
506[section:constants_faq Math Constants FAQs]
507
508[h4 Why are ['these] Constants Chosen?]
509It is, of course, impossible to please everyone with a list like this.
510
511Some of the criteria we have used are:
512
513* Used in Boost.Math.
514* Commonly used.
515* Expensive to compute.
516* Requested by users.
517* [@http://en.wikipedia.org/wiki/Mathematical_constant Used in science and mathematics.]
518* No integer values (because so cheap to construct).
519
520(You can easily define your own if found convenient, for example: `FPT one =static_cast<FPT>(42);`).
521
522[h4 How are constants named?]
523* Not macros, so no upper case.
524* All lower case (following C++ standard names).
525* No CamelCase.
526* Underscore as _ delimiter between words.
527* Numbers spelt as words rather than decimal digits (except following pow).
528* Abbreviation conventions:
529  * root for square root.
530  * cbrt for cube root.
531  * pow for pow function using decimal digits like pow23 for n[super 2/3].
532  * div for divided by or operator /.
533  * minus for operator -, plus for operator +.
534  * sqr for squared.
535  * cubed for cubed n[super 3].
536  * words for greek, like [pi], [zeta] and [Gamma].
537  * words like half, third, three_quarters, sixth for fractions.  (Digit(s) can get muddled).
538  * log10 for log[sub 10]
539  * ln for log[sub e]
540
541[h4 How are the constants derived?]
542
543The constants have all been calculated using high-precision software working
544with up to 300-bit precision giving about 100 decimal digits.
545(The precision can be arbitrarily chosen and is limited only by compute time).
546
547[h4 How Accurate are the constants?]
548The minimum accuracy chosen (100 decimal digits) exceeds the
549accuracy of reasonably-foreseeable floating-point hardware (256-bit)
550and should meet most high-precision computations.
551
552[h4 How are the constants tested?]
553
554# Comparison using Boost.Test BOOST_CHECK_CLOSE_FRACTION using long double literals,
555with at least 35 decimal digits, enough to be accurate for all long double implementations.
556The tolerance is usually twice `long double epsilon`.
557
558# Comparison with calculation at long double precision.
559This often requires a slightly higher tolerance than two epsilon
560because of computational noise from round-off etc,
561especially when trig and other functions are called.
562
563# Comparison with independent published values,
564for example, using [@http://oeis.org/ The On-Line Encyclopedia of Integer Sequences (OEIS)]
565again using at least 35 decimal digits strings.
566
567# Comparison with independently calculated values using arbitrary precision tools like
568[@http://www.wolfram.com/mathematica/ Mathematica], again using at least 35 decimal digits literal strings.
569
570[warning We have not yet been able to [*check] that
571[*all] constants are accurate at the full arbitrary precision,
572at present 100 decimal digits.
573But certain key values like `e` and `pi` appear to be accurate
574and internal consistencies suggest that others are this accurate too.
575]
576
577[h4 Why is Portability important?]
578
579Code written using math constants is easily portable even when using different
580floating-point types with differing precision.
581
582It is a mistake to expect that results of computations will be [*identical], but
583you can achieve the [*best accuracy possible for the floating-point type in use].
584
585This has no extra cost to the user, but reduces irritating,
586and often confusing and very hard-to-trace effects,
587caused by the intrinsically limited precision of floating-point calculations.
588
589A harmless symptom of this limit is a spurious least-significant digit;
590at worst, slightly inaccurate constants sometimes cause iterating algorithms
591to diverge wildly because internal comparisons just fail.
592
593[h4 What is the Internal Format of the constants, and why?]
594
595See [link math_toolkit.tutorial tutorial] above for normal use,
596but this FAQ explains the internal details used for the constants.
597
598Constants are stored as 100 decimal digit values.
599However, some compilers do not accept decimal digits strings as long as this.
600So the constant is split into two parts, with the first containing at least
601128-bit long double precision (35 decimal digits),
602and for consistency should be in scientific format with a signed exponent.
603
604The second part is the value of the constant expressed as a string literal,
605accurate to at least 100 decimal digits (in practice that means at least 102 digits).
606Again for consistency use scientific format with a signed exponent.
607
608For types with precision greater than a long double,
609then if T is constructible `T `is constructible from a `const char*`
610then it's directly constructed from the string,
611otherwise we fall back on lexical_cast to convert to type `T`.
612(Using a string is necessary because you can't use a numeric constant
613since even a `long double` might not have enough digits).
614
615So, for example, a constant like pi is internally defined as
616
617  BOOST_DEFINE_MATH_CONSTANT(pi, 3.141592653589793238462643383279502884e+00, "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00");
618
619In this case the significand is 109 decimal digits, ensuring 100 decimal digits are exact, and exponent is zero.
620
621See [link math_toolkit.new_const defining new constants] to calculate new constants.
622
623A macro definition like this can be pasted into user code where convenient,
624or into `boost/math/constants.hpp` if it is to be added to the Boost.Math library.
625
626[h4 What Floating-point Types could I use?]
627
628Apart from the built-in floating-point types `float`, `double`, `long double`,
629there are several arbitrary precision floating-point classes available,
630but most are not licensed for commercial use.
631
632[h5  Boost.Multiprecision by Christopher Kormanyos]
633
634This work is based on an earlier work called e-float:
635Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations,
636in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011.
637[@http://doi.acm.org/10.1145/1916461.1916469]
638[@https://svn.boost.org/svn/boost/sandbox/e_float/ e_float]
639but is now re-factored and available under the Boost license in the Boost-sandbox at
640[@https://svn.boost.org/svn/boost/sandbox/multiprecision/ multiprecision]
641where it is being refined and prepared for review.
642
643[h5 Boost.cpp_float by John Maddock using Expression Templates]
644
645[@https://svn.boost.org/svn/boost/sandbox/big_number/ Big Number]
646which is a reworking of [@https://svn.boost.org/svn/boost/sandbox/e_float/ e_float]
647by Christopher Kormanyos to use expression templates for faster execution.
648
649[h5 NTL class quad_float]
650
651[@http://shoup.net/ntl/ NTL] by Victor Shoup has fixed and arbitrary high precision fixed and floating-point types.
652However none of these are licenced for commercial use.
653
654  #include <NTL/quad_float.h> // quad precision 106-bit, about 32 decimal digits.
655  using NTL::to_quad_float; // Less precise than arbitrary precision NTL::RR.
656
657NTL class `quad_float`, which gives a form of quadruple precision,
658106-bit significand (but without an extended exponent range.)
659With an IEC559/IEEE 754 compatible processor,
660for example Intel X86 family, with 64-bit double, and 53-bit significand,
661using the significands of [*two] 64-bit doubles,
662if `std::numeric_limits<double>::digits10` is 16,
663then we get about twice the precision,
664so `std::numeric_limits<quad_float>::digits10()` should be 32.
665(the default `std::numeric_limits<RR>::digits10()` should be about 40).
666(which seems to agree with experiments).
667We output constants (including some noisy bits,
668an approximation to `std::numeric_limits<RR>::max_digits10()`)
669by adding 2 or 3 extra decimal digits, so using `quad_float::SetOutputPrecision(32 + 3);`
670
671Apple Mac/Darwin uses a similar ['doubledouble] 106-bit for its built-in `long double` type.
672
673[note The precision of all `doubledouble` floating-point types is rather odd and values given are only approximate.]
674
675[*New projects should use __multiprecision.]
676
677[h5 NTL class RR]
678
679Arbitrary precision floating point with NTL class RR,
680default is 150 bit (about 50 decimal digits)
681used here with 300 bit to output 100 decimal digits,
682enough for many practical non-'number-theoretic' C++ applications.
683
684__NTL is [*not licenced for commercial use].
685
686This class is used in Boost.Math and is an option when using big_number projects to calculate new math constants.
687
688[*New projects should use __multiprecision.]
689
690[h5 GMP and MPFR]
691
692[@http://gmplib.org GMP] and [@http://www.mpfr.org/ MPFR] have also been used to compute constants,
693but are licensed under the [@http://www.gnu.org/copyleft/lesser.html Lesser GPL license]
694and are [*not licensed for commercial use].
695
696[h4 What happened to a previous collection of constants proposed for Boost?]
697
698A review concluded that the way in which the constants were presented did not meet many peoples needs.
699None of the methods proposed met many users' essential requirement to allow writing simply `pi` rather than `pi()`.
700Many science and engineering equations look difficult to read when because function call brackets can be confused
701with the many other brackets often needed.  All the methods then proposed of avoiding the brackets failed to meet all needs,
702often on grounds of complexity and lack of applicability to various realistic scenarios.
703
704So the simple namespace method, proposed on its own, but rejected at the first review,
705has been added to allow users to have convenient access to float, double and long double values,
706but combined with template struct and functions to allow simultaneous use
707with other non-built-in floating-point types.
708
709
710[h4 Why do the constants (internally) have a struct rather than a simple function?]
711
712A function mechanism was provided by in previous versions of Boost.Math.
713
714The new mechanism is to permit partial specialization. See Custom Specializing a constant above.
715It should also allow use with other packages like [@http://www.ttmath.org/ ttmath Bignum C++ library.]
716
717[h4 Where can I find other high precision constants?]
718
719# Constants with very high precision and good accuracy (>40 decimal digits)
720from Simon Plouffe's web based collection [@http://pi.lacim.uqam.ca/eng/].
721# [@https://oeis.org/ The On-Line Encyclopedia of Integer Sequences (OEIS)]
722# Checks using  printed text optically scanned values and converted from:
723D. E. Knuth, Art of Computer Programming, Appendix A, Table 1, Vol 1, ISBN 0 201 89683 4 (1997)
724# M. Abrahamovitz & I. E. Stegun, National Bureau of Standards, Handbook of Mathematical Functions,
725a reference source for formulae now superseded by
726# Frank W. Olver, Daniel W. Lozier, Ronald F. Boisvert, Charles W. Clark, NIST Handbook of Mathematical Functions, Cambridge University Press, ISBN 978-0-521-14063-8, 2010.
727# John F Hart, Computer Approximations, Kreiger (1978) ISBN 0 88275 642 7.
728# Some values from Cephes Mathematical Library, Stephen L. Moshier
729and CALC100 100 decimal digit Complex Variable Calculator Program, a DOS utility.
730# Xavier Gourdon, Pascal Sebah, 50 decimal digits constants at [@http://numbers.computation.free.fr/Constants/constants.html Number, constants and computation].
731
732[h4 Where are Physical Constants?]
733
734Not here in this Boost.Math collection, because physical constants:
735
736* Are measurements, not truly constants.
737* Are not truly constant and keeping changing as mensuration technology improves.
738* Have a intrinsic uncertainty.
739* Mathematical constants are stored and represented at varying precision, but should never be inaccurate.
740
741Some physical constants may be available in Boost.Units.
742
743[endsect] [/section:FAQ FAQ]
744
745[endmathpart] [/section:constants Mathematical Constants]
746
747[/
748  Copyright 2012 John Maddock and Paul A. Bristow.
749  Distributed under the Boost Software License, Version 1.0.
750  (See accompanying file LICENSE_1_0.txt or copy at
751  http://www.boost.org/LICENSE_1_0.txt).
752]
753
754
755