• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1[template tr1_overview[]
2Many of the special functions included in this library are also a part
3of the either the [C99] or the [tr1].  Therefore this library
4includes a thin wrapper header `boost/math/tr1.hpp` that provides
5compatibility with these two standards.
6
7There are various pros and cons to using the library in this way:
8
9Pros:
10
11* The header to include is lightweight (i.e. fast to compile).
12* The functions have extern "C" linkage,
13  and so are usable from other languages (not just C and C++).
14* C99 and C++ TR1 Standard compatibility.
15
16Cons:
17
18* You will need to compile and link to the external Boost.Math libraries.
19* Limited to support for the types, `float`, `double` and `long double`.
20* Error handling is handled via setting ::errno and returning NaN's and
21infinities: this may be less flexible than an C++ exception based approach.
22
23[note The separate libraries are required *only* if you choose to use
24boost/math/tr1.hpp rather than some other Boost.Math header, the rest
25of Boost.Math remains header-only.]
26
27The separate libraries required in order to use tr1.hpp can be compiled
28using bjam from within the libs/math/build directory, or from the Boost
29root directory using the usual Boost-wide install procedure.
30Alternatively the source files are located in libs/math/src and each have
31the same name as the function they implement.  The various libraries are
32named as follows:
33
34[table
35[[Name][Type][Functions]]
36[[boost_math_c99f-<suffix>][float][C99 Functions]]
37[[boost_math_c99-<suffix>][double][C99 Functions]]
38[[boost_math_c99l-<suffix>][long double][C99 Functions]]
39[[boost_math_tr1f-<suffix>][float][TR1 Functions]]
40[[boost_math_tr1-<suffix>][double][TR1 Functions]]
41[[boost_math_tr1l-<suffix>][long double][TR1 Functions]]
42]
43
44Where `<suffix>` encodes the compiler and build options used to
45build the libraries: for example "libboost_math_tr1-vc80-mt-gd.lib"
46would be the statically linked TR1 library to use with Visual C++ 8.0,
47in multithreading debug mode, with the DLL VC++ runtime, where as
48"boost_math_tr1-vc80-mt.lib" would be import library for the TR1 DLL
49to be used with Visual C++ 8.0 with the release multithreaded DLL
50VC++ runtime.
51Refer to the getting started guide for a
52[@http://www.boost.org/doc/libs/1_35_0/more/getting_started/windows.html#library-naming
53full explanation of the `<suffix>` meanings].
54
55[note
56Visual C++ users will typically have the correct library variant to link
57against selected for them by boost/math/tr1.hpp based on your compiler
58settings.
59
60Users will need to define BOOST_MATH_TR1_DYN_LINK when building
61their code if they want to link against the DLL versions of these libraries
62rather than the static versions.
63
64Users can disable auto-linking by defining BOOST_MATH_TR1_NO_LIB when
65building: this is typically only used when linking against a customised
66build of the libraries.]
67
68[note Linux and Unix users will generally only have one variant of
69these libraries installed, and can generally just link against
70-lboost_math_tr1 etc.]
71
72[h4 Usage Recommendations]
73
74This library now presents the user with a choice:
75
76* To include the header only versions of the functions and have
77an easier time linking, but a longer compile time.
78* To include the TR1 headers and link against an external library.
79
80Which option you choose depends largely on how you prefer to work
81and how your system is set up.
82
83For example a casual user who just needs the acosh function, would
84probably be better off including `<boost/math/special_functions/acosh.hpp>`
85and using `boost::math::acosh(x)` in their code.
86
87However, for large scale
88software development where compile times are significant, and where the
89Boost libraries are already built and installed on the system, then
90including `<boost/math/tr1.hpp>` and using `boost::math::tr1::acosh(x)`
91will speed up compile times, reduce object files sizes (since there are
92no templates being instantiated any more), and also speed up debugging
93runtimes - since the externally compiled libraries can be
94compiler optimised, rather than built using full settings - the difference
95in performance between
96[link math_toolkit.getting_best
97release and debug builds can be as much as 20 times],
98so for complex applications this can be a big win.
99
100[h4 Supported C99 Functions]
101
102See also the [link math_toolkit.c99
103quick reference guide for these functions].
104
105   namespace boost{ namespace math{ namespace tr1{ extern "C"{
106
107   typedef unspecified float_t;
108   typedef unspecified double_t;
109
110   double acosh(double x);
111   float acoshf(float x);
112   long double acoshl(long double x);
113
114   double asinh(double x);
115   float asinhf(float x);
116   long double asinhl(long double x);
117
118   double atanh(double x);
119   float atanhf(float x);
120   long double atanhl(long double x);
121
122   double cbrt(double x);
123   float cbrtf(float x);
124   long double cbrtl(long double x);
125
126   double copysign(double x, double y);
127   float copysignf(float x, float y);
128   long double copysignl(long double x, long double y);
129
130   double erf(double x);
131   float erff(float x);
132   long double erfl(long double x);
133
134   double erfc(double x);
135   float erfcf(float x);
136   long double erfcl(long double x);
137
138   double expm1(double x);
139   float expm1f(float x);
140   long double expm1l(long double x);
141
142   double fmax(double x, double y);
143   float fmaxf(float x, float y);
144   long double fmaxl(long double x, long double y);
145
146   double fmin(double x, double y);
147   float fminf(float x, float y);
148   long double fminl(long double x, long double y);
149
150   double hypot(double x, double y);
151   float hypotf(float x, float y);
152   long double hypotl(long double x, long double y);
153
154   double lgamma(double x);
155   float lgammaf(float x);
156   long double lgammal(long double x);
157
158   long long llround(double x);
159   long long llroundf(float x);
160   long long llroundl(long double x);
161
162   double log1p(double x);
163   float log1pf(float x);
164   long double log1pl(long double x);
165
166   long lround(double x);
167   long lroundf(float x);
168   long lroundl(long double x);
169
170   double nextafter(double x, double y);
171   float nextafterf(float x, float y);
172   long double nextafterl(long double x, long double y);
173
174   double nexttoward(double x, long double y);
175   float nexttowardf(float x, long double y);
176   long double nexttowardl(long double x, long double y);
177
178   double round(double x);
179   float roundf(float x);
180   long double roundl(long double x);
181
182   double tgamma(double x);
183   float tgammaf(float x);
184   long double tgammal(long double x);
185
186   double trunc(double x);
187   float truncf(float x);
188   long double truncl(long double x);
189
190   }}}} // namespaces
191
192[h4 Supported TR1 Functions]
193
194See also the [link math_toolkit.main_tr1
195quick reference guide for these functions].
196
197   namespace boost{ namespace math{ namespace tr1{ extern "C"{
198
199   // [5.2.1.1] associated Laguerre polynomials:
200   double assoc_laguerre(unsigned n, unsigned m, double x);
201   float assoc_laguerref(unsigned n, unsigned m, float x);
202   long double assoc_laguerrel(unsigned n, unsigned m, long double x);
203
204   // [5.2.1.2] associated Legendre functions:
205   double assoc_legendre(unsigned l, unsigned m, double x);
206   float assoc_legendref(unsigned l, unsigned m, float x);
207   long double assoc_legendrel(unsigned l, unsigned m, long double x);
208
209   // [5.2.1.3] beta function:
210   double beta(double x, double y);
211   float betaf(float x, float y);
212   long double betal(long double x, long double y);
213
214   // [5.2.1.4] (complete) elliptic integral of the first kind:
215   double comp_ellint_1(double k);
216   float comp_ellint_1f(float k);
217   long double comp_ellint_1l(long double k);
218
219   // [5.2.1.5] (complete) elliptic integral of the second kind:
220   double comp_ellint_2(double k);
221   float comp_ellint_2f(float k);
222   long double comp_ellint_2l(long double k);
223
224   // [5.2.1.6] (complete) elliptic integral of the third kind:
225   double comp_ellint_3(double k, double nu);
226   float comp_ellint_3f(float k, float nu);
227   long double comp_ellint_3l(long double k, long double nu);
228
229   // [5.2.1.8] regular modified cylindrical Bessel functions:
230   double cyl_bessel_i(double nu, double x);
231   float cyl_bessel_if(float nu, float x);
232   long double cyl_bessel_il(long double nu, long double x);
233
234   // [5.2.1.9] cylindrical Bessel functions (of the first kind):
235   double cyl_bessel_j(double nu, double x);
236   float cyl_bessel_jf(float nu, float x);
237   long double cyl_bessel_jl(long double nu, long double x);
238
239   // [5.2.1.10] irregular modified cylindrical Bessel functions:
240   double cyl_bessel_k(double nu, double x);
241   float cyl_bessel_kf(float nu, float x);
242   long double cyl_bessel_kl(long double nu, long double x);
243
244   // [5.2.1.11] cylindrical Neumann functions;
245   // cylindrical Bessel functions (of the second kind):
246   double cyl_neumann(double nu, double x);
247   float cyl_neumannf(float nu, float x);
248   long double cyl_neumannl(long double nu, long double x);
249
250   // [5.2.1.12] (incomplete) elliptic integral of the first kind:
251   double ellint_1(double k, double phi);
252   float ellint_1f(float k, float phi);
253   long double ellint_1l(long double k, long double phi);
254
255   // [5.2.1.13] (incomplete) elliptic integral of the second kind:
256   double ellint_2(double k, double phi);
257   float ellint_2f(float k, float phi);
258   long double ellint_2l(long double k, long double phi);
259
260   // [5.2.1.14] (incomplete) elliptic integral of the third kind:
261   double ellint_3(double k, double nu, double phi);
262   float ellint_3f(float k, float nu, float phi);
263   long double ellint_3l(long double k, long double nu, long double phi);
264
265   // [5.2.1.15] exponential integral:
266   double expint(double x);
267   float expintf(float x);
268   long double expintl(long double x);
269
270   // [5.2.1.16] Hermite polynomials:
271   double hermite(unsigned n, double x);
272   float hermitef(unsigned n, float x);
273   long double hermitel(unsigned n, long double x);
274
275   // [5.2.1.18] Laguerre polynomials:
276   double laguerre(unsigned n, double x);
277   float laguerref(unsigned n, float x);
278   long double laguerrel(unsigned n, long double x);
279
280   // [5.2.1.19] Legendre polynomials:
281   double legendre(unsigned l, double x);
282   float legendref(unsigned l, float x);
283   long double legendrel(unsigned l, long double x);
284
285   // [5.2.1.20] Riemann zeta function:
286   double riemann_zeta(double);
287   float riemann_zetaf(float);
288   long double riemann_zetal(long double);
289
290   // [5.2.1.21] spherical Bessel functions (of the first kind):
291   double sph_bessel(unsigned n, double x);
292   float sph_besself(unsigned n, float x);
293   long double sph_bessell(unsigned n, long double x);
294
295   // [5.2.1.22] spherical associated Legendre functions:
296   double sph_legendre(unsigned l, unsigned m, double theta);
297   float sph_legendref(unsigned l, unsigned m, float theta);
298   long double sph_legendrel(unsigned l, unsigned m, long double theta);
299
300   // [5.2.1.23] spherical Neumann functions;
301   // spherical Bessel functions (of the second kind):
302   double sph_neumann(unsigned n, double x);
303   float sph_neumannf(unsigned n, float x);
304   long double sph_neumannl(unsigned n, long double x);
305
306   }}}} // namespaces
307
308In addition sufficient additional overloads of the `double` versions of the
309above functions are provided, so that calling the function with any mixture
310of `float`, `double`, `long double`, or /integer/ arguments is supported, with the
311return type determined by the __arg_promotion_rules.
312
313[h4 Currently Unsupported C99 Functions]
314
315   double exp2(double x);
316   float exp2f(float x);
317   long double exp2l(long double x);
318
319   double fdim(double x, double y);
320   float fdimf(float x, float y);
321   long double fdiml(long double x, long double y);
322
323   double fma(double x, double y, double z);
324   float fmaf(float x, float y, float z);
325   long double fmal(long double x, long double y, long double z);
326
327   int ilogb(double x);
328   int ilogbf(float x);
329   int ilogbl(long double x);
330
331   long long llrint(double x);
332   long long llrintf(float x);
333   long long llrintl(long double x);
334
335   double log2(double x);
336   float log2f(float x);
337   long double log2l(long double x);
338
339   double logb(double x);
340   float logbf(float x);
341   long double logbl(long double x);
342
343   long lrint(double x);
344   long lrintf(float x);
345   long lrintl(long double x);
346
347   double nan(const char *str);
348   float nanf(const char *str);
349   long double nanl(const char *str);
350
351   double nearbyint(double x);
352   float nearbyintf(float x);
353   long double nearbyintl(long double x);
354
355   double remainder(double x, double y);
356   float remainderf(float x, float y);
357   long double remainderl(long double x, long double y);
358
359   double remquo(double x, double y, int *pquo);
360   float remquof(float x, float y, int *pquo);
361   long double remquol(long double x, long double y, int *pquo);
362
363   double rint(double x);
364   float rintf(float x);
365   long double rintl(long double x);
366
367   double scalbln(double x, long ex);
368   float scalblnf(float x, long ex);
369   long double scalblnl(long double x, long ex);
370
371   double scalbn(double x, int ex);
372   float scalbnf(float x, int ex);
373   long double scalbnl(long double x, int ex);
374
375[h4 Currently Unsupported TR1 Functions]
376
377   // [5.2.1.7] confluent hypergeometric functions:
378   double conf_hyperg(double a, double c, double x);
379   float conf_hypergf(float a, float c, float x);
380   long double conf_hypergl(long double a, long double c, long double x);
381
382   // [5.2.1.17] hypergeometric functions:
383   double hyperg(double a, double b, double c, double x);
384   float hypergf(float a, float b, float c, float x);
385   long double hypergl(long double a, long double b, long double c,
386   long double x);
387
388]
389
390[/
391  Copyright 2008 John Maddock and Paul A. Bristow.
392  Distributed under the Boost Software License, Version 1.0.
393  (See accompanying file LICENSE_1_0.txt or copy at
394  http://www.boost.org/LICENSE_1_0.txt).
395]
396
397
398