Merge pull request #146 from boostorg/lambertw
PR for integration testing of LambertW
@@ -8,9 +8,9 @@ should consult your favorite textbook.
|
||||
|
||||
Imagine that you want to approximate some function f(x) by way of a rational
|
||||
function R(x), where R(x) may be either a polynomial P(x) or a ratio of two
|
||||
polynomials P(x)/Q(x) (a rational function). Initially we'll concentrate on the
|
||||
polynomial case, as it's by far the easier to deal with, later we'll extend
|
||||
to the full rational function case.
|
||||
polynomials P(x)/Q(x) (a rational function). Initially we'll concentrate on the
|
||||
polynomial case, as it's by far the easier to deal with, later we'll extend
|
||||
to the full rational function case.
|
||||
|
||||
We want to find the "best" rational approximation, where
|
||||
"best" is defined to be the approximation that has the least deviation
|
||||
@@ -61,11 +61,11 @@ the range \[-1, 1\].
|
||||
|
||||
Before we can begin the Remez method, we must obtain an initial value
|
||||
for the location of the extrema of the error function. We could "guess"
|
||||
these, but a much closer first approximation can be obtained by first
|
||||
these, but a much closer first approximation can be obtained by first
|
||||
constructing an interpolated polynomial approximation to f(x).
|
||||
|
||||
In order to obtain the N+1 coefficients of the interpolated polynomial
|
||||
we need N+1 points (x[sub 0]...x[sub N]): with our interpolated form
|
||||
we need N+1 points (x[sub 0]...x[sub N]): with our interpolated form
|
||||
passing through each of those points
|
||||
that yields N+1 simultaneous equations:
|
||||
|
||||
@@ -73,12 +73,12 @@ f(x[sub i]) = P(x[sub i]) = c[sub 0] + c[sub 1]x[sub i] ... + c[sub N]x[sub i][s
|
||||
|
||||
Which can be solved for the coefficients c[sub 0]...c[sub N] in P(x).
|
||||
|
||||
Obviously this is not a minimax solution, indeed our only guarantee is that f(x) and
|
||||
Obviously this is not a minimax solution, indeed our only guarantee is that f(x) and
|
||||
P(x) touch at N+1 locations, away from those points the error may be arbitrarily
|
||||
large. However, we would clearly like this initial approximation to be as close to
|
||||
f(x) as possible, and it turns out that using the zeros of an orthogonal polynomial
|
||||
as the initial interpolation points is a good choice. In our example we'll use the
|
||||
zeros of a Chebyshev polynomial as these are particularly easy to calculate,
|
||||
as the initial interpolation points is a good choice. In our example we'll use the
|
||||
zeros of a Chebyshev polynomial as these are particularly easy to calculate,
|
||||
interpolating for a polynomial of degree 4, and measuring /relative error/
|
||||
we get the following error function:
|
||||
|
||||
@@ -86,7 +86,7 @@ we get the following error function:
|
||||
|
||||
Which has a peak relative error of 1.2x10[super -3].
|
||||
|
||||
While this is a pretty good approximation already, judging by the
|
||||
While this is a pretty good approximation already, judging by the
|
||||
shape of the error function we can clearly do better. Before starting
|
||||
on the Remez method propper, we have one more step to perform: locate
|
||||
all the extrema of the error function, and store
|
||||
@@ -101,7 +101,7 @@ achieve, and typically is very close to the minimax solution.
|
||||
|
||||
However, if we want to optimise for /relative error/, or if the approximation
|
||||
is a rational function, then the initial Chebyshev solution can be quite far
|
||||
from the ideal minimax solution.
|
||||
from the ideal minimax solution.
|
||||
|
||||
A more technical discussion of the theory involved can be found in this
|
||||
[@http://math.fullerton.edu/mathews/n2003/ChebyshevPolyMod.html online course].]
|
||||
@@ -118,7 +118,7 @@ To obtain the error term E, and the coefficients of the polynomial P(x).
|
||||
|
||||
This gives us a new approximation to f(x) that has the same error /E/ at
|
||||
each of the control points, and whose error function ['alternates in sign]
|
||||
at the control points. This is still not necessarily the minimax
|
||||
at the control points. This is still not necessarily the minimax
|
||||
solution though: since the control points may not be at the extrema of the error
|
||||
function. After this first step here's what our approximation's error
|
||||
function looks like:
|
||||
@@ -131,10 +131,10 @@ dropped to 5.6x10[super -4].
|
||||
|
||||
[h4 Remez Step 2]
|
||||
|
||||
The second step is to locate the extrema of the new approximation, which we do
|
||||
The second step is to locate the extrema of the new approximation, which we do
|
||||
in two stages: first, since the error function changes sign at each
|
||||
control point, we must have N+1 roots of the error function located between
|
||||
each pair of N+2 control points. Once these roots are found by standard root finding
|
||||
each pair of N+2 control points. Once these roots are found by standard root finding
|
||||
techniques, we know that N extrema are bracketed between each pair of
|
||||
roots, plus two more between the endpoints of the range and the first and last roots.
|
||||
The N+2 extrema can then be found using standard function minimisation techniques.
|
||||
@@ -195,10 +195,10 @@ polynomial alternatives. For example, if we takes our previous example
|
||||
of an approximation to e[super x], we obtained 5x10[super -4] accuracy
|
||||
with an order 4 polynomial. If we move two of the unknowns into the denominator
|
||||
to give a pair of order 2 polynomials, and re-minimise, then the peak relative error drops
|
||||
to 8.7x10[super -5]. That's a 5 fold increase in accuracy, for the same number
|
||||
to 8.7x10[super -5]. That's a 5 fold increase in accuracy, for the same number
|
||||
of terms overall.
|
||||
|
||||
[h4 Practical Considerations]
|
||||
[h4:remez_practical Practical Considerations]
|
||||
|
||||
Most treatises on approximation theory stop at this point. However, from
|
||||
a practical point of view, most of the work involves finding the right
|
||||
@@ -211,12 +211,12 @@ f(x) = R(x)
|
||||
|
||||
But this will converge to a useful approximation only if f(x) is smooth. In
|
||||
addition round-off errors when evaluating the rational form mean that this
|
||||
will never get closer than within a few epsilon of machine precision.
|
||||
will never get closer than within a few epsilon of machine precision.
|
||||
Therefore this form of direct approximation is often reserved for situations
|
||||
where we want efficiency, rather than accuracy.
|
||||
|
||||
The first step in improving the situation is generally to split f(x) into
|
||||
a dominant part that we can compute accurately by another method, and a
|
||||
a dominant part that we can compute accurately by another method, and a
|
||||
slowly changing remainder which can be approximated by a rational approximation.
|
||||
We might be tempted to write:
|
||||
|
||||
@@ -235,7 +235,7 @@ to the constant /c/, that error will effectively get wiped out when R(x) is adde
|
||||
|
||||
The difficult part is obviously finding the right g(x) to extract from your
|
||||
function: often the asymptotic behaviour of the function will give a clue, so
|
||||
for example the function __erfc becomes proportional to
|
||||
for example the function __erfc becomes proportional to
|
||||
e[super -x[super 2]]\/x as x becomes large. Therefore using:
|
||||
|
||||
erfc(z) = (C + R(x)) e[super -x[super 2]]/x
|
||||
@@ -262,15 +262,15 @@ the roots, the approximation is nonetheless useless.
|
||||
Assuming that the approximation does not have any fatal errors, and that the only
|
||||
issue is converging adequately on the minimax solution, the aim is to
|
||||
get as close as possible to the minimax solution before beginning the Remez method.
|
||||
Using the zeros of a Chebyshev polynomial for the initial interpolation is a
|
||||
Using the zeros of a Chebyshev polynomial for the initial interpolation is a
|
||||
good start, but may not be ideal when dealing with relative errors and\/or
|
||||
rational (rather than polynomial) approximations. One approach is to skew
|
||||
the initial interpolation points to one end: for example if we raise the
|
||||
roots of the Chebyshev polynomial to a positive power greater than 1
|
||||
then the roots will be skewed towards the middle of the \[-1,1\] interval,
|
||||
roots of the Chebyshev polynomial to a positive power greater than 1
|
||||
then the roots will be skewed towards the middle of the \[-1,1\] interval,
|
||||
while a positive power less than one
|
||||
will skew them towards either end. More usefully, if we initially rescale the
|
||||
points over \[0,1\] and then raise to a positive power, we can skew them to the left
|
||||
points over \[0,1\] and then raise to a positive power, we can skew them to the left
|
||||
or right. Returning to our example of e[super x][space] over \[-1,1\], the initial
|
||||
interpolated form was some way from the minimax solution:
|
||||
|
||||
@@ -287,7 +287,7 @@ our desired minimax solution (5x10[super -4]).
|
||||
|
||||
[h4 Remez Method Checklist]
|
||||
|
||||
The following lists some of the things to check if the Remez method goes wrong,
|
||||
The following lists some of the things to check if the Remez method goes wrong,
|
||||
it is by no means an exhaustive list, but is provided in the hopes that it will
|
||||
prove useful.
|
||||
|
||||
@@ -312,7 +312,7 @@ location, try starting from a different location.
|
||||
* If a rational function won't converge, one can minimise a polynomial
|
||||
(which presents no problems), then rotate one term from the numerator to
|
||||
the denominator and minimise again. In theory one can continue moving
|
||||
terms one at a time from numerator to denominator, and then re-minimising,
|
||||
terms one at a time from numerator to denominator, and then re-minimising,
|
||||
retaining the last set of control points at each stage.
|
||||
* Try using a smaller interval. It may also be possible to optimise over
|
||||
one (small) interval, rescale the control points over a larger interval,
|
||||
@@ -325,41 +325,41 @@ over, say \[0, b\], for some smallish value /b/.
|
||||
The original references for the Remez Method and it's extension
|
||||
to rational functions are unfortunately in Russian:
|
||||
|
||||
Remez, E.Ya., ['Fundamentals of numerical methods for Chebyshev approximations],
|
||||
Remez, E.Ya., ['Fundamentals of numerical methods for Chebyshev approximations],
|
||||
"Naukova Dumka", Kiev, 1969.
|
||||
|
||||
Remez, E.Ya., Gavrilyuk, V.T., ['Computer development of certain approaches
|
||||
to the approximate construction of solutions of Chebyshev problems
|
||||
Remez, E.Ya., Gavrilyuk, V.T., ['Computer development of certain approaches
|
||||
to the approximate construction of solutions of Chebyshev problems
|
||||
nonlinearly depending on parameters], Ukr. Mat. Zh. 12 (1960), 324-338.
|
||||
|
||||
Gavrilyuk, V.T., ['Generalization of the first polynomial algorithm of
|
||||
E.Ya.Remez for the problem of constructing rational-fractional
|
||||
Gavrilyuk, V.T., ['Generalization of the first polynomial algorithm of
|
||||
E.Ya.Remez for the problem of constructing rational-fractional
|
||||
Chebyshev approximations], Ukr. Mat. Zh. 16 (1961), 575-585.
|
||||
|
||||
Some English language sources include:
|
||||
|
||||
Fraser, W., Hart, J.F., ['On the computation of rational approximations
|
||||
Fraser, W., Hart, J.F., ['On the computation of rational approximations
|
||||
to continuous functions], Comm. of the ACM 5 (1962), 401-403, 414.
|
||||
|
||||
Ralston, A., ['Rational Chebyshev approximation by Remes' algorithms],
|
||||
Ralston, A., ['Rational Chebyshev approximation by Remes' algorithms],
|
||||
Numer.Math. 7 (1965), no. 4, 322-330.
|
||||
|
||||
A. Ralston, ['Rational Chebyshev approximation, Mathematical
|
||||
Methods for Digital Computers v. 2] (Ralston A., Wilf H., eds.),
|
||||
A. Ralston, ['Rational Chebyshev approximation, Mathematical
|
||||
Methods for Digital Computers v. 2] (Ralston A., Wilf H., eds.),
|
||||
Wiley, New York, 1967, pp. 264-284.
|
||||
|
||||
Hart, J.F. e.a., ['Computer approximations], Wiley, New York a.o., 1968.
|
||||
|
||||
Cody, W.J., Fraser, W., Hart, J.F., ['Rational Chebyshev approximation
|
||||
Cody, W.J., Fraser, W., Hart, J.F., ['Rational Chebyshev approximation
|
||||
using linear equations], Numer.Math. 12 (1968), 242-251.
|
||||
|
||||
Cody, W.J., ['A survey of practical rational and polynomial
|
||||
Cody, W.J., ['A survey of practical rational and polynomial
|
||||
approximation of functions], SIAM Review 12 (1970), no. 3, 400-423.
|
||||
|
||||
Barrar, R.B., Loeb, H.J., ['On the Remez algorithm for non-linear
|
||||
Barrar, R.B., Loeb, H.J., ['On the Remez algorithm for non-linear
|
||||
families], Numer.Math. 15 (1970), 382-391.
|
||||
|
||||
Dunham, Ch.B., ['Convergence of the Fraser-Hart algorithm for rational
|
||||
Dunham, Ch.B., ['Convergence of the Fraser-Hart algorithm for rational
|
||||
Chebyshev approximation], Math. Comp. 29 (1975), no. 132, 1078-1082.
|
||||
|
||||
G. L. Litvinov, ['Approximate construction of rational
|
||||
@@ -368,7 +368,7 @@ Russian Journal of Mathematical Physics, vol.1, No. 3, 1994.
|
||||
|
||||
[endsect][/section:remez The Remez Method]
|
||||
|
||||
[/
|
||||
[/
|
||||
Copyright 2006 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
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
[section:nmp Non-Member Properties]
|
||||
|
||||
Properties that are common to all distributions are accessed via non-member
|
||||
Properties that are common to all distributions are accessed via non-member
|
||||
getter functions: non-membership allows more of these functions to be added over time,
|
||||
as the need arises. Unfortunately the literature uses many different and
|
||||
confusing names to refer to a rather small number of actual concepts; refer
|
||||
to the [link math_toolkit.dist_ref.nmp.concept_index concept index] to find the property you
|
||||
want by the name you are most familiar with.
|
||||
to the [link math_toolkit.dist_ref.nmp.concept_index concept index] to find the property you
|
||||
want by the name you are most familiar with.
|
||||
Or use the [link math_toolkit.dist_ref.nmp.function_index function index]
|
||||
to go straight to the function you want if you already know its name.
|
||||
|
||||
@@ -62,8 +62,8 @@ to go straight to the function you want if you already know its name.
|
||||
|
||||
template <class RealType, class ``__Policy``>
|
||||
RealType cdf(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist, const RealType& x);
|
||||
|
||||
The __cdf is the probability that
|
||||
|
||||
The __cdf is the probability that
|
||||
the variable takes a value less than or equal to x. It is equivalent
|
||||
to the integral from -infinity to x of the __pdf.
|
||||
|
||||
@@ -79,11 +79,11 @@ normal distribution:
|
||||
|
||||
template <class Distribution, class RealType>
|
||||
RealType cdf(const ``['Unspecified-Complement-Type]``<Distribution, RealType>& comp);
|
||||
|
||||
The complement of the __cdf
|
||||
is the probability that
|
||||
|
||||
The complement of the __cdf
|
||||
is the probability that
|
||||
the variable takes a value greater than x. It is equivalent
|
||||
to the integral from x to infinity of the __pdf, or 1 minus the __cdf of x.
|
||||
to the integral from x to infinity of the __pdf, or 1 minus the __cdf of x.
|
||||
|
||||
This is also known as the survival function.
|
||||
|
||||
@@ -118,7 +118,7 @@ the defined range for the distribution.
|
||||
[equation hazard]
|
||||
|
||||
[caution
|
||||
Some authors refer to this as the conditional failure
|
||||
Some authors refer to this as the conditional failure
|
||||
density function rather than the hazard function.]
|
||||
|
||||
[h4:chf Cumulative Hazard Function]
|
||||
@@ -133,14 +133,14 @@ the defined range for the distribution.
|
||||
|
||||
[equation chf]
|
||||
|
||||
[caution
|
||||
[caution
|
||||
Some authors refer to this as simply the "Hazard Function".]
|
||||
|
||||
[h4:mean mean]
|
||||
|
||||
template<class RealType, class ``__Policy``>
|
||||
RealType mean(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
|
||||
Returns the mean of the distribution /dist/.
|
||||
|
||||
This function may return a __domain_error if the distribution does not have
|
||||
@@ -150,14 +150,14 @@ a defined mean (for example the Cauchy distribution).
|
||||
|
||||
template<class RealType, class ``__Policy``>
|
||||
RealType median(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
|
||||
Returns the median of the distribution /dist/.
|
||||
|
||||
[h4:mode mode]
|
||||
|
||||
template<class RealType, ``__Policy``>
|
||||
RealType mode(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
|
||||
Returns the mode of the distribution /dist/.
|
||||
|
||||
This function may return a __domain_error if the distribution does not have
|
||||
@@ -167,14 +167,14 @@ a defined mode.
|
||||
|
||||
template <class RealType, class ``__Policy``>
|
||||
RealType pdf(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist, const RealType& x);
|
||||
|
||||
For a continuous function, the probability density function (pdf) returns
|
||||
the probability that the variate has the value x.
|
||||
Since for continuous distributions the probability at a single point is actually zero,
|
||||
|
||||
For a continuous function, the probability density function (pdf) returns
|
||||
the probability that the variate has the value x.
|
||||
Since for continuous distributions the probability at a single point is actually zero,
|
||||
the probability is better expressed as the integral of the pdf between two points:
|
||||
see the __cdf.
|
||||
|
||||
For a discrete distribution, the pdf is the probability that the
|
||||
For a discrete distribution, the pdf is the probability that the
|
||||
variate takes the value x.
|
||||
|
||||
This function may return a __domain_error if the random variable is outside
|
||||
@@ -188,14 +188,14 @@ For example, for a standard normal distribution the pdf looks like this:
|
||||
|
||||
template<class RealType, class ``__Policy``>
|
||||
std::pair<RealType, RealType> range(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
|
||||
Returns the valid range of the random variable over distribution /dist/.
|
||||
|
||||
[h4:quantile Quantile]
|
||||
|
||||
template <class RealType, class ``__Policy``>
|
||||
RealType quantile(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist, const RealType& p);
|
||||
|
||||
|
||||
The quantile is best viewed as the inverse of the __cdf, it returns
|
||||
a value /x/ such that `cdf(dist, x) == p`.
|
||||
|
||||
@@ -217,7 +217,7 @@ See also [link math_toolkit.stat_tut.overview.complements complements].
|
||||
|
||||
template <class Distribution, class RealType>
|
||||
RealType quantile(const ``['Unspecified-Complement-Type]``<Distribution, RealType>& comp);
|
||||
|
||||
|
||||
This is the inverse of the __ccdf. It is calculated by wrapping
|
||||
the arguments in a call to the quantile function in a call to
|
||||
/complement/. For example:
|
||||
@@ -250,8 +250,8 @@ distribution:
|
||||
|
||||
template <class RealType, class ``__Policy``>
|
||||
RealType standard_deviation(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
Returns the standard deviation of distribution /dist/.
|
||||
|
||||
Returns the standard deviation of distribution /dist/.
|
||||
|
||||
This function may return a __domain_error if the distribution does not have
|
||||
a defined standard deviation.
|
||||
@@ -260,7 +260,7 @@ a defined standard deviation.
|
||||
|
||||
template<class RealType, class ``__Policy``>
|
||||
std::pair<RealType, RealType> support(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
|
||||
Returns the supported range of random variable over the distribution /dist/.
|
||||
|
||||
The distribution is said to be 'supported' over a range that is
|
||||
@@ -274,7 +274,7 @@ Outside are uninteresting zones where the pdf is zero, and the cdf zero or unity
|
||||
|
||||
template <class RealType, class ``__Policy``>
|
||||
RealType variance(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
|
||||
Returns the variance of the distribution /dist/.
|
||||
|
||||
This function may return a __domain_error if the distribution does not have
|
||||
@@ -284,7 +284,7 @@ a defined variance.
|
||||
|
||||
template <class RealType, class ``__Policy``>
|
||||
RealType skewness(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
|
||||
Returns the skewness of the distribution /dist/.
|
||||
|
||||
This function may return a __domain_error if the distribution does not have
|
||||
@@ -294,7 +294,7 @@ a defined skewness.
|
||||
|
||||
template <class RealType, class ``__Policy``>
|
||||
RealType kurtosis(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
|
||||
Returns the 'proper' kurtosis (normalized fourth moment) of the distribution /dist/.
|
||||
|
||||
kertosis = [beta][sub 2][space]= [mu][sub 4][space] / [mu][sub 2][super 2]
|
||||
@@ -326,7 +326,7 @@ a defined kurtosis.
|
||||
|
||||
template <class RealType, ``__Policy``>
|
||||
RealType kurtosis_excess(const ``['Distribution-Type]``<RealType, ``__Policy``>& dist);
|
||||
|
||||
|
||||
Returns the kurtosis excess of the distribution /dist/.
|
||||
|
||||
kurtosis excess = [gamma][sub 2][space]= [mu][sub 4][space] / [mu][sub 2][super 2][space]- 3 = kurtosis - 3
|
||||
@@ -334,7 +334,7 @@ kurtosis excess = [gamma][sub 2][space]= [mu][sub 4][space] / [mu][sub 2][super
|
||||
Where [mu][sub i][space] is the i'th central moment of the distribution, and
|
||||
in particular [mu][sub 2][space] is the variance of the distribution.
|
||||
|
||||
The kurtosis excess is a measure of the "peakedness" of a distribution, and
|
||||
The kurtosis excess is a measure of the "peakedness" of a distribution, and
|
||||
is more widely used than the "kurtosis proper". It is defined so that
|
||||
the kurtosis excess of a normal distribution is zero.
|
||||
|
||||
@@ -344,7 +344,7 @@ a defined kurtosis excess.
|
||||
Kurtosis excess can have a value from -2 to + infinity.
|
||||
|
||||
kurtosis = kurtosis_excess +3;
|
||||
|
||||
|
||||
The kurtosis excess of a normal distribution is zero.
|
||||
|
||||
[h4:cdfPQ P and Q]
|
||||
@@ -361,12 +361,12 @@ the __quantile.
|
||||
|
||||
[h4:cdf_inv Inverse CDF Function.]
|
||||
|
||||
The inverse of the cumulative distribution function, is the same as the
|
||||
The inverse of the cumulative distribution function, is the same as the
|
||||
__quantile.
|
||||
|
||||
[h4:survival_inv Inverse Survival Function.]
|
||||
|
||||
The inverse of the survival function, is the same as computing the
|
||||
The inverse of the survival function, is the same as computing the
|
||||
[link math_toolkit.dist_ref.nmp.quantile_c quantile
|
||||
from the complement of the probability].
|
||||
|
||||
@@ -380,13 +380,13 @@ while the term __pdf applies to continuous distributions.
|
||||
[h4:lower_critical Lower Critical Value.]
|
||||
|
||||
The lower critical value calculates the value of the random variable
|
||||
given the area under the left tail of the distribution.
|
||||
given the area under the left tail of the distribution.
|
||||
It is equivalent to calculating the __quantile.
|
||||
|
||||
[h4: upper_critical Upper Critical Value.]
|
||||
[h4:upper_critical Upper Critical Value.]
|
||||
|
||||
The upper critical value calculates the value of the random variable
|
||||
given the area under the right tail of the distribution. It is equivalent to
|
||||
given the area under the right tail of the distribution. It is equivalent to
|
||||
calculating the [link math_toolkit.dist_ref.nmp.quantile_c quantile from the complement of the
|
||||
probability].
|
||||
|
||||
@@ -394,8 +394,7 @@ probability].
|
||||
|
||||
Refer to the __ccdf.
|
||||
|
||||
[endsect][/section:nmp Non-Member Properties]
|
||||
|
||||
[endsect] [/section:nmp Non-Member Properties]
|
||||
|
||||
[/ non_members.qbk
|
||||
Copyright 2006 John Maddock and Paul A. Bristow.
|
||||
|
||||
@@ -20,6 +20,26 @@ __multiprecision __cpp_dec_float and__cpp_bin_float are fixed at runtime,
|
||||
but [*not] a type that extends the representation to provide an exact representation
|
||||
for any number, for example [@http://keithbriggs.info/xrc.html XRC eXact Real in C].
|
||||
|
||||
The accuracy of mathematical functions can be assessed and displayed in terms of __ULP,
|
||||
often as a ulps plot or by binning the differences as a histogram.
|
||||
Samples are evaluated using the implementation under test and compared with 'known good'
|
||||
representation obtained using a more accurate method. Other implementations, often using
|
||||
arbitrary precision arithmetic, for example __WolframAlpha are one source of references
|
||||
values. The other method, used widely in Boost.Math special functions, it to carry out
|
||||
the same algorithm, but using a higher precision type, typically using Boost.Multiprecision
|
||||
types like `cpp_bin_float_quad` for 128-bit (about 35 decimal digit precision), or
|
||||
`cpp_bin_float_50` (for 50 decimal digit precision).
|
||||
|
||||
When converted to a particular machine representation, say `double`, say using a `static_cast`,
|
||||
the value is the nearest representation possible for the `double` type. This value
|
||||
cannot be 'wrong' by more than half a __ulp, and can be obtained using the Boost.Math function `ulp`.
|
||||
(Unless the algorithm is fundamentally flawed, something that should be revealed by 'sanity'
|
||||
checks using some independent sources).
|
||||
|
||||
See some discussion and example plots by Cleve Moler of Mathworks
|
||||
[@https://blogs.mathworks.com/cleve/2017/01/23/ulps-plots-reveal-math-function-accurary/
|
||||
ulps plots reveal math-function accuracy].
|
||||
|
||||
[section:nextafter Finding the Next Representable Value in a Specific Direction (nextafter)]
|
||||
|
||||
[h4 Synopsis]
|
||||
@@ -220,13 +240,13 @@ Function `ulp` gives the size of a unit-in-the-last-place for a specified floati
|
||||
|
||||
Returns one [@http://en.wikipedia.org/wiki/Unit_in_the_last_place unit in the last place] of ['x].
|
||||
|
||||
Corner cases are handled as followes:
|
||||
Corner cases are handled as follows:
|
||||
|
||||
* If the argument is a NaN, then raises a __domain_error.
|
||||
* If the argument is an infinity, then raises an __overflow_error.
|
||||
* If the argument is zero then returns the smallest representable value: for example for type
|
||||
`double` this would be either `std::numeric_limits<double>::min()` or `std::numeric_limits<double>::denorm_min()`
|
||||
depending whether denormals are supported (which have the values 2.`2250738585072014e-308` and `4.9406564584124654e-324` respectively).
|
||||
depending whether denormals are supported (which have the values `2.2250738585072014e-308` and `4.9406564584124654e-324` respectively).
|
||||
* If the result is too small to represent, then returns the smallest representable value.
|
||||
* Always returns a positive value such that `ulp(x) == ulp(-x)`.
|
||||
|
||||
|
||||
BIN
doc/graphs/diode_iv_plot.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
81
doc/graphs/diode_iv_plot.svg
Normal file
@@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="400" height ="300" version="1.1"
|
||||
xmlns:svg ="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns ="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<!-- SVG plot written using Boost.Plot program (Creator Jacob Voytko) -->
|
||||
<!-- Use, modification and distribution of Boost.Plot subject to 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) -->
|
||||
|
||||
<!-- SVG Plot Copyright Paul A. Bristow 2016 -->
|
||||
<meta name="copyright" content="Paul A. Bristow" />
|
||||
<meta name="date" content="2016" />
|
||||
<clipPath id="plot_window"><rect x="85.2" y="54" width="151.1" height="186"/></clipPath>
|
||||
<g id="imageBackground" stroke="rgb(255,255,0)" fill="rgb(255,255,255)" stroke-width="2"><rect x="0" y="0" width="400" height="300"/></g>
|
||||
<g id="plotBackground" stroke="rgb(119,136,153)" fill="rgb(255,255,255)" stroke-width="2"><rect x="84.2" y="53" width="153.1" height="188"/></g>
|
||||
<g id="yMinorGrid" stroke="rgb(200,220,255)" stroke-width="0.5"></g>
|
||||
<g id="yMajorGrid" stroke="rgb(200,220,255)" stroke-width="1"><path d="M86.2,84.33 L235.3,84.33 M86.2,53 L235.3,53 M86.2,84.33 L235.3,84.33 M86.2,115.7 L235.3,115.7 M86.2,147 L235.3,147 M86.2,178.3 L235.3,178.3 M86.2,209.7 L235.3,209.7 M86.2,241 L235.3,241 " fill="none"/></g>
|
||||
<g id="xMinorGrid" stroke="rgb(200,220,255)" stroke-width="0.5"></g>
|
||||
<g id="xMajorGrid" stroke="rgb(200,220,255)" stroke-width="1"><path d="M94.41,53 L94.41,241 M114.8,53 L114.8,241 M135.2,53 L135.2,241 M155.6,53 L155.6,241 M176,53 L176,241 M196.5,53 L196.5,241 M216.9,53 L216.9,241 M237.3,53 L237.3,241 " fill="none"/></g>
|
||||
<g id="yAxis" stroke="rgb(0,0,0)" stroke-width="1"><line x1="84.2" y1="53" x2="84.2" y2="241"/></g>
|
||||
<g id="xAxis" stroke="rgb(0,0,0)" stroke-width="1"><line x1="79.2" y1="84.33" x2="237.3" y2="84.33"/><line x1="79.2" y1="241" x2="237.3" y2="241"/></g>
|
||||
<g id="yMinorTicks" stroke="rgb(0,0,0)" stroke-width="1"><path d="M82.2,78.07 L84.2,78.07 M82.2,71.8 L84.2,71.8 M82.2,65.53 L84.2,65.53 M82.2,59.27 L84.2,59.27 M82.2,84.33 L84.2,84.33 M82.2,90.6 L84.2,90.6 M82.2,96.87 L84.2,96.87 M82.2,103.1 L84.2,103.1 M82.2,109.4 L84.2,109.4 M82.2,115.7 L84.2,115.7 M82.2,121.9 L84.2,121.9 M82.2,128.2 L84.2,128.2 M82.2,134.5 L84.2,134.5 M82.2,140.7 L84.2,140.7 M82.2,147 L84.2,147 M82.2,147 L84.2,147 M82.2,153.3 L84.2,153.3 M82.2,159.5 L84.2,159.5 M82.2,165.8 L84.2,165.8 M82.2,172.1 L84.2,172.1 M82.2,178.3 L84.2,178.3 M82.2,184.6 L84.2,184.6 M82.2,190.9 L84.2,190.9 M82.2,197.1 L84.2,197.1 M82.2,203.4 L84.2,203.4 M82.2,209.7 L84.2,209.7 M82.2,215.9 L84.2,215.9 M82.2,222.2 L84.2,222.2 M82.2,228.5 L84.2,228.5 M82.2,234.7 L84.2,234.7 M82.2,241 L84.2,241 " fill="none"/></g>
|
||||
<g id="xMinorTicks" stroke="rgb(0,0,0)" stroke-width="1"><path d="M86.24,241 L86.24,243 M90.32,241 L90.32,243 M98.49,241 L98.49,243 M102.6,241 L102.6,243 M106.7,241 L106.7,243 M110.7,241 L110.7,243 M118.9,241 L118.9,243 M123,241 L123,243 M127.1,241 L127.1,243 M131.1,241 L131.1,243 M139.3,241 L139.3,243 M143.4,241 L143.4,243 M147.5,241 L147.5,243 M151.6,241 L151.6,243 M159.7,241 L159.7,243 M163.8,241 L163.8,243 M167.9,241 L167.9,243 M172,241 L172,243 M180.1,241 L180.1,243 M184.2,241 L184.2,243 M188.3,241 L188.3,243 M192.4,241 L192.4,243 M200.5,241 L200.5,243 M204.6,241 L204.6,243 M208.7,241 L208.7,243 M212.8,241 L212.8,243 M221,241 L221,243 M225,241 L225,243 M229.1,241 L229.1,243 M233.2,241 L233.2,243 " fill="none"/></g>
|
||||
<g id="yMajorTicks" stroke="rgb(0,0,0)" stroke-width="2"><path d="M79.2,84.33 L84.2,84.33 M79.2,53 L84.2,53 M79.2,84.33 L84.2,84.33 M79.2,115.7 L84.2,115.7 M79.2,147 L84.2,147 M79.2,178.3 L84.2,178.3 M79.2,209.7 L84.2,209.7 M79.2,241 L84.2,241 " fill="none"/></g>
|
||||
<g id="xMajorTicks" stroke="rgb(0,0,0)" stroke-width="2"><path d="M94.41,241 L94.41,246 M114.8,241 L114.8,246 M135.2,241 L135.2,246 M155.6,241 L155.6,246 M176,241 L176,246 M196.5,241 L196.5,246 M216.9,241 L216.9,246 M237.3,241 L237.3,246 " fill="none"/></g>
|
||||
<g id="xTicksValues">
|
||||
<text x="94.41" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0.3</text>
|
||||
<text x="114.8" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0.4</text>
|
||||
<text x="135.2" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0.5</text>
|
||||
<text x="155.6" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0.6</text>
|
||||
<text x="176" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0.7</text>
|
||||
<text x="196.5" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0.8</text>
|
||||
<text x="216.9" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0.9</text>
|
||||
<text x="237.3" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">1</text></g>
|
||||
<g id="yTicksValues">
|
||||
<text x="73.2" y="86.73" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="73.2" y="55.4" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">4</text>
|
||||
<text x="73.2" y="86.73" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="73.2" y="118.1" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-4</text>
|
||||
<text x="73.2" y="149.4" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-8</text>
|
||||
<text x="73.2" y="180.7" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-12</text>
|
||||
<text x="73.2" y="212.1" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-16</text>
|
||||
<text x="73.2" y="243.4" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-20</text></g>
|
||||
<g id="yLabel">
|
||||
<text x="42.9" y="147" text-anchor="middle" transform = "rotate(-90 42.9 147 )" font-size="14" font-family="Lucida Sans Unicode">log(current) (A)</text></g>
|
||||
<g id="xLabel">
|
||||
<text x="160.7" y="276.7" text-anchor="middle" font-size="14" font-family="Lucida Sans Unicode">voltage (V)</text></g>
|
||||
<g id="plotLines" stroke-width="2"><g clip-path="url(#plot_window)" stroke="rgb(0,0,0)" stroke-width="0.5"><path d="M94.41,238.3 L94.41,238.3 L114.8,207.7 L135.2,177.2 L155.6,146.8 L176,116.3 L196.5,84.49 L216.9,56.13 " fill="none"/></g>
|
||||
<g clip-path="url(#plot_window)" stroke="rgb(0,0,0)" stroke-width="0.5"><path d="M94.41,238.3 L94.41,238.3 L114.8,207.7 L135.2,177.2 L155.6,146.8 L176,117.2 L180.1,111.8 L184.2,106.3 L188.3,102.3 L192.4,100 " fill="none"/></g>
|
||||
<g clip-path="url(#plot_window)" stroke="rgb(0,0,255)" stroke-width="1"><path d="M94.41,238.2 L94.41,238.2 L96.45,235.2 L98.49,232.1 L100.5,229.1 L102.6,226.1 L104.6,223 L106.7,220 L108.7,216.9 L110.7,213.9 L112.8,210.8 L114.8,207.8 L116.9,204.7 L118.9,201.7 L120.9,198.6 L123,195.6 L125,192.5 L127.1,189.5 L129.1,186.4 L131.1,183.4 L133.2,180.3 L135.2,177.3 L137.3,174.2 L139.3,171.2 L141.3,168.2 L143.4,165.1 L145.4,162.1 L147.5,159.1 L149.5,156 L151.6,153 L153.6,150 L155.6,147 L157.7,144.1 L159.7,141.2 L161.8,138.4 L163.8,135.6 L165.8,133 L167.9,130.5 L169.9,128.1 L172,125.9 L174,123.9 L176,122 L178.1,120.3 L180.1,118.8 L182.2,117.4 L184.2,116.2 L186.3,115 L188.3,114 L190.3,113 L192.4,112.1 L194.4,111.3 L196.5,110.5 L198.5,109.8 L200.5,109.2 L202.6,108.6 L204.6,108 L206.7,107.4 L208.7,106.9 L210.7,106.4 L212.8,105.9 L214.8,105.5 L216.9,105.1 L218.9,104.7 L221,104.3 L223,103.9 L225,103.5 L227.1,103.2 L229.1,102.9 L231.2,102.6 L233.2,102.2 L235.2,101.9 " fill="none"/></g>
|
||||
<g clip-path="url(#plot_window)" stroke="rgb(128,0,128)" stroke-width="1"><path d="M94.41,238.2 L94.41,238.2 L96.45,235.2 L98.49,232.1 L100.5,229.1 L102.6,226.1 L104.6,223 L106.7,220 L108.7,216.9 L110.7,213.9 L112.8,210.8 L114.8,207.8 L116.9,204.7 L118.9,201.7 L120.9,198.6 L123,195.6 L125,192.5 L127.1,189.5 L129.1,186.4 L131.1,183.4 L133.2,180.4 L135.2,177.3 L137.3,174.3 L139.3,171.2 L141.3,168.2 L143.4,165.2 L145.4,162.2 L147.5,159.2 L149.5,156.3 L151.6,153.4 L153.6,150.5 L155.6,147.8 L157.7,145.1 L159.7,142.6 L161.8,140.2 L163.8,138 L165.8,135.9 L167.9,134 L169.9,132.3 L172,130.8 L174,129.4 L176,128.1 L178.1,126.9 L180.1,125.9 L182.2,124.9 L184.2,124 L186.3,123.2 L188.3,122.4 L190.3,121.7 L192.4,121 L194.4,120.4 L196.5,119.8 L198.5,119.2 L200.5,118.7 L202.6,118.2 L204.6,117.7 L206.7,117.3 L208.7,116.9 L210.7,116.5 L212.8,116.1 L214.8,115.7 L216.9,115.3 L218.9,115 L221,114.7 L223,114.3 L225,114 L227.1,113.7 L229.1,113.4 L231.2,113.2 L233.2,112.9 L235.2,112.6 " fill="none"/></g>
|
||||
<g clip-path="url(#plot_window)" stroke="rgb(0,128,0)" stroke-width="1"><path d="M94.41,238.2 L94.41,238.2 L96.45,235.2 L98.49,232.1 L100.5,229.1 L102.6,226.1 L104.6,223 L106.7,220 L108.7,216.9 L110.7,213.9 L112.8,210.8 L114.8,207.8 L116.9,204.7 L118.9,201.7 L120.9,198.6 L123,195.6 L125,192.5 L127.1,189.5 L129.1,186.5 L131.1,183.4 L133.2,180.4 L135.2,177.4 L137.3,174.4 L139.3,171.4 L141.3,168.5 L143.4,165.6 L145.4,162.8 L147.5,160 L149.5,157.4 L151.6,154.8 L153.6,152.5 L155.6,150.3 L157.7,148.2 L159.7,146.4 L161.8,144.7 L163.8,143.2 L165.8,141.8 L167.9,140.5 L169.9,139.4 L172,138.3 L174,137.4 L176,136.5 L178.1,135.6 L180.1,134.9 L182.2,134.2 L184.2,133.5 L186.3,132.9 L188.3,132.3 L190.3,131.7 L192.4,131.2 L194.4,130.7 L196.5,130.3 L198.5,129.8 L200.5,129.4 L202.6,129 L204.6,128.6 L206.7,128.2 L208.7,127.9 L210.7,127.5 L212.8,127.2 L214.8,126.9 L216.9,126.6 L218.9,126.3 L221,126 L223,125.7 L225,125.4 L227.1,125.2 L229.1,124.9 L231.2,124.7 L233.2,124.4 L235.2,124.2 " fill="none"/></g>
|
||||
<g clip-path="url(#plot_window)" stroke="rgb(255,0,0)" stroke-width="1"><path d="M94.41,238.2 L94.41,238.2 L96.45,235.2 L98.49,232.1 L100.5,229.1 L102.6,226.1 L104.6,223 L106.7,220 L108.7,216.9 L110.7,213.9 L112.8,210.8 L114.8,207.8 L116.9,204.7 L118.9,201.7 L120.9,198.7 L123,195.6 L125,192.6 L127.1,189.6 L129.1,186.6 L131.1,183.6 L133.2,180.7 L135.2,177.8 L137.3,175 L139.3,172.2 L141.3,169.6 L143.4,167.1 L145.4,164.7 L147.5,162.5 L149.5,160.5 L151.6,158.7 L153.6,157 L155.6,155.5 L157.7,154.1 L159.7,152.8 L161.8,151.7 L163.8,150.6 L165.8,149.7 L167.9,148.8 L169.9,148 L172,147.2 L174,146.5 L176,145.9 L178.1,145.2 L180.1,144.6 L182.2,144.1 L184.2,143.6 L186.3,143.1 L188.3,142.6 L190.3,142.2 L192.4,141.8 L194.4,141.3 L196.5,141 L198.5,140.6 L200.5,140.2 L202.6,139.9 L204.6,139.6 L206.7,139.2 L208.7,138.9 L210.7,138.6 L212.8,138.4 L214.8,138.1 L216.9,137.8 L218.9,137.5 L221,137.3 L223,137 L225,136.8 L227.1,136.6 L229.1,136.4 L231.2,136.1 L233.2,135.9 L235.2,135.7 " fill="none"/></g>
|
||||
</g>
|
||||
<g id="plotPoints" clip-path="url(#plot_window)"><g stroke="rgb(0,0,0)" fill="rgb(211,211,211)"><rect x="92.91" y="236.8" width="3" height="3"/><rect x="113.3" y="206.2" width="3" height="3"/><rect x="133.7" y="175.7" width="3" height="3"/><rect x="154.1" y="145.3" width="3" height="3"/><rect x="174.5" y="115.7" width="3" height="3"/><rect x="178.6" y="110.3" width="3" height="3"/><rect x="182.7" y="104.8" width="3" height="3"/><rect x="186.8" y="100.8" width="3" height="3"/><rect x="190.9" y="98.5" width="3" height="3"/></g>
|
||||
</g>
|
||||
<g id="legendBackground" stroke="rgb(255,255,0)" fill="rgb(255,255,255)" stroke-width="1"><rect x="251.3" y="53" width="122.7" height="182"/><rect x="251.3" y="53" width="122.7" height="182"/></g>
|
||||
<g id="legendPoints"><g stroke="rgb(0,0,0)" fill="rgb(211,211,211)" stroke-width="0.5"><line x1="265.3" y1="81" x2="279.3" y2="81"/></g>
|
||||
<g stroke="rgb(0,0,0)" fill="rgb(211,211,211)" stroke-width="0.5"><rect x="263.8" y="107.5" width="3" height="3"/><line x1="286.3" y1="109" x2="300.3" y2="109"/></g>
|
||||
<g stroke="rgb(0,0,255)" fill="rgb(255,255,255)" stroke-width="1"><line x1="265.3" y1="137" x2="279.3" y2="137"/></g>
|
||||
<g stroke="rgb(128,0,128)" fill="rgb(255,255,255)" stroke-width="1"><line x1="265.3" y1="165" x2="279.3" y2="165"/></g>
|
||||
<g stroke="rgb(0,128,0)" fill="rgb(255,255,255)" stroke-width="1"><line x1="265.3" y1="193" x2="279.3" y2="193"/></g>
|
||||
<g stroke="rgb(255,0,0)" fill="rgb(255,255,255)" stroke-width="1"><line x1="265.3" y1="221" x2="279.3" y2="221"/></g>
|
||||
</g>
|
||||
<g id="legendText">
|
||||
<text x="286.3" y="81" font-size="14" font-family="Lucida Sans Unicode">I₀(V)</text>
|
||||
<text x="307.3" y="109" font-size="14" font-family="Lucida Sans Unicode">Rs=0 Ω</text>
|
||||
<text x="286.3" y="137" font-size="14" font-family="Lucida Sans Unicode">Rs=2 Ω</text>
|
||||
<text x="286.3" y="165" font-size="14" font-family="Lucida Sans Unicode">Rs=10 Ω</text>
|
||||
<text x="286.3" y="193" font-size="14" font-family="Lucida Sans Unicode">Rs=51 Ω</text>
|
||||
<text x="286.3" y="221" font-size="14" font-family="Lucida Sans Unicode">Rs=249 Ω</text></g>
|
||||
<g id="title">
|
||||
<text x="200" y="36" text-anchor="middle" font-size="18" font-family="Lucida Sans Unicode">Diode current versus voltage</text></g>
|
||||
<g id="plotXValues"></g>
|
||||
<g id="plotYValues"></g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 13 KiB |
@@ -10,7 +10,7 @@
|
||||
\author John Maddock and Paul A. Bristow
|
||||
*/
|
||||
// Copyright John Maddock 2008.
|
||||
// Copyright Paul A. Bristow 2008, 2009, 2012
|
||||
// Copyright Paul A. Bristow 2008, 2009, 2012, 2016
|
||||
// Use, modification and distribution are subject to 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)
|
||||
@@ -35,8 +35,9 @@
|
||||
|
||||
template <class Dist>
|
||||
struct is_discrete_distribution
|
||||
: public boost::mpl::false_{};
|
||||
: public boost::mpl::false_{}; // Default is continuous distribution.
|
||||
|
||||
// Some discrete distributions.
|
||||
template<class T, class P>
|
||||
struct is_discrete_distribution<boost::math::bernoulli_distribution<T,P> >
|
||||
: public boost::mpl::true_{};
|
||||
@@ -68,7 +69,7 @@ struct value_finder
|
||||
private:
|
||||
Dist m_dist;
|
||||
typename Dist::value_type m_value;
|
||||
};
|
||||
}; // value_finder
|
||||
|
||||
template <class Dist>
|
||||
class distribution_plotter
|
||||
@@ -177,7 +178,7 @@ public:
|
||||
if(b > m_max_x)
|
||||
m_max_x = b;
|
||||
}
|
||||
}
|
||||
} // add
|
||||
|
||||
void plot(const std::string& title, const std::string& file)
|
||||
{
|
||||
@@ -198,9 +199,12 @@ public:
|
||||
m_max_y = 1;
|
||||
}
|
||||
|
||||
std::cout << "Plotting " << title << " to " << file << std::endl;
|
||||
|
||||
svg_2d_plot plot;
|
||||
plot.image_x_size(750);
|
||||
plot.image_y_size(400);
|
||||
plot.copyright_holder("John Maddock").copyright_date("2008").boost_license_on(true);
|
||||
plot.coord_precision(4); // Avoids any visible steps.
|
||||
plot.title_font_size(20);
|
||||
plot.legend_title_font_size(15);
|
||||
@@ -248,19 +252,17 @@ public:
|
||||
|
||||
if(!is_discrete_distribution<Dist>::value)
|
||||
{
|
||||
//
|
||||
// Continuous distribution:
|
||||
//
|
||||
for(std::list<std::pair<std::string, Dist> >::const_iterator i = m_distributions.begin();
|
||||
i != m_distributions.end(); ++i)
|
||||
{
|
||||
double x = m_min_x;
|
||||
double interval = (m_max_x - m_min_x) / 200;
|
||||
double continuous_interval = (m_max_x - m_min_x) / 200;
|
||||
std::map<double, double> data;
|
||||
while(x <= m_max_x)
|
||||
{
|
||||
data[x] = m_pdf ? pdf(i->second, x) : cdf(i->second, x);
|
||||
x += interval;
|
||||
x += continuous_interval;
|
||||
}
|
||||
plot.plot(data, i->first)
|
||||
.line_on(true)
|
||||
@@ -275,16 +277,14 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// Discrete distribution:
|
||||
//
|
||||
double x_width = 0.75 / m_distributions.size();
|
||||
double x_off = -0.5 * 0.75;
|
||||
for(std::list<std::pair<std::string, Dist> >::const_iterator i = m_distributions.begin();
|
||||
i != m_distributions.end(); ++i)
|
||||
{
|
||||
double x = ceil(m_min_x);
|
||||
double interval = 1;
|
||||
double discrete_interval = 1;
|
||||
std::map<double, double> data;
|
||||
while(x <= m_max_x)
|
||||
{
|
||||
@@ -300,7 +300,7 @@ public:
|
||||
data[x + x_off + 0.00001] = p;
|
||||
data[x + x_off + x_width] = p;
|
||||
data[x + x_off + x_width + 0.00001] = 0;
|
||||
x += interval;
|
||||
x += discrete_interval;
|
||||
}
|
||||
x_off += x_width;
|
||||
svg_2d_plot_series& s = plot.plot(data, i->first);
|
||||
@@ -312,9 +312,9 @@ public:
|
||||
++color_index;
|
||||
color_index = color_index % (sizeof(colors)/sizeof(colors[0]));
|
||||
}
|
||||
}
|
||||
} // descrete
|
||||
plot.write(file);
|
||||
}
|
||||
} // void plot(const std::string& title, const std::string& file)
|
||||
|
||||
private:
|
||||
bool m_pdf;
|
||||
@@ -326,7 +326,7 @@ int main()
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
std::cout << "Distribution Graphs" << std::endl;
|
||||
distribution_plotter<boost::math::gamma_distribution<> >
|
||||
gamma_plotter;
|
||||
gamma_plotter.add(boost::math::gamma_distribution<>(0.75), "shape = 0.75");
|
||||
@@ -718,5 +718,4 @@ int main()
|
||||
hyperexponential_plotter3.plot("Hyperexponential Distribution PDF (Different Number of Phases, Same Mean)", "hyperexponential_pdf_samemean.svg");
|
||||
*/
|
||||
|
||||
|
||||
} // int main()
|
||||
|
||||
BIN
doc/graphs/lambert_w0_errors_graph.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
62
doc/graphs/lambert_w0_errors_graph.svg
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
doc/graphs/lambert_w0_prime_graph.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
56
doc/graphs/lambert_w0_prime_graph.svg
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
doc/graphs/lambert_w_graph.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
65
doc/graphs/lambert_w_graph.svg
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
doc/graphs/lambert_w_graph_big_W.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
62
doc/graphs/lambert_w_graph_big_W.svg
Normal file
@@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="400" height ="300" version="1.1"
|
||||
xmlns:svg ="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns ="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<!-- SVG plot written using Boost.Plot program (Creator Jacob Voytko) -->
|
||||
<!-- Use, modification and distribution of Boost.Plot subject to 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) -->
|
||||
|
||||
<!-- SVG Plot Copyright Paul A. Bristow 2018 -->
|
||||
<meta name="copyright" content="Paul A. Bristow" />
|
||||
<meta name="date" content="2018" />
|
||||
<clipPath id="plot_window"><rect x="76.8" y="54" width="296.2" height="186"/></clipPath>
|
||||
<g id="imageBackground" stroke="rgb(255,255,0)" fill="rgb(255,255,255)" stroke-width="2"><rect x="0" y="0" width="400" height="300"/></g>
|
||||
<g id="plotBackground" stroke="rgb(119,136,153)" fill="rgb(255,255,255)" stroke-width="2"><rect x="75.8" y="53" width="298.2" height="188"/></g>
|
||||
<g id="yMinorGrid" stroke="rgb(200,220,255)" stroke-width="0.5"></g>
|
||||
<g id="yMajorGrid" stroke="rgb(200,220,255)" stroke-width="1"><path d="M77.8,220.1 L372,220.1 M77.8,199.2 L372,199.2 M77.8,178.3 L372,178.3 M77.8,157.4 L372,157.4 M77.8,136.6 L372,136.6 M77.8,115.7 L372,115.7 M77.8,94.78 L372,94.78 M77.8,73.89 L372,73.89 M77.8,53 L372,53 M77.8,220.1 L372,220.1 M77.8,241 L372,241 " fill="none"/></g>
|
||||
<g id="xMinorGrid" stroke="rgb(200,220,255)" stroke-width="0.5"></g>
|
||||
<g id="xMajorGrid" stroke="rgb(200,220,255)" stroke-width="1"><path d="M75.83,53 L75.83,241 M135.5,53 L135.5,241 M195.1,53 L195.1,241 M254.7,53 L254.7,241 M314.4,53 L314.4,241 M374,53 L374,241 M75.83,53 L75.83,241 " fill="none"/></g>
|
||||
<g id="yAxis" stroke="rgb(0,0,0)" stroke-width="1"><line x1="75.83" y1="53" x2="75.83" y2="246"/><line x1="75.8" y1="53" x2="75.8" y2="241"/></g>
|
||||
<g id="xAxis" stroke="rgb(0,0,0)" stroke-width="1"><line x1="70.8" y1="220.1" x2="374" y2="220.1"/><line x1="70.8" y1="241" x2="374" y2="241"/></g>
|
||||
<g id="yMinorTicks" stroke="rgb(0,0,0)" stroke-width="1"><path d="M73.8,215.9 L75.8,215.9 M73.8,211.8 L75.8,211.8 M73.8,207.6 L75.8,207.6 M73.8,203.4 L75.8,203.4 M73.8,195 L75.8,195 M73.8,190.9 L75.8,190.9 M73.8,186.7 L75.8,186.7 M73.8,182.5 L75.8,182.5 M73.8,174.2 L75.8,174.2 M73.8,170 L75.8,170 M73.8,165.8 L75.8,165.8 M73.8,161.6 L75.8,161.6 M73.8,153.3 L75.8,153.3 M73.8,149.1 L75.8,149.1 M73.8,144.9 L75.8,144.9 M73.8,140.7 L75.8,140.7 M73.8,132.4 L75.8,132.4 M73.8,128.2 L75.8,128.2 M73.8,124 L75.8,124 M73.8,119.8 L75.8,119.8 M73.8,111.5 L75.8,111.5 M73.8,107.3 L75.8,107.3 M73.8,103.1 L75.8,103.1 M73.8,98.96 L75.8,98.96 M73.8,90.6 L75.8,90.6 M73.8,86.42 L75.8,86.42 M73.8,82.24 L75.8,82.24 M73.8,78.07 L75.8,78.07 M73.8,69.71 L75.8,69.71 M73.8,65.53 L75.8,65.53 M73.8,61.36 L75.8,61.36 M73.8,57.18 L75.8,57.18 M73.8,220.1 L75.8,220.1 M73.8,224.3 L75.8,224.3 M73.8,228.5 L75.8,228.5 M73.8,232.6 L75.8,232.6 M73.8,236.8 L75.8,236.8 M73.8,241 L75.8,241 " fill="none"/></g>
|
||||
<g id="xMinorTicks" stroke="rgb(0,0,0)" stroke-width="1"><path d="M87.76,241 L87.76,243 M99.68,241 L99.68,243 M111.6,241 L111.6,243 M123.5,241 L123.5,243 M147.4,241 L147.4,243 M159.3,241 L159.3,243 M171.2,241 L171.2,243 M183.2,241 L183.2,243 M207,241 L207,243 M219,241 L219,243 M230.9,241 L230.9,243 M242.8,241 L242.8,243 M266.7,241 L266.7,243 M278.6,241 L278.6,243 M290.5,241 L290.5,243 M302.4,241 L302.4,243 M326.3,241 L326.3,243 M338.2,241 L338.2,243 M350.1,241 L350.1,243 M362.1,241 L362.1,243 " fill="none"/></g>
|
||||
<g id="yMajorTicks" stroke="rgb(0,0,0)" stroke-width="2"><path d="M70.8,220.1 L75.8,220.1 M70.8,199.2 L75.8,199.2 M70.8,178.3 L75.8,178.3 M70.8,157.4 L75.8,157.4 M70.8,136.6 L75.8,136.6 M70.8,115.7 L75.8,115.7 M70.8,94.78 L75.8,94.78 M70.8,73.89 L75.8,73.89 M70.8,53 L75.8,53 M70.8,220.1 L75.8,220.1 M70.8,241 L75.8,241 " fill="none"/></g>
|
||||
<g id="xMajorTicks" stroke="rgb(0,0,0)" stroke-width="2"><path d="M75.83,241 L75.83,246 M135.5,241 L135.5,246 M195.1,241 L195.1,246 M254.7,241 L254.7,246 M314.4,241 L314.4,246 M374,241 L374,246 M75.83,241 L75.83,246 " fill="none"/></g>
|
||||
<g id="xTicksValues">
|
||||
<text x="75.83" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="135.5" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">2e3</text>
|
||||
<text x="195.1" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">4e3</text>
|
||||
<text x="254.7" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">6e3</text>
|
||||
<text x="314.4" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">8e3</text>
|
||||
<text x="374" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">1e4</text>
|
||||
<text x="75.83" y="261.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0</text></g>
|
||||
<g id="yTicksValues">
|
||||
<text x="64.8" y="222.5" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="64.8" y="201.6" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">1</text>
|
||||
<text x="64.8" y="180.7" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">2</text>
|
||||
<text x="64.8" y="159.8" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">3</text>
|
||||
<text x="64.8" y="139" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">4</text>
|
||||
<text x="64.8" y="118.1" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">5</text>
|
||||
<text x="64.8" y="97.18" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">6</text>
|
||||
<text x="64.8" y="76.29" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">7</text>
|
||||
<text x="64.8" y="55.4" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">8</text>
|
||||
<text x="64.8" y="222.5" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="64.8" y="243.4" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-1</text></g>
|
||||
<g id="yLabel">
|
||||
<text x="42.9" y="147" text-anchor="middle" transform = "rotate(-90 42.9 147 )" font-size="14" font-family="Lucida Sans Unicode">W</text></g>
|
||||
<g id="xLabel">
|
||||
<text x="224.9" y="276.7" text-anchor="middle" font-size="14" font-family="Lucida Sans Unicode">z</text></g>
|
||||
<g id="plotLines" stroke-width="2"><g clip-path="url(#plot_window)" stroke="rgb(255,0,0)" stroke-width="1"><path d="M75.82,241 L75.82,241 L77.31,160.5 L78.8,149.4 L80.29,142.8 L81.78,138.1 L83.27,134.3 L84.76,131.2 L86.25,128.6 L87.75,126.3 L89.24,124.3 L90.73,122.5 L92.22,120.9 L93.71,119.4 L95.2,118 L96.69,116.7 L98.18,115.5 L99.67,114.4 L101.2,113.3 L102.7,112.3 L104.1,111.4 L105.6,110.5 L107.1,109.6 L108.6,108.8 L110.1,108 L111.6,107.3 L113.1,106.5 L114.6,105.8 L116.1,105.2 L117.6,104.5 L119.1,103.9 L120.5,103.3 L122,102.7 L123.5,102.2 L125,101.6 L126.5,101.1 L128,100.6 L129.5,100.1 L131,99.58 L132.5,99.11 L134,98.64 L135.5,98.19 L136.9,97.75 L138.4,97.32 L139.9,96.9 L141.4,96.49 L142.9,96.09 L144.4,95.7 L145.9,95.31 L147.4,94.93 L148.9,94.56 L150.4,94.2 L151.9,93.85 L153.3,93.5 L154.8,93.16 L156.3,92.82 L157.8,92.49 L159.3,92.17 L160.8,91.85 L162.3,91.54 L163.8,91.23 L165.3,90.93 L166.8,90.63 L168.3,90.34 L169.7,90.05 L171.2,89.77 L172.7,89.49 L174.2,89.21 L175.7,88.94 L177.2,88.68 L178.7,88.41 L180.2,88.15 L181.7,87.9 L183.2,87.64 L184.7,87.4 L186.1,87.15 L187.6,86.91 L189.1,86.67 L190.6,86.43 L192.1,86.2 L193.6,85.97 L195.1,85.74 L196.6,85.52 L198.1,85.3 L199.6,85.08 L201.1,84.86 L202.5,84.64 L204,84.43 L205.5,84.22 L207,84.02 L208.5,83.81 L210,83.61 L211.5,83.41 L213,83.21 L214.5,83.02 L216,82.82 L217.4,82.63 L218.9,82.44 L220.4,82.25 L221.9,82.07 L223.4,81.88 L224.9,81.7 L226.4,81.52 L227.9,81.34 L229.4,81.16 L230.9,80.99 L232.4,80.81 L233.8,80.64 L235.3,80.47 L236.8,80.3 L238.3,80.13 L239.8,79.97 L241.3,79.8 L242.8,79.64 L244.3,79.48 L245.8,79.32 L247.3,79.16 L248.8,79 L250.2,78.85 L251.7,78.69 L253.2,78.54 L254.7,78.38 L256.2,78.23 L257.7,78.08 L259.2,77.94 L260.7,77.79 L262.2,77.64 L263.7,77.5 L265.2,77.35 L266.6,77.21 L268.1,77.07 L269.6,76.93 L271.1,76.79 L272.6,76.65 L274.1,76.51 L275.6,76.37 L277.1,76.24 L278.6,76.1 L280.1,75.97 L281.6,75.84 L283,75.71 L284.5,75.57 L286,75.44 L287.5,75.32 L289,75.19 L290.5,75.06 L292,74.93 L293.5,74.81 L295,74.68 L296.5,74.56 L298,74.44 L299.4,74.31 L300.9,74.19 L302.4,74.07 L303.9,73.95 L305.4,73.83 L306.9,73.72 L308.4,73.6 L309.9,73.48 L311.4,73.36 L312.9,73.25 L314.4,73.13 L315.8,73.02 L317.3,72.91 L318.8,72.8 L320.3,72.68 L321.8,72.57 L323.3,72.46 L324.8,72.35 L326.3,72.24 L327.8,72.13 L329.3,72.03 L330.8,71.92 L332.2,71.81 L333.7,71.71 L335.2,71.6 L336.7,71.49 L338.2,71.39 L339.7,71.29 L341.2,71.18 L342.7,71.08 L344.2,70.98 L345.7,70.88 L347.2,70.78 L348.6,70.68 L350.1,70.58 L351.6,70.48 L353.1,70.38 L354.6,70.28 L356.1,70.18 L357.6,70.08 L359.1,69.99 L360.6,69.89 L362.1,69.8 L363.6,69.7 L365,69.61 L366.5,69.51 L368,69.42 L369.5,69.32 L371,69.23 L372.5,69.14 L374,69.05 " fill="none"/></g>
|
||||
</g>
|
||||
<g id="plotPoints" clip-path="url(#plot_window)"></g>
|
||||
<g id="title">
|
||||
<text x="200" y="36" text-anchor="middle" font-size="18" font-family="Lucida Sans Unicode">Lambert W0 function for larger z.</text></g>
|
||||
<g id="plotXValues"></g>
|
||||
<g id="plotYValues"></g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.1 KiB |
BIN
doc/graphs/lambert_wm1_errors_graph.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
55
doc/graphs/lambert_wm1_errors_graph.svg
Normal file
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="400" height ="200" version="1.1"
|
||||
xmlns:svg ="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns ="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<!-- SVG plot written using Boost.Plot program (Creator Jacob Voytko) -->
|
||||
<!-- Use, modification and distribution of Boost.Plot subject to 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) -->
|
||||
|
||||
<!-- SVG Plot Copyright Paul A. Bristow 2018 -->
|
||||
<meta name="copyright" content="Paul A. Bristow" />
|
||||
<meta name="date" content="2018" />
|
||||
<clipPath id="plot_window"><rect x="66.8" y="36.5" width="306" height="114"/></clipPath>
|
||||
<g id="imageBackground" stroke="rgb(255,255,0)" fill="rgb(255,255,255)" stroke-width="2"><rect x="0" y="0" width="400" height="200"/></g>
|
||||
<g id="plotBackground" stroke="rgb(119,136,153)" fill="rgb(255,255,255)" stroke-width="2"><rect x="65.8" y="35.5" width="308" height="116"/></g>
|
||||
<g id="yMinorGrid" stroke="rgb(200,220,255)" stroke-width="0.5"></g>
|
||||
<g id="yMajorGrid" stroke="rgb(200,220,255)" stroke-width="1"><path d="M67.8,93.3 L372,93.3 M67.8,64.4 L372,64.4 M67.8,35.5 L372,35.5 M67.8,93.3 L372,93.3 M67.8,122 L372,122 M67.8,151 L372,151 " fill="none"/></g>
|
||||
<g id="xMinorGrid" stroke="rgb(200,220,255)" stroke-width="0.5"></g>
|
||||
<g id="xMajorGrid" stroke="rgb(200,220,255)" stroke-width="1"><path d="M374,35.5 L374,151 M374,35.5 L374,151 M295,35.5 L295,151 M216,35.5 L216,151 M137,35.5 L137,151 " fill="none"/></g>
|
||||
<g id="yAxis" stroke="rgb(0,0,0)" stroke-width="1"><line x1="374" y1="35.5" x2="374" y2="156"/><line x1="65.8" y1="35.5" x2="65.8" y2="151"/></g>
|
||||
<g id="xAxis" stroke="rgb(0,0,0)" stroke-width="1"><line x1="60.8" y1="93.3" x2="374" y2="93.3"/><line x1="60.8" y1="151" x2="374" y2="151"/></g>
|
||||
<g id="yMinorTicks" stroke="rgb(0,0,0)" stroke-width="1"><path d="M63.8,87.5 L65.8,87.5 M63.8,81.7 L65.8,81.7 M63.8,75.9 L65.8,75.9 M63.8,70.2 L65.8,70.2 M63.8,58.6 L65.8,58.6 M63.8,52.8 L65.8,52.8 M63.8,47.1 L65.8,47.1 M63.8,41.3 L65.8,41.3 M63.8,93.3 L65.8,93.3 M63.8,99 L65.8,99 M63.8,105 L65.8,105 M63.8,111 L65.8,111 M63.8,116 L65.8,116 M63.8,122 L65.8,122 M63.8,128 L65.8,128 M63.8,134 L65.8,134 M63.8,139 L65.8,139 M63.8,145 L65.8,145 M63.8,151 L65.8,151 M63.8,151 L65.8,151 " fill="none"/></g>
|
||||
<g id="xMinorTicks" stroke="rgb(0,0,0)" stroke-width="1"><path d="M358,151 L358,153 M342,151 L342,153 M327,151 L327,153 M311,151 L311,153 M279,151 L279,153 M263,151 L263,153 M248,151 L248,153 M232,151 L232,153 M200,151 L200,153 M184,151 L184,153 M169,151 L169,153 M153,151 L153,153 M121,151 L121,153 M105,151 L105,153 M89.5,151 L89.5,153 M73.7,151 L73.7,153 " fill="none"/></g>
|
||||
<g id="yMajorTicks" stroke="rgb(0,0,0)" stroke-width="2"><path d="M60.8,93.3 L65.8,93.3 M60.8,64.4 L65.8,64.4 M60.8,35.5 L65.8,35.5 M60.8,93.3 L65.8,93.3 M60.8,122 L65.8,122 M60.8,151 L65.8,151 " fill="none"/></g>
|
||||
<g id="xMajorTicks" stroke="rgb(0,0,0)" stroke-width="2"><path d="M374,151 L374,156 M374,151 L374,156 M295,151 L295,156 M216,151 L216,156 M137,151 L137,156 " fill="none"/></g>
|
||||
<g id="xTicksValues">
|
||||
<text x="374" y="172" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="374" y="172" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="295" y="172" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">-0.1</text>
|
||||
<text x="216" y="172" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">-0.2</text>
|
||||
<text x="137" y="172" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">-0.3</text></g>
|
||||
<g id="yTicksValues">
|
||||
<text x="54.8" y="95.7" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="54.8" y="66.8" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">2</text>
|
||||
<text x="54.8" y="37.9" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">4</text>
|
||||
<text x="54.8" y="95.7" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="54.8" y="125" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-2</text>
|
||||
<text x="54.8" y="153" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-4</text></g>
|
||||
<g id="yLabel">
|
||||
<text x="35.9" y="93.3" text-anchor="middle" transform = "rotate(-90 35.9 93.3 )" font-size="9" font-family="Lucida Sans Unicode">W-1 difference (bits)</text></g>
|
||||
<g id="xLabel">
|
||||
<text x="220" y="180" text-anchor="middle" font-size="9" font-family="Lucida Sans Unicode">z</text></g>
|
||||
<g id="plotLines" stroke-width="2"><g clip-path="url(#plot_window)" stroke="rgb(0,0,139)" stroke-width="0.2"><path d="M84.1,78.8 L84.1,78.8 L84.9,64.4 L85.6,78.8 L86.4,49.9 L87.2,64.4 L88,93.3 L88.8,49.9 L89.6,64.4 L90.4,78.8 L91.2,49.9 L92,64.4 L92.8,78.8 L93.5,93.3 L94.3,78.8 L95.1,78.8 L95.9,93.3 L96.7,108 L99.1,64.4 L101,49.9 L101,49.9 L103,93.3 L104,35.5 L105,49.9 L106,35.5 L107,35.5 L109,78.8 L109,64.4 L110,35.5 L111,93.3 L112,93.3 L113,108 L113,108 L114,122 L115,108 L116,35.5 L116,78.8 L118,64.4 L119,49.9 L120,93.3 L120,122 L121,93.3 L122,93.3 L123,78.8 L124,93.3 L124,108 L125,93.3 L126,108 L127,122 L128,49.9 L128,78.8 L129,108 L130,64.4 L131,108 L131,122 L132,64.4 L133,78.8 L134,78.8 L135,78.8 L135,78.8 L136,78.8 L137,64.4 L138,93.3 L139,93.3 L139,93.3 L140,64.4 L142,78.8 L143,49.9 L144,78.8 L145,64.4 L146,49.9 L146,49.9 L147,78.8 L148,78.8 L149,64.4 L150,64.4 L150,93.3 L151,93.3 L152,64.4 L153,78.8 L154,35.5 L154,64.4 L155,49.9 L156,64.4 L157,78.8 L158,49.9 L159,78.8 L160,93.3 L161,93.3 L161,93.3 L162,93.3 L163,93.3 L164,108 L165,108 L165,93.3 L166,108 L167,78.8 L168,108 L169,78.8 L169,93.3 L170,108 L171,108 L172,93.3 L173,93.3 L173,78.8 L174,93.3 L175,108 L176,93.3 L177,93.3 L177,78.8 L178,108 L179,93.3 L180,93.3 L180,93.3 L181,108 L182,93.3 L183,108 L184,93.3 L184,93.3 L185,78.8 L186,108 L187,93.3 L188,93.3 L188,78.8 L189,78.8 L190,93.3 L191,108 L192,78.8 L192,93.3 L193,78.8 L194,108 L195,93.3 L195,93.3 L196,93.3 L197,78.8 L198,93.3 L199,108 L199,93.3 L200,93.3 L201,78.8 L202,108 L203,93.3 L203,108 L204,93.3 L205,93.3 L206,93.3 L207,78.8 L207,93.3 L208,78.8 L209,78.8 L210,93.3 L210,93.3 L211,78.8 L212,93.3 L213,93.3 L214,93.3 L214,78.8 L215,78.8 L216,93.3 L217,78.8 L218,93.3 L218,78.8 L219,78.8 L220,64.4 L221,49.9 L222,93.3 L222,93.3 L223,78.8 L224,93.3 L225,93.3 L225,108 L226,93.3 L227,78.8 L228,93.3 L229,93.3 L229,93.3 L230,93.3 L231,93.3 L232,93.3 L233,78.8 L233,93.3 L234,93.3 L235,108 L236,78.8 L237,78.8 L237,93.3 L238,93.3 L239,93.3 L240,93.3 L240,78.8 L241,78.8 L242,78.8 L243,78.8 L244,78.8 L244,64.4 L245,78.8 L246,78.8 L247,93.3 L248,78.8 L248,93.3 L249,108 L250,93.3 L251,108 L252,93.3 L252,108 L253,108 L254,78.8 L255,78.8 L256,108 L256,78.8 L257,93.3 L258,108 L259,93.3 L259,93.3 L260,93.3 L261,93.3 L262,78.8 L263,78.8 L263,122 L264,93.3 L265,93.3 L266,78.8 L267,108 L267,93.3 L268,122 L269,93.3 L270,78.8 L271,93.3 L271,93.3 L272,93.3 L273,108 L274,122 L274,108 L275,93.3 L276,93.3 L277,93.3 L278,93.3 L278,108 L279,78.8 L280,93.3 L281,93.3 L282,93.3 L282,93.3 L283,93.3 L284,78.8 L285,108 L286,93.3 L286,93.3 L287,78.8 L288,78.8 L289,93.3 L289,108 L290,78.8 L291,93.3 L292,93.3 L293,93.3 L293,93.3 L294,93.3 L295,93.3 L296,93.3 L297,108 L297,122 L298,108 L299,108 L300,93.3 L301,108 L301,78.8 L302,78.8 L303,93.3 L304,93.3 L304,93.3 L305,78.8 L306,93.3 L307,93.3 L308,93.3 L308,93.3 L309,93.3 L310,93.3 L311,93.3 L312,78.8 L312,93.3 L313,93.3 L314,93.3 L315,93.3 L316,78.8 L316,93.3 L317,93.3 L318,93.3 L319,93.3 L320,93.3 L320,93.3 L321,108 L322,93.3 L323,93.3 L323,108 L324,78.8 L325,93.3 L326,93.3 L327,78.8 L327,93.3 L328,108 L329,78.8 L330,93.3 L331,78.8 L331,93.3 L332,108 L333,93.3 L334,93.3 L335,93.3 L335,93.3 L336,108 L337,78.8 L338,93.3 L338,78.8 L339,93.3 L340,93.3 L341,93.3 L342,78.8 L342,78.8 L343,93.3 L344,93.3 L345,93.3 L346,93.3 L346,93.3 L347,93.3 L348,93.3 L349,93.3 L350,93.3 L350,93.3 L351,93.3 L352,93.3 L353,93.3 L353,93.3 L354,93.3 L355,93.3 L356,108 L357,93.3 L357,78.8 L358,93.3 L359,93.3 L360,93.3 L361,93.3 L361,93.3 L362,93.3 L363,93.3 L364,93.3 L365,93.3 L365,93.3 L366,78.8 L367,93.3 L368,93.3 L368,93.3 L369,93.3 L370,93.3 L371,93.3 L372,93.3 L372,108 L373,93.3 " fill="none"/></g>
|
||||
</g>
|
||||
<g id="plotPoints" clip-path="url(#plot_window)"></g>
|
||||
<g id="title">
|
||||
<text x="200" y="22" text-anchor="middle" font-size="11" font-family="Lucida Sans Unicode">Lambert W-1 function differences from 'best' for double.</text></g>
|
||||
<g id="plotXValues"></g>
|
||||
<g id="plotYValues"></g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.5 KiB |
BIN
doc/graphs/lambert_wm1_prime_graph.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
54
doc/graphs/lambert_wm1_prime_graph.svg
Normal file
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="400" height ="300" version="1.1"
|
||||
xmlns:svg ="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns ="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<!-- SVG plot written using Boost.Plot program (Creator Jacob Voytko) -->
|
||||
<!-- Use, modification and distribution of Boost.Plot subject to 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) -->
|
||||
|
||||
<!-- SVG Plot Copyright Paul A. Bristow 2018 -->
|
||||
<meta name="copyright" content="Paul A. Bristow" />
|
||||
<meta name="date" content="2018" />
|
||||
<clipPath id="plot_window"><rect x="85.2" y="54" width="287.8" height="204"/></clipPath>
|
||||
<g id="imageBackground" stroke="rgb(255,255,0)" fill="rgb(255,255,255)" stroke-width="2"><rect x="0" y="0" width="400" height="300"/></g>
|
||||
<g id="plotBackground" stroke="rgb(119,136,153)" fill="rgb(255,255,255)" stroke-width="2"><rect x="84.2" y="53" width="289.8" height="206"/></g>
|
||||
<g id="yMinorGrid" stroke="rgb(200,220,255)" stroke-width="0.5"></g>
|
||||
<g id="yMajorGrid" stroke="rgb(200,220,255)" stroke-width="1"><path d="M86.2,53 L372,53 M86.2,121.7 L372,121.7 M86.2,190.3 L372,190.3 M86.2,259 L372,259 " fill="none"/></g>
|
||||
<g id="xMinorGrid" stroke="rgb(200,220,255)" stroke-width="0.5"></g>
|
||||
<g id="xMajorGrid" stroke="rgb(200,220,255)" stroke-width="1"><path d="M366.9,53 L366.9,259 M366.9,53 L366.9,259 M296.2,53 L296.2,259 M225.6,53 L225.6,259 M154.9,53 L154.9,259 M84.2,53 L84.2,259 " fill="none"/></g>
|
||||
<g id="yAxis" stroke="rgb(0,0,0)" stroke-width="1"><line x1="366.9" y1="53" x2="366.9" y2="259"/><line x1="84.2" y1="53" x2="84.2" y2="259"/></g>
|
||||
<g id="xAxis" stroke="rgb(0,0,0)" stroke-width="1"><line x1="84.2" y1="53" x2="374" y2="53"/></g>
|
||||
<g id="yMinorTicks" stroke="rgb(0,0,0)" stroke-width="1"><path d="M82.2,66.73 L84.2,66.73 M82.2,80.47 L84.2,80.47 M82.2,94.2 L84.2,94.2 M82.2,107.9 L84.2,107.9 M82.2,121.7 L84.2,121.7 M82.2,135.4 L84.2,135.4 M82.2,149.1 L84.2,149.1 M82.2,162.9 L84.2,162.9 M82.2,176.6 L84.2,176.6 M82.2,190.3 L84.2,190.3 M82.2,204.1 L84.2,204.1 M82.2,217.8 L84.2,217.8 M82.2,231.5 L84.2,231.5 M82.2,245.3 L84.2,245.3 M82.2,259 L84.2,259 " fill="none"/></g>
|
||||
<g id="xMinorTicks" stroke="rgb(0,0,0)" stroke-width="1"><path d="M352.8,53 L352.8,55 M338.7,53 L338.7,55 M324.5,53 L324.5,55 M310.4,53 L310.4,55 M282.1,53 L282.1,55 M268,53 L268,55 M253.8,53 L253.8,55 M239.7,53 L239.7,55 M211.4,53 L211.4,55 M197.3,53 L197.3,55 M183.2,53 L183.2,55 M169,53 L169,55 M140.7,53 L140.7,55 M126.6,53 L126.6,55 M112.5,53 L112.5,55 M98.34,53 L98.34,55 " fill="none"/></g>
|
||||
<g id="yMajorTicks" stroke="rgb(0,0,0)" stroke-width="2"><path d="M79.2,53 L84.2,53 M79.2,121.7 L84.2,121.7 M79.2,190.3 L84.2,190.3 M79.2,259 L84.2,259 " fill="none"/></g>
|
||||
<g id="xMajorTicks" stroke="rgb(0,0,0)" stroke-width="2"><path d="M366.9,53 L366.9,58 M366.9,53 L366.9,58 M296.2,53 L296.2,58 M225.6,53 L225.6,58 M154.9,53 L154.9,58 M84.2,53 L84.2,58 " fill="none"/></g>
|
||||
<g id="xTicksValues">
|
||||
<text x="366.9" y="73.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="366.9" y="73.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">0</text>
|
||||
<text x="296.2" y="73.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">-0.1</text>
|
||||
<text x="225.6" y="73.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">-0.2</text>
|
||||
<text x="154.9" y="73.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">-0.3</text>
|
||||
<text x="84.2" y="73.6" text-anchor="middle" font-size="12" font-family="Lucida Sans Unicode">-0.4</text></g>
|
||||
<g id="yTicksValues">
|
||||
<text x="73.2" y="55.4" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-5</text>
|
||||
<text x="73.2" y="124.1" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-10</text>
|
||||
<text x="73.2" y="192.7" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-15</text>
|
||||
<text x="73.2" y="261.4" text-anchor="end" font-size="12" font-family="Lucida Sans Unicode">-20</text></g>
|
||||
<g id="yLabel">
|
||||
<text x="42.9" y="156" text-anchor="middle" transform = "rotate(-90 42.9 156 )" font-size="14" font-family="Lucida Sans Unicode">W-1'</text></g>
|
||||
<g id="xLabel">
|
||||
<text x="229.1" y="282.8" text-anchor="middle" font-size="14" font-family="Lucida Sans Unicode">z</text></g>
|
||||
<g id="plotLines" stroke-width="2"><g clip-path="url(#plot_window)" stroke="rgb(0,0,255)" stroke-width="1"><path d="M110.5,237.1 L110.5,237.1 L111.2,218.1 L111.9,203.4 L112.6,191.5 L113.3,181.7 L114,173.5 L114.7,166.4 L115.4,160.2 L116.1,154.8 L116.9,150 L117.6,145.7 L118.3,141.9 L119,138.3 L119.7,135.2 L120.4,132.2 L121.1,129.5 L121.8,127.1 L122.5,124.8 L123.2,122.7 L123.9,120.7 L124.6,118.8 L125.3,117.1 L126,115.5 L126.8,113.9 L127.5,112.5 L128.2,111.2 L128.9,109.9 L129.6,108.7 L130.3,107.5 L131,106.5 L131.7,105.4 L132.4,104.5 L133.1,103.5 L133.8,102.7 L134.5,101.8 L135.2,101 L135.9,100.3 L136.6,99.54 L137.4,98.85 L138.1,98.19 L138.8,97.56 L139.5,96.95 L140.2,96.38 L140.9,95.82 L141.6,95.3 L142.3,94.79 L143,94.31 L143.7,93.85 L144.4,93.4 L145.1,92.98 L145.8,92.57 L146.5,92.18 L147.2,91.81 L148,91.46 L148.7,91.12 L149.4,90.79 L150.1,90.48 L150.8,90.18 L151.5,89.9 L152.2,89.63 L152.9,89.37 L153.6,89.12 L154.3,88.88 L155,88.66 L155.7,88.44 L156.4,88.24 L157.1,88.04 L157.9,87.86 L158.6,87.68 L159.3,87.52 L160,87.36 L160.7,87.22 L161.4,87.08 L162.1,86.95 L162.8,86.82 L163.5,86.71 L164.2,86.6 L164.9,86.5 L165.6,86.41 L166.3,86.32 L167,86.25 L167.7,86.17 L168.5,86.11 L169.2,86.05 L169.9,86 L170.6,85.96 L171.3,85.92 L172,85.88 L172.7,85.86 L173.4,85.84 L174.1,85.82 L174.8,85.81 L175.5,85.81 L176.2,85.81 L176.9,85.82 L177.6,85.83 L178.3,85.85 L179.1,85.87 L179.8,85.9 L180.5,85.94 L181.2,85.98 L181.9,86.02 L182.6,86.07 L183.3,86.12 L184,86.18 L184.7,86.24 L185.4,86.31 L186.1,86.38 L186.8,86.46 L187.5,86.54 L188.2,86.63 L189,86.72 L189.7,86.82 L190.4,86.92 L191.1,87.02 L191.8,87.13 L192.5,87.25 L193.2,87.37 L193.9,87.49 L194.6,87.62 L195.3,87.75 L196,87.88 L196.7,88.02 L197.4,88.17 L198.1,88.32 L198.8,88.47 L199.6,88.63 L200.3,88.79 L201,88.96 L201.7,89.13 L202.4,89.3 L203.1,89.48 L203.8,89.66 L204.5,89.85 L205.2,90.04 L205.9,90.24 L206.6,90.44 L207.3,90.65 L208,90.86 L208.7,91.07 L209.5,91.29 L210.2,91.51 L210.9,91.74 L211.6,91.97 L212.3,92.21 L213,92.45 L213.7,92.69 L214.4,92.94 L215.1,93.2 L215.8,93.45 L216.5,93.72 L217.2,93.99 L217.9,94.26 L218.6,94.54 L219.3,94.82 L220.1,95.11 L220.8,95.4 L221.5,95.69 L222.2,96 L222.9,96.3 L223.6,96.61 L224.3,96.93 L225,97.25 L225.7,97.58 L226.4,97.91 L227.1,98.25 L227.8,98.59 L228.5,98.94 L229.2,99.29 L229.9,99.65 L230.7,100 L231.4,100.4 L232.1,100.8 L232.8,101.1 L233.5,101.5 L234.2,101.9 L234.9,102.3 L235.6,102.7 L236.3,103.1 L237,103.5 L237.7,104 L238.4,104.4 L239.1,104.8 L239.8,105.3 L240.6,105.7 L241.3,106.2 L242,106.6 L242.7,107.1 L243.4,107.6 L244.1,108 L244.8,108.5 L245.5,109 L246.2,109.5 L246.9,110 L247.6,110.6 L248.3,111.1 L249,111.6 L249.7,112.2 L250.4,112.7 L251.2,113.3 L251.9,113.8 L252.6,114.4 L253.3,115 L254,115.6 L254.7,116.2 L255.4,116.8 L256.1,117.4 L256.8,118 L257.5,118.6 L258.2,119.3 L258.9,119.9 L259.6,120.6 L260.3,121.3 L261,122 L261.8,122.6 L262.5,123.3 L263.2,124.1 L263.9,124.8 L264.6,125.5 L265.3,126.3 L266,127 L266.7,127.8 L267.4,128.6 L268.1,129.4 L268.8,130.2 L269.5,131 L270.2,131.8 L270.9,132.7 L271.7,133.6 L272.4,134.4 L273.1,135.3 L273.8,136.2 L274.5,137.1 L275.2,138.1 L275.9,139 L276.6,140 L277.3,141 L278,142 L278.7,143 L279.4,144 L280.1,145.1 L280.8,146.1 L281.5,147.2 L282.3,148.3 L283,149.4 L283.7,150.6 L284.4,151.8 L285.1,152.9 L285.8,154.2 L286.5,155.4 L287.2,156.6 L287.9,157.9 L288.6,159.2 L289.3,160.5 L290,161.9 L290.7,163.3 L291.4,164.7 L292.1,166.1 L292.9,167.5 L293.6,169 L294.3,170.5 L295,172.1 L295.7,173.7 L296.4,175.3 L297.1,176.9 L297.8,178.6 L298.5,180.3 L299.2,182.1 L299.9,183.8 L300.6,185.7 L301.3,187.5 L302,189.4 L302.8,191.4 L303.5,193.4 L304.2,195.4 L304.9,197.5 L305.6,199.6 L306.3,201.8 L307,204.1 L307.7,206.3 L308.4,208.7 L309.1,211.1 L309.8,213.5 L310.5,216.1 L311.2,218.7 L311.9,221.3 L312.6,224 L313.4,226.8 L314.1,229.7 L314.8,232.7 L315.5,235.7 L316.2,238.8 L316.9,242 L317.6,245.3 L318.3,248.7 L319,252.2 L319.7,255.8 L320.4,259.5 " fill="none"/></g>
|
||||
</g>
|
||||
<g id="plotPoints" clip-path="url(#plot_window)"></g>
|
||||
<g id="title">
|
||||
<text x="200" y="36" text-anchor="middle" font-size="18" font-family="Lucida Sans Unicode">Lambert W-1 prime function.</text></g>
|
||||
<g id="plotXValues"></g>
|
||||
<g id="plotYValues"></g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.5 KiB |
@@ -122,7 +122,7 @@ This manual is also available in <a href="http://sourceforge.net/projects/boost/
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"><p><small>Last revised: August 20, 2018 at 18:25:34 GMT</small></p></td>
|
||||
<td align="left"><p><small>Last revised: August 30, 2018 at 17:17:24 GMT</small></p></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="id1778132"></a>Function Index</h2></div></div></div>
|
||||
<a name="id1805060"></a>Function Index</h2></div></div></div>
|
||||
<p><a class="link" href="s01.html#idx_id_0">1</a> <a class="link" href="s01.html#idx_id_1">2</a> <a class="link" href="s01.html#idx_id_2">4</a> <a class="link" href="s01.html#idx_id_3">A</a> <a class="link" href="s01.html#idx_id_4">B</a> <a class="link" href="s01.html#idx_id_5">C</a> <a class="link" href="s01.html#idx_id_6">D</a> <a class="link" href="s01.html#idx_id_7">E</a> <a class="link" href="s01.html#idx_id_8">F</a> <a class="link" href="s01.html#idx_id_9">G</a> <a class="link" href="s01.html#idx_id_10">H</a> <a class="link" href="s01.html#idx_id_11">I</a> <a class="link" href="s01.html#idx_id_12">J</a> <a class="link" href="s01.html#idx_id_13">K</a> <a class="link" href="s01.html#idx_id_14">L</a> <a class="link" href="s01.html#idx_id_15">M</a> <a class="link" href="s01.html#idx_id_16">N</a> <a class="link" href="s01.html#idx_id_17">O</a> <a class="link" href="s01.html#idx_id_18">P</a> <a class="link" href="s01.html#idx_id_19">Q</a> <a class="link" href="s01.html#idx_id_20">R</a> <a class="link" href="s01.html#idx_id_21">S</a> <a class="link" href="s01.html#idx_id_22">T</a> <a class="link" href="s01.html#idx_id_23">U</a> <a class="link" href="s01.html#idx_id_24">V</a> <a class="link" href="s01.html#idx_id_25">W</a> <a class="link" href="s01.html#idx_id_26">X</a> <a class="link" href="s01.html#idx_id_27">Y</a> <a class="link" href="s01.html#idx_id_28">Z</a></p>
|
||||
<div class="variablelist"><dl class="variablelist">
|
||||
<dt>
|
||||
@@ -134,6 +134,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">al</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">area</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/tutorial/non_templ.html" title="Use in non-template code"><span class="index-entry-level-1">Use in non-template code</span></a></p></li>
|
||||
@@ -1059,8 +1063,8 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/overview_tr1.html" title="C99 and C++ TR1 C-style Functions"><span class="index-entry-level-1">C99 and C++ TR1 C-style Functions</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_tr1.html" title="C99 and TR1 C Functions Overview"><span class="index-entry-level-1">C99 and TR1 C Functions Overview</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/logs_and_tables/logs.html" title="Error Logs For Error Rate Tables"><span class="index-entry-level-1">Error Logs For Error Rate Tables</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.75. Error rates for expint (Ei)"><span class="index-entry-level-1">Error rates for expint (Ei)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.74. Error rates for expint (En)"><span class="index-entry-level-1">Error rates for expint (En)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.78. Error rates for expint (Ei)"><span class="index-entry-level-1">Error rates for expint (Ei)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.77. Error rates for expint (En)"><span class="index-entry-level-1">Error rates for expint (En)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html" title="Exponential Integral Ei"><span class="index-entry-level-1">Exponential Integral Ei</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html" title="Exponential Integral En"><span class="index-entry-level-1">Exponential Integral En</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/tr1_ref.html" title="TR1 C Functions Quick Reference"><span class="index-entry-level-1">TR1 C Functions Quick Reference</span></a></p></li>
|
||||
@@ -1188,6 +1192,10 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/diff.html" title="Numerical Differentiation"><span class="index-entry-level-1">Numerical Differentiation</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">float</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">float_advance</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/next_float/float_advance.html" title="Advancing a floating-point Value by a Specific Representation Distance (ULP) float_advance"><span class="index-entry-level-1">Advancing a floating-point Value by a Specific Representation Distance (ULP) float_advance</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -1382,6 +1390,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">get_epsilon</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">get_from_string</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/new_const.html" title="Defining New Constants"><span class="index-entry-level-1">Defining New Constants</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -1487,8 +1499,11 @@
|
||||
</dt>
|
||||
<dd><div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">i</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/oct_overview.html" title="Overview"><span class="index-entry-level-1">Overview</span></a></p></li></ul></div>
|
||||
<p><span class="index-entry-level-0">I</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/oct_overview.html" title="Overview"><span class="index-entry-level-1">Overview</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">ibeta</span></p>
|
||||
@@ -1605,7 +1620,10 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">interval</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/binomial_dist.html" title="Binomial Distribution"><span class="index-entry-level-1">Binomial Distribution</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/binomial_dist.html" title="Binomial Distribution"><span class="index-entry-level-1">Binomial Distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">inverse</span></p>
|
||||
@@ -1719,10 +1737,13 @@
|
||||
</dt>
|
||||
<dd><div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">K</span></p>
|
||||
<p><span class="index-entry-level-0">k</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/root_finding_examples/elliptic_eg.html" title="A More complex example - Inverting the Elliptic Integrals"><span class="index-entry-level-1">A More complex example - Inverting the Elliptic Integrals</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_intro.html" title="Elliptic Integral Overview"><span class="index-entry-level-1">Elliptic Integral Overview</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_1.html" title="Elliptic Integrals of the First Kind - Legendre Form"><span class="index-entry-level-1">Elliptic Integrals of the First Kind - Legendre Form</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">Hypergeometric Distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/jacobi/jacobi_elliptic.html" title="Jacobi Elliptic SN, CN and DN"><span class="index-entry-level-1">Jacobi Elliptic SN, CN and DN</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/issues.html" title="Known Issues, and TODO List"><span class="index-entry-level-1">Known Issues, and TODO List</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
@@ -1790,6 +1811,22 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/laguerre.html" title="Laguerre (and Associated) Polynomials"><span class="index-entry-level-1">Laguerre (and Associated) Polynomials</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lambert_w0</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lambert_w0_prime</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lambert_wm1</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lambert_wm1_prime</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">ldexp</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/real_concepts.html" title="Conceptual Requirements for Real Number Types"><span class="index-entry-level-1">Conceptual Requirements for Real Number Types</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -1918,6 +1955,13 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/rounding/trunc.html" title="Truncation Functions"><span class="index-entry-level-1">Truncation Functions</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">ln</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/constants.html#math_toolkit.constants.mathematical_constants" title="Table 4.1. Mathematical Constants"><span class="index-entry-level-1">Mathematical Constants</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">location</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/cauchy_dist.html" title="Cauchy-Lorentz Distribution"><span class="index-entry-level-1">Cauchy-Lorentz Distribution</span></a></p></li>
|
||||
@@ -2002,6 +2046,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lookup</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">Bernoulli Numbers</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lrint</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/overview_tr1.html" title="C99 and C++ TR1 C-style Functions"><span class="index-entry-level-1">C99 and C++ TR1 C-style Functions</span></a></p></li>
|
||||
@@ -2083,7 +2131,10 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">message</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">Bernoulli Numbers</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">Bernoulli Numbers</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">min</span></p>
|
||||
@@ -2099,6 +2150,15 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">more</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_faq.html" title="Frequently Asked Questions FAQ"><span class="index-entry-level-1">Frequently Asked Questions FAQ</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/geometric_eg.html" title="Geometric Distribution Examples"><span class="index-entry-level-1">Geometric Distribution Examples</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">Inverse Chi-Squared Distribution Bayes Example</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/high_precision/use_multiprecision.html" title="Using Boost.Multiprecision"><span class="index-entry-level-1">Using Boost.Multiprecision</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">msg</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/pol_tutorial/user_def_err_pol.html" title="Calling User Defined Error Handlers"><span class="index-entry-level-1">Calling User Defined Error Handlers</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -2318,6 +2378,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">point</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/result_type.html" title="Calculation of the Type of the Result"><span class="index-entry-level-1">Calculation of the Type of the Result</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">polar</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/sph_harm.html" title="Spherical Harmonics"><span class="index-entry-level-1">Spherical Harmonics</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -2344,6 +2408,10 @@
|
||||
</dt>
|
||||
<dd><div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">quad</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/chebyshev.html" title="Chebyshev Polynomials"><span class="index-entry-level-1">Chebyshev Polynomials</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">quantile</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/overview/complements.html" title="Complements are supported too - and when to use them"><span class="index-entry-level-1">Complements are supported too - and when to use them</span></a></p></li>
|
||||
@@ -2394,10 +2462,15 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/double_exponential/de_caveats.html" title="Caveats"><span class="index-entry-level-1">Caveats</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/compilers_overview.html" title="Compilers"><span class="index-entry-level-1">Compilers</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/gauss_kronrod.html" title="Gauss-Kronrod Quadrature"><span class="index-entry-level-1">Gauss-Kronrod Quadrature</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/nmp.html" title="Non-Member Properties"><span class="index-entry-level-1">Non-Member Properties</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">refinement</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">relative_difference</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/float_comparison.html" title="Floating-point Comparison"><span class="index-entry-level-1">Floating-point Comparison</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -2444,6 +2517,13 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">required</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/double_exponential/de_levels.html" title="Setting the Maximum Interval Halvings and Memory Requirements"><span class="index-entry-level-1">Setting the Maximum Interval Halvings and Memory Requirements</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">riemann_zeta</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/overview_tr1.html" title="C99 and C++ TR1 C-style Functions"><span class="index-entry-level-1">C99 and C++ TR1 C-style Functions</span></a></p></li>
|
||||
@@ -2648,6 +2728,17 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">small</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/bessel_first.html" title="Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">Bessel Functions of the First and Second Kinds</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/expm1.html" title="expm1"><span class="index-entry-level-1">expm1</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">Inverse Chi-Squared Distribution Bayes Example</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/mbessel.html" title="Modified Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">Modified Bessel Functions of the First and Second Kinds</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_inv_function.html" title="The Incomplete Beta Function Inverses"><span class="index-entry-level-1">The Incomplete Beta Function Inverses</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">spherical</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/oct_create.html" title="Octonion Creation Functions"><span class="index-entry-level-1">Octonion Creation Functions</span></a></p></li>
|
||||
@@ -2755,6 +2846,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">step</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">subtraction</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/digamma.html" title="Digamma"><span class="index-entry-level-1">Digamma</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -2789,7 +2884,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/st_eg/tut_mean_intervals.html" title="Calculating confidence intervals on the mean with the Students-t distribution"><span class="index-entry-level-1">Calculating confidence intervals on the mean with the Students-t distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/nc_t_dist.html#math_toolkit.dist_ref.dists.nc_t_dist.table_non_central_t_CDF" title="Table 5.8. Error rates for non central t CDF"><span class="index-entry-level-1">Error rates for non central t CDF</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/nc_t_dist.html#math_toolkit.dist_ref.dists.nc_t_dist.table_non_central_t_CDF_complement" title="Table 5.9. Error rates for non central t CDF complement"><span class="index-entry-level-1">Error rates for non central t CDF complement</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/owens_t.html#math_toolkit.owens_t.table_owens_t" title="Table 6.83. Error rates for owens_t"><span class="index-entry-level-1">Error rates for owens_t</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/owens_t.html#math_toolkit.owens_t.table_owens_t" title="Table 6.86. Error rates for owens_t"><span class="index-entry-level-1">Error rates for owens_t</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/special_tut/special_tut_impl.html" title="Implementation"><span class="index-entry-level-1">Implementation</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/issues.html" title="Known Issues, and TODO List"><span class="index-entry-level-1">Known Issues, and TODO List</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/rational.html" title="Polynomial and Rational Function Evaluation"><span class="index-entry-level-1">Polynomial and Rational Function Evaluation</span></a></p></li>
|
||||
@@ -3055,13 +3150,19 @@
|
||||
<dt>
|
||||
<a name="idx_id_25"></a><span class="term">W</span>
|
||||
</dt>
|
||||
<dd><div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none">
|
||||
<dd><div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">W</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">weights</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/gauss_kronrod.html" title="Gauss-Kronrod Quadrature"><span class="index-entry-level-1">Gauss-Kronrod Quadrature</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/gauss.html" title="Gauss-Legendre quadrature"><span class="index-entry-level-1">Gauss-Legendre quadrature</span></a></p></li>
|
||||
</ul></div>
|
||||
</li></ul></div></dd>
|
||||
</li>
|
||||
</ul></div></dd>
|
||||
<dt>
|
||||
<a name="idx_id_26"></a><span class="term">X</span>
|
||||
</dt>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="id1798778"></a>Class Index</h2></div></div></div>
|
||||
<a name="id1831003"></a>Class Index</h2></div></div></div>
|
||||
<p><a class="link" href="s02.html#idx_id_32">A</a> <a class="link" href="s02.html#idx_id_33">B</a> <a class="link" href="s02.html#idx_id_34">C</a> <a class="link" href="s02.html#idx_id_35">D</a> <a class="link" href="s02.html#idx_id_36">E</a> <a class="link" href="s02.html#idx_id_37">F</a> <a class="link" href="s02.html#idx_id_38">G</a> <a class="link" href="s02.html#idx_id_39">H</a> <a class="link" href="s02.html#idx_id_40">I</a> <a class="link" href="s02.html#idx_id_43">L</a> <a class="link" href="s02.html#idx_id_44">M</a> <a class="link" href="s02.html#idx_id_45">N</a> <a class="link" href="s02.html#idx_id_46">O</a> <a class="link" href="s02.html#idx_id_47">P</a> <a class="link" href="s02.html#idx_id_48">Q</a> <a class="link" href="s02.html#idx_id_49">R</a> <a class="link" href="s02.html#idx_id_50">S</a> <a class="link" href="s02.html#idx_id_51">T</a> <a class="link" href="s02.html#idx_id_52">U</a> <a class="link" href="s02.html#idx_id_54">W</a></p>
|
||||
<div class="variablelist"><dl class="variablelist">
|
||||
<dt>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="id1803738"></a>Typedef Index</h2></div></div></div>
|
||||
<a name="id1832378"></a>Typedef Index</h2></div></div></div>
|
||||
<p><a class="link" href="s03.html#idx_id_61">A</a> <a class="link" href="s03.html#idx_id_62">B</a> <a class="link" href="s03.html#idx_id_63">C</a> <a class="link" href="s03.html#idx_id_64">D</a> <a class="link" href="s03.html#idx_id_65">E</a> <a class="link" href="s03.html#idx_id_66">F</a> <a class="link" href="s03.html#idx_id_67">G</a> <a class="link" href="s03.html#idx_id_68">H</a> <a class="link" href="s03.html#idx_id_69">I</a> <a class="link" href="s03.html#idx_id_72">L</a> <a class="link" href="s03.html#idx_id_74">N</a> <a class="link" href="s03.html#idx_id_75">O</a> <a class="link" href="s03.html#idx_id_76">P</a> <a class="link" href="s03.html#idx_id_78">R</a> <a class="link" href="s03.html#idx_id_79">S</a> <a class="link" href="s03.html#idx_id_80">T</a> <a class="link" href="s03.html#idx_id_81">U</a> <a class="link" href="s03.html#idx_id_82">V</a> <a class="link" href="s03.html#idx_id_83">W</a></p>
|
||||
<div class="variablelist"><dl class="variablelist">
|
||||
<dt>
|
||||
@@ -212,6 +212,10 @@
|
||||
<p><span class="index-entry-level-0">lognormal</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/lognormal_dist.html" title="Log Normal Distribution"><span class="index-entry-level-1">Log Normal Distribution</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lookup_t</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
</ul></div></dd>
|
||||
<dt>
|
||||
<a name="idx_id_74"></a><span class="term">N</span>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="id1806987"></a>Macro Index</h2></div></div></div>
|
||||
<a name="id1834924"></a>Macro Index</h2></div></div></div>
|
||||
<p><a class="link" href="s04.html#idx_id_91">B</a> <a class="link" href="s04.html#idx_id_95">F</a></p>
|
||||
<div class="variablelist"><dl class="variablelist">
|
||||
<dt>
|
||||
@@ -298,6 +298,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">BOOST_MATH_TEST_VALUE</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">BOOST_MATH_UNDERFLOW_ERROR_POLICY</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/pol_ref/policy_defaults.html" title="Using Macros to Change the Policy Defaults"><span class="index-entry-level-1">Using Macros to Change the Policy Defaults</span></a></p></li></ul></div>
|
||||
</li>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="id1808401"></a>Index</h2></div></div></div>
|
||||
<a name="id1836359"></a>Index</h2></div></div></div>
|
||||
<p><a class="link" href="s05.html#idx_id_116">1</a> <a class="link" href="s05.html#idx_id_117">2</a> <a class="link" href="s05.html#idx_id_118">4</a> <a class="link" href="s05.html#idx_id_119">A</a> <a class="link" href="s05.html#idx_id_120">B</a> <a class="link" href="s05.html#idx_id_121">C</a> <a class="link" href="s05.html#idx_id_122">D</a> <a class="link" href="s05.html#idx_id_123">E</a> <a class="link" href="s05.html#idx_id_124">F</a> <a class="link" href="s05.html#idx_id_125">G</a> <a class="link" href="s05.html#idx_id_126">H</a> <a class="link" href="s05.html#idx_id_127">I</a> <a class="link" href="s05.html#idx_id_128">J</a> <a class="link" href="s05.html#idx_id_129">K</a> <a class="link" href="s05.html#idx_id_130">L</a> <a class="link" href="s05.html#idx_id_131">M</a> <a class="link" href="s05.html#idx_id_132">N</a> <a class="link" href="s05.html#idx_id_133">O</a> <a class="link" href="s05.html#idx_id_134">P</a> <a class="link" href="s05.html#idx_id_135">Q</a> <a class="link" href="s05.html#idx_id_136">R</a> <a class="link" href="s05.html#idx_id_137">S</a> <a class="link" href="s05.html#idx_id_138">T</a> <a class="link" href="s05.html#idx_id_139">U</a> <a class="link" href="s05.html#idx_id_140">V</a> <a class="link" href="s05.html#idx_id_141">W</a> <a class="link" href="s05.html#idx_id_142">X</a> <a class="link" href="s05.html#idx_id_143">Y</a> <a class="link" href="s05.html#idx_id_144">Z</a></p>
|
||||
<div class="variablelist"><dl class="variablelist">
|
||||
<dt>
|
||||
@@ -137,6 +137,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/constants_faq.html" title="FAQs"><span class="index-entry-level-1">FAQs</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/find_eg/find_mean_and_sd_eg.html" title="Find mean and standard deviation example"><span class="index-entry-level-1">Find mean and standard deviation example</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/root_finding_examples/cbrt_eg.html" title="Finding the Cubed Root With and Without Derivatives"><span class="index-entry-level-1">Finding the Cubed Root With and Without Derivatives</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/next_float.html" title="Floating-Point Representation Distance (ULP), and Finding Adjacent Floating-Point Values"><span class="index-entry-level-1">Floating-Point Representation Distance (ULP), and Finding Adjacent Floating-Point Values</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_faq.html" title="Frequently Asked Questions FAQ"><span class="index-entry-level-1">Frequently Asked Questions FAQ</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/tgamma.html" title="Gamma"><span class="index-entry-level-1">Gamma</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/gamma_dist.html" title="Gamma (and Erlang) Distribution"><span class="index-entry-level-1">Gamma (and Erlang) Distribution</span></a></p></li>
|
||||
@@ -162,6 +163,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/jacobi_zeta.html" title="Jacobi Zeta Function"><span class="index-entry-level-1">Jacobi Zeta Function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/issues.html" title="Known Issues, and TODO List"><span class="index-entry-level-1">Known Issues, and TODO List</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/laguerre.html" title="Laguerre (and Associated) Polynomials"><span class="index-entry-level-1">Laguerre (and Associated) Polynomials</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/laplace_dist.html" title="Laplace Distribution"><span class="index-entry-level-1">Laplace Distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/legendre.html" title="Legendre (and Associated) Polynomials"><span class="index-entry-level-1">Legendre (and Associated) Polynomials</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/brent_minima.html" title="Locating Function Minima using Brent's algorithm"><span class="index-entry-level-1">Locating Function Minima using Brent's algorithm</span></a></p></li>
|
||||
@@ -317,6 +319,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">al</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Algorithm TOMS 748: Alefeld, Potra and Shi: Enclosing zeros of continuous functions</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/roots_noderiv/TOMS748.html" title="Algorithm TOMS 748: Alefeld, Potra and Shi: Enclosing zeros of continuous functions"><span class="index-entry-level-1">toms748_solve</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -503,6 +509,7 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">bernoulli_b2n</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">lookup</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">message</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">performance</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">unchecked_bernoulli_b2n</span></a></p></li>
|
||||
@@ -527,6 +534,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/bessel_first.html" title="Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">GSL</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/bessel_first.html" title="Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">n</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/bessel_first.html" title="Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">O</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/bessel_first.html" title="Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">small</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/bessel_first.html" title="Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">v</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
@@ -962,6 +970,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">BOOST_MATH_TEST_VALUE</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">BOOST_MATH_UNDERFLOW_ERROR_POLICY</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/pol_ref/policy_defaults.html" title="Using Macros to Change the Policy Defaults"><span class="index-entry-level-1">Using Macros to Change the Policy Defaults</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -1431,6 +1443,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Calculation of the Type of the Result</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/result_type.html" title="Calculation of the Type of the Result"><span class="index-entry-level-1">point</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">called</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/special_tut/special_tut_impl.html" title="Implementation"><span class="index-entry-level-1">Implementation</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -1592,6 +1608,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/chebyshev.html" title="Chebyshev Polynomials"><span class="index-entry-level-1">n</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/chebyshev.html" title="Chebyshev Polynomials"><span class="index-entry-level-1">operator</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/chebyshev.html" title="Chebyshev Polynomials"><span class="index-entry-level-1">prime</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/chebyshev.html" title="Chebyshev Polynomials"><span class="index-entry-level-1">quad</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
@@ -1914,6 +1931,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">Hypergeometric Distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/special_tut/special_tut_impl.html" title="Implementation"><span class="index-entry-level-1">Implementation</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/constants_intro.html" title="Introduction"><span class="index-entry-level-1">Introduction</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/lgamma.html" title="Log Gamma"><span class="index-entry-level-1">Log Gamma</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../constants.html" title="Chapter 4. Mathematical Constants"><span class="index-entry-level-1">Mathematical Constants</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/internals/minimax.html" title="Minimax Approximations and the Remez Algorithm"><span class="index-entry-level-1">Minimax Approximations and the Remez Algorithm</span></a></p></li>
|
||||
@@ -2527,6 +2545,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_intro.html" title="Elliptic Integral Overview"><span class="index-entry-level-1">D</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_intro.html" title="Elliptic Integral Overview"><span class="index-entry-level-1">expression</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_intro.html" title="Elliptic Integral Overview"><span class="index-entry-level-1">J</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_intro.html" title="Elliptic Integral Overview"><span class="index-entry-level-1">k</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_intro.html" title="Elliptic Integral Overview"><span class="index-entry-level-1">R</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
@@ -2888,20 +2907,20 @@
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Error rates for expint (Ei)</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.75. Error rates for expint (Ei)"><span class="index-entry-level-1">expint</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.75. Error rates for expint (Ei)"><span class="index-entry-level-1">GSL</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.78. Error rates for expint (Ei)"><span class="index-entry-level-1">expint</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.78. Error rates for expint (Ei)"><span class="index-entry-level-1">GSL</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Error rates for expint (En)</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.74. Error rates for expint (En)"><span class="index-entry-level-1">expint</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.74. Error rates for expint (En)"><span class="index-entry-level-1">GSL</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.77. Error rates for expint (En)"><span class="index-entry-level-1">expint</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.77. Error rates for expint (En)"><span class="index-entry-level-1">GSL</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Error rates for expm1</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/expm1.html#math_toolkit.powers.expm1.table_expm1" title="Table 6.79. Error rates for expm1"><span class="index-entry-level-1">Rmath</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/expm1.html#math_toolkit.powers.expm1.table_expm1" title="Table 6.82. Error rates for expm1"><span class="index-entry-level-1">Rmath</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Error rates for gamma_p</span></p>
|
||||
@@ -3002,7 +3021,7 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Error rates for log1p</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/log1p.html#math_toolkit.powers.log1p.table_log1p" title="Table 6.78. Error rates for log1p"><span class="index-entry-level-1">Rmath</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/log1p.html#math_toolkit.powers.log1p.table_log1p" title="Table 6.81. Error rates for log1p"><span class="index-entry-level-1">Rmath</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Error rates for non central beta CDF</span></p>
|
||||
@@ -3036,7 +3055,7 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Error rates for owens_t</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/owens_t.html#math_toolkit.owens_t.table_owens_t" title="Table 6.83. Error rates for owens_t"><span class="index-entry-level-1">T</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/owens_t.html#math_toolkit.owens_t.table_owens_t" title="Table 6.86. Error rates for owens_t"><span class="index-entry-level-1">T</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Error rates for polygamma</span></p>
|
||||
@@ -3087,7 +3106,7 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Error rates for zeta</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/zetas/zeta.html#math_toolkit.zetas.zeta.table_zeta" title="Table 6.73. Error rates for zeta"><span class="index-entry-level-1">GSL</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/zetas/zeta.html#math_toolkit.zetas.zeta.table_zeta" title="Table 6.76. Error rates for zeta"><span class="index-entry-level-1">GSL</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Estimating Sample Sizes for a Binomial Distribution.</span></p>
|
||||
@@ -3180,8 +3199,8 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/overview_tr1.html" title="C99 and C++ TR1 C-style Functions"><span class="index-entry-level-1">C99 and C++ TR1 C-style Functions</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_tr1.html" title="C99 and TR1 C Functions Overview"><span class="index-entry-level-1">C99 and TR1 C Functions Overview</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/logs_and_tables/logs.html" title="Error Logs For Error Rate Tables"><span class="index-entry-level-1">Error Logs For Error Rate Tables</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.75. Error rates for expint (Ei)"><span class="index-entry-level-1">Error rates for expint (Ei)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.74. Error rates for expint (En)"><span class="index-entry-level-1">Error rates for expint (En)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.78. Error rates for expint (Ei)"><span class="index-entry-level-1">Error rates for expint (Ei)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.77. Error rates for expint (En)"><span class="index-entry-level-1">Error rates for expint (En)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html" title="Exponential Integral Ei"><span class="index-entry-level-1">Exponential Integral Ei</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html" title="Exponential Integral En"><span class="index-entry-level-1">Exponential Integral En</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/tr1_ref.html" title="TR1 C Functions Quick Reference"><span class="index-entry-level-1">TR1 C Functions Quick Reference</span></a></p></li>
|
||||
@@ -3219,6 +3238,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_tr1.html" title="C99 and TR1 C Functions Overview"><span class="index-entry-level-1">C99 and TR1 C Functions Overview</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/c99.html" title="C99 C Functions"><span class="index-entry-level-1">C99 C Functions</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><span class="bold"><strong><a class="link" href="../math_toolkit/powers/expm1.html" title="expm1"><span class="index-entry-level-1">expm1</span></a></strong></span></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/expm1.html" title="expm1"><span class="index-entry-level-1">small</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
@@ -3302,6 +3322,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/constants_intro.html" title="Introduction"><span class="index-entry-level-1">Introduction</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">Inverse Chi-Squared Distribution Bayes Example</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/jacobi/jacobi_elliptic.html" title="Jacobi Elliptic SN, CN and DN"><span class="index-entry-level-1">Jacobi Elliptic SN, CN and DN</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/brent_minima.html" title="Locating Function Minima using Brent's algorithm"><span class="index-entry-level-1">Locating Function Minima using Brent's algorithm</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/pol_ref/assert_undefined.html" title="Mathematically Undefined Function Policies"><span class="index-entry-level-1">Mathematically Undefined Function Policies</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/neg_binom_eg/negative_binomial_example1.html" title="Negative Binomial Sales Quota Example."><span class="index-entry-level-1">Negative Binomial Sales Quota Example.</span></a></p></li>
|
||||
@@ -3566,6 +3587,10 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/f_dist.html" title="F Distribution"><span class="index-entry-level-1">F Distribution</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">float</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Floating-Point Classification: Infinities and NaNs</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/fpclass.html" title="Floating-Point Classification: Infinities and NaNs"><span class="index-entry-level-1">fpclassify</span></a></p></li>
|
||||
@@ -3600,6 +3625,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Floating-Point Representation Distance (ULP), and Finding Adjacent Floating-Point Values</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/next_float.html" title="Floating-Point Representation Distance (ULP), and Finding Adjacent Floating-Point Values"><span class="index-entry-level-1">accuracy</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">float_advance</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/next_float/float_advance.html" title="Advancing a floating-point Value by a Specific Representation Distance (ULP) float_advance"><span class="index-entry-level-1">Advancing a floating-point Value by a Specific Representation Distance (ULP) float_advance</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -3745,6 +3774,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_faq.html" title="Frequently Asked Questions FAQ"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_faq.html" title="Frequently Asked Questions FAQ"><span class="index-entry-level-1">Cephes</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_faq.html" title="Frequently Asked Questions FAQ"><span class="index-entry-level-1">distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_faq.html" title="Frequently Asked Questions FAQ"><span class="index-entry-level-1">more</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_faq.html" title="Frequently Asked Questions FAQ"><span class="index-entry-level-1">P</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_faq.html" title="Frequently Asked Questions FAQ"><span class="index-entry-level-1">performance</span></a></p></li>
|
||||
</ul></div>
|
||||
@@ -3950,6 +3980,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/geometric_eg.html" title="Geometric Distribution Examples"><span class="index-entry-level-1">BOOST_MATH_DISCRETE_QUANTILE_POLICY</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/geometric_eg.html" title="Geometric Distribution Examples"><span class="index-entry-level-1">BOOST_MATH_OVERFLOW_ERROR_POLICY</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/geometric_eg.html" title="Geometric Distribution Examples"><span class="index-entry-level-1">expression</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/geometric_eg.html" title="Geometric Distribution Examples"><span class="index-entry-level-1">more</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/geometric_eg.html" title="Geometric Distribution Examples"><span class="index-entry-level-1">normal</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
@@ -3966,6 +3997,10 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/getting_best.html" title="Getting the Best Performance from this Library: Compiler and Compiler Options"><span class="index-entry-level-1">performance</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">get_epsilon</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">get_from_string</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/new_const.html" title="Defining New Constants"><span class="index-entry-level-1">Defining New Constants</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -4023,8 +4058,8 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_carlson.html#math_toolkit.ellint.ellint_carlson.table_ellint_rj" title="Table 6.62. Error rates for ellint_rj"><span class="index-entry-level-1">Error rates for ellint_rj</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_erf/error_function.html#math_toolkit.sf_erf.error_function.table_erf" title="Table 6.28. Error rates for erf"><span class="index-entry-level-1">Error rates for erf</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_erf/error_function.html#math_toolkit.sf_erf.error_function.table_erfc" title="Table 6.29. Error rates for erfc"><span class="index-entry-level-1">Error rates for erfc</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.75. Error rates for expint (Ei)"><span class="index-entry-level-1">Error rates for expint (Ei)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.74. Error rates for expint (En)"><span class="index-entry-level-1">Error rates for expint (En)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html#math_toolkit.expint.expint_i.table_expint_Ei_" title="Table 6.78. Error rates for expint (Ei)"><span class="index-entry-level-1">Error rates for expint (Ei)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_n.html#math_toolkit.expint.expint_n.table_expint_En_" title="Table 6.77. Error rates for expint (En)"><span class="index-entry-level-1">Error rates for expint (En)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/igamma.html#math_toolkit.sf_gamma.igamma.table_gamma_p" title="Table 6.9. Error rates for gamma_p"><span class="index-entry-level-1">Error rates for gamma_p</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/igamma.html#math_toolkit.sf_gamma.igamma.table_gamma_q" title="Table 6.10. Error rates for gamma_q"><span class="index-entry-level-1">Error rates for gamma_q</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_function.html#math_toolkit.sf_beta.ibeta_function.table_ibeta" title="Table 6.18. Error rates for ibeta"><span class="index-entry-level-1">Error rates for ibeta</span></a></p></li>
|
||||
@@ -4044,7 +4079,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/igamma.html#math_toolkit.sf_gamma.igamma.table_tgamma_incomplete_" title="Table 6.12. Error rates for tgamma (incomplete)"><span class="index-entry-level-1">Error rates for tgamma (incomplete)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/igamma.html#math_toolkit.sf_gamma.igamma.table_tgamma_lower" title="Table 6.11. Error rates for tgamma_lower"><span class="index-entry-level-1">Error rates for tgamma_lower</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/trigamma.html#math_toolkit.sf_gamma.trigamma.table_trigamma" title="Table 6.5. Error rates for trigamma"><span class="index-entry-level-1">Error rates for trigamma</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/zetas/zeta.html#math_toolkit.zetas.zeta.table_zeta" title="Table 6.73. Error rates for zeta"><span class="index-entry-level-1">Error rates for zeta</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/zetas/zeta.html#math_toolkit.zetas.zeta.table_zeta" title="Table 6.76. Error rates for zeta"><span class="index-entry-level-1">Error rates for zeta</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/expint/expint_i.html" title="Exponential Integral Ei"><span class="index-entry-level-1">Exponential Integral Ei</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_function.html" title="Incomplete Beta Functions"><span class="index-entry-level-1">Incomplete Beta Functions</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/igamma.html" title="Incomplete Gamma Functions"><span class="index-entry-level-1">Incomplete Gamma Functions</span></a></p></li>
|
||||
@@ -4186,6 +4221,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">expression</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">hypergeometric</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><span class="bold"><strong><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">hypergeometric_distribution</span></a></strong></span></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">k</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">Lanczos approximation</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">policy_type</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">value_type</span></a></p></li>
|
||||
@@ -4239,8 +4275,11 @@
|
||||
</dt>
|
||||
<dd><div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">i</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/oct_overview.html" title="Overview"><span class="index-entry-level-1">Overview</span></a></p></li></ul></div>
|
||||
<p><span class="index-entry-level-0">I</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/oct_overview.html" title="Overview"><span class="index-entry-level-1">Overview</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">ibeta</span></p>
|
||||
@@ -4385,6 +4424,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_inv_function.html" title="The Incomplete Beta Function Inverses"><span class="index-entry-level-1">ibeta_inva</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_inv_function.html" title="The Incomplete Beta Function Inverses"><span class="index-entry-level-1">ibeta_invb</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_inv_function.html" title="The Incomplete Beta Function Inverses"><span class="index-entry-level-1">p</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_inv_function.html" title="The Incomplete Beta Function Inverses"><span class="index-entry-level-1">small</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_inv_function.html" title="The Incomplete Beta Function Inverses"><span class="index-entry-level-1">x</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
@@ -4462,7 +4502,10 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">interval</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/binomial_dist.html" title="Binomial Distribution"><span class="index-entry-level-1">Binomial Distribution</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/binomial_dist.html" title="Binomial Distribution"><span class="index-entry-level-1">Binomial Distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Introduction</span></p>
|
||||
@@ -4500,8 +4543,10 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">data</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">expression</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">more</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">performance</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">scale</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">small</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">variance</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
@@ -4654,6 +4699,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/jacobi/jacobi_elliptic.html" title="Jacobi Elliptic SN, CN and DN"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/jacobi/jacobi_elliptic.html" title="Jacobi Elliptic SN, CN and DN"><span class="index-entry-level-1">expression</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/jacobi/jacobi_elliptic.html" title="Jacobi Elliptic SN, CN and DN"><span class="index-entry-level-1">jacobi_elliptic</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/jacobi/jacobi_elliptic.html" title="Jacobi Elliptic SN, CN and DN"><span class="index-entry-level-1">k</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
@@ -4726,10 +4772,13 @@
|
||||
</dt>
|
||||
<dd><div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">K</span></p>
|
||||
<p><span class="index-entry-level-0">k</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/root_finding_examples/elliptic_eg.html" title="A More complex example - Inverting the Elliptic Integrals"><span class="index-entry-level-1">A More complex example - Inverting the Elliptic Integrals</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_intro.html" title="Elliptic Integral Overview"><span class="index-entry-level-1">Elliptic Integral Overview</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/ellint/ellint_1.html" title="Elliptic Integrals of the First Kind - Legendre Form"><span class="index-entry-level-1">Elliptic Integrals of the First Kind - Legendre Form</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/hypergeometric_dist.html" title="Hypergeometric Distribution"><span class="index-entry-level-1">Hypergeometric Distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/jacobi/jacobi_elliptic.html" title="Jacobi Elliptic SN, CN and DN"><span class="index-entry-level-1">Jacobi Elliptic SN, CN and DN</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/issues.html" title="Known Issues, and TODO List"><span class="index-entry-level-1">Known Issues, and TODO List</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
@@ -4817,6 +4866,49 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/laguerre.html" title="Laguerre (and Associated) Polynomials"><span class="index-entry-level-1">Laguerre (and Associated) Polynomials</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Lambert W function</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">al</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">BOOST_MATH_TEST_VALUE</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">constants</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">expression</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">float</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">get_epsilon</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">I</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">interval</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">lambert_w0</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">lambert_w0_prime</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">lambert_wm1</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">lambert_wm1_prime</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">ln</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">lookup_t</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">message</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">range</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">refinement</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">required</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">small</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">step</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">W</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lambert_w0</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lambert_w0_prime</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lambert_wm1</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lambert_wm1_prime</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Lanczos approximation</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lanczos.html" title="The Lanczos Approximation"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
@@ -5017,6 +5109,13 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/rounding/trunc.html" title="Truncation Functions"><span class="index-entry-level-1">Truncation Functions</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">ln</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/constants.html#math_toolkit.constants.mathematical_constants" title="Table 4.1. Mathematical Constants"><span class="index-entry-level-1">Mathematical Constants</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Locating Function Minima using Brent's algorithm</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/brent_minima.html" title="Locating Function Minima using Brent's algorithm"><span class="index-entry-level-1">abscissa</span></a></p></li>
|
||||
@@ -5170,6 +5269,14 @@
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/lognormal_dist.html" title="Log Normal Distribution"><span class="index-entry-level-1">Log Normal Distribution</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lookup</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">Bernoulli Numbers</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lookup_t</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">lrint</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/overview_tr1.html" title="C99 and C++ TR1 C-style Functions"><span class="index-entry-level-1">C99 and C++ TR1 C-style Functions</span></a></p></li>
|
||||
@@ -5230,7 +5337,10 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Mathematical Constants</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../constants.html" title="Chapter 4. Mathematical Constants"><span class="index-entry-level-1">constants</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../constants.html" title="Chapter 4. Mathematical Constants"><span class="index-entry-level-1">constants</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/constants.html#math_toolkit.constants.mathematical_constants" title="Table 4.1. Mathematical Constants"><span class="index-entry-level-1">ln</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Mathematically Undefined Function Policies</span></p>
|
||||
@@ -5266,7 +5376,10 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">message</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">Bernoulli Numbers</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/number_series/bernoulli_numbers.html" title="Bernoulli Numbers"><span class="index-entry-level-1">Bernoulli Numbers</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">min</span></p>
|
||||
@@ -5298,10 +5411,20 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/mbessel.html" title="Modified Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">cyl_bessel_i</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/mbessel.html" title="Modified Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">cyl_bessel_k</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/mbessel.html" title="Modified Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">O</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/mbessel.html" title="Modified Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">small</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/mbessel.html" title="Modified Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">v</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">more</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/main_faq.html" title="Frequently Asked Questions FAQ"><span class="index-entry-level-1">Frequently Asked Questions FAQ</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/geometric_eg.html" title="Geometric Distribution Examples"><span class="index-entry-level-1">Geometric Distribution Examples</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">Inverse Chi-Squared Distribution Bayes Example</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/high_precision/use_multiprecision.html" title="Using Boost.Multiprecision"><span class="index-entry-level-1">Using Boost.Multiprecision</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">More complex example - Inverting the Elliptic Integrals</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/root_finding_examples/elliptic_eg.html" title="A More complex example - Inverting the Elliptic Integrals"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
@@ -5899,6 +6022,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">point</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/result_type.html" title="Calculation of the Type of the Result"><span class="index-entry-level-1">Calculation of the Type of the Result</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">poisson</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/poisson_dist.html" title="Poisson Distribution"><span class="index-entry-level-1">Poisson Distribution</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -6074,6 +6201,10 @@
|
||||
</dt>
|
||||
<dd><div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">quad</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_poly/chebyshev.html" title="Chebyshev Polynomials"><span class="index-entry-level-1">Chebyshev Polynomials</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">quantile</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/overview/complements.html" title="Complements are supported too - and when to use them"><span class="index-entry-level-1">Complements are supported too - and when to use them</span></a></p></li>
|
||||
@@ -6176,6 +6307,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/double_exponential/de_caveats.html" title="Caveats"><span class="index-entry-level-1">Caveats</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/compilers_overview.html" title="Compilers"><span class="index-entry-level-1">Compilers</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/gauss_kronrod.html" title="Gauss-Kronrod Quadrature"><span class="index-entry-level-1">Gauss-Kronrod Quadrature</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/nmp.html" title="Non-Member Properties"><span class="index-entry-level-1">Non-Member Properties</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
@@ -6224,6 +6356,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">refinement</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Relative Error</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/relative_error.html" title="Relative Error"><span class="index-entry-level-1">case</span></a></p></li></ul></div>
|
||||
</li>
|
||||
@@ -6295,6 +6431,13 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">required</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/double_exponential/de_levels.html" title="Setting the Maximum Interval Halvings and Memory Requirements"><span class="index-entry-level-1">Setting the Maximum Interval Halvings and Memory Requirements</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Riemann Zeta Function</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/zetas/zeta.html" title="Riemann Zeta Function"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
@@ -6374,7 +6517,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/bessel_first.html#math_toolkit.bessel.bessel_first.table_cyl_neumann" title="Table 6.43. Error rates for cyl_neumann"><span class="index-entry-level-1">Error rates for cyl_neumann</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/bessel_first.html#math_toolkit.bessel.bessel_first.table_cyl_neumann_integer_orders_" title="Table 6.42. Error rates for cyl_neumann (integer orders)"><span class="index-entry-level-1">Error rates for cyl_neumann (integer orders)</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/digamma.html#math_toolkit.sf_gamma.digamma.table_digamma" title="Table 6.4. Error rates for digamma"><span class="index-entry-level-1">Error rates for digamma</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/expm1.html#math_toolkit.powers.expm1.table_expm1" title="Table 6.79. Error rates for expm1"><span class="index-entry-level-1">Error rates for expm1</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/expm1.html#math_toolkit.powers.expm1.table_expm1" title="Table 6.82. Error rates for expm1"><span class="index-entry-level-1">Error rates for expm1</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/igamma.html#math_toolkit.sf_gamma.igamma.table_gamma_p" title="Table 6.9. Error rates for gamma_p"><span class="index-entry-level-1">Error rates for gamma_p</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/igamma_inv.html#math_toolkit.sf_gamma.igamma_inv.table_gamma_p_inv" title="Table 6.13. Error rates for gamma_p_inv"><span class="index-entry-level-1">Error rates for gamma_p_inv</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/igamma.html#math_toolkit.sf_gamma.igamma.table_gamma_q" title="Table 6.10. Error rates for gamma_q"><span class="index-entry-level-1">Error rates for gamma_q</span></a></p></li>
|
||||
@@ -6384,7 +6527,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_inv_function.html#math_toolkit.sf_beta.ibeta_inv_function.table_ibetac_inv" title="Table 6.23. Error rates for ibetac_inv"><span class="index-entry-level-1">Error rates for ibetac_inv</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_inv_function.html#math_toolkit.sf_beta.ibeta_inv_function.table_ibeta_inv" title="Table 6.22. Error rates for ibeta_inv"><span class="index-entry-level-1">Error rates for ibeta_inv</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_gamma/lgamma.html#math_toolkit.sf_gamma.lgamma.table_lgamma" title="Table 6.3. Error rates for lgamma"><span class="index-entry-level-1">Error rates for lgamma</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/log1p.html#math_toolkit.powers.log1p.table_log1p" title="Table 6.78. Error rates for log1p"><span class="index-entry-level-1">Error rates for log1p</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/log1p.html#math_toolkit.powers.log1p.table_log1p" title="Table 6.81. Error rates for log1p"><span class="index-entry-level-1">Error rates for log1p</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/nc_beta_dist.html#math_toolkit.dist_ref.dists.nc_beta_dist.table_non_central_beta_CDF" title="Table 5.4. Error rates for non central beta CDF"><span class="index-entry-level-1">Error rates for non central beta CDF</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/nc_beta_dist.html#math_toolkit.dist_ref.dists.nc_beta_dist.table_non_central_beta_CDF_complement" title="Table 5.5. Error rates for non central beta CDF complement"><span class="index-entry-level-1">Error rates for non central beta CDF complement</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/nc_chi_squared_dist.html#math_toolkit.dist_ref.dists.nc_chi_squared_dist.table_non_central_chi_squared_CDF" title="Table 5.6. Error rates for non central chi squared CDF"><span class="index-entry-level-1">Error rates for non central chi squared CDF</span></a></p></li>
|
||||
@@ -6594,7 +6737,10 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Setting the Maximum Interval Halvings and Memory Requirements</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/double_exponential/de_levels.html" title="Setting the Maximum Interval Halvings and Memory Requirements"><span class="index-entry-level-1">accuracy</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/double_exponential/de_levels.html" title="Setting the Maximum Interval Halvings and Memory Requirements"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/double_exponential/de_levels.html" title="Setting the Maximum Interval Halvings and Memory Requirements"><span class="index-entry-level-1">required</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">set_zero</span></p>
|
||||
@@ -6694,6 +6840,17 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/skew_normal_dist.html" title="Skew Normal Distribution"><span class="index-entry-level-0">skew_normal_distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">small</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/bessel_first.html" title="Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">Bessel Functions of the First and Second Kinds</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/powers/expm1.html" title="expm1"><span class="index-entry-level-1">expm1</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/inverse_chi_squared_eg.html" title="Inverse Chi-Squared Distribution Bayes Example"><span class="index-entry-level-1">Inverse Chi-Squared Distribution Bayes Example</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/bessel/mbessel.html" title="Modified Bessel Functions of the First and Second Kinds"><span class="index-entry-level-1">Modified Bessel Functions of the First and Second Kinds</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/sf_beta/ibeta_inv_function.html" title="The Incomplete Beta Function Inverses"><span class="index-entry-level-1">The Incomplete Beta Function Inverses</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Some Miscellaneous Examples of the Normal (Gaussian) Distribution</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/normal_example/normal_misc.html" title="Some Miscellaneous Examples of the Normal (Gaussian) Distribution"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
@@ -6847,6 +7004,10 @@
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">step</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Students t Distribution</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/students_t_dist.html" title="Students t Distribution"><span class="index-entry-level-1">accuracy</span></a></p></li>
|
||||
@@ -6926,7 +7087,7 @@
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/stat_tut/weg/st_eg/tut_mean_intervals.html" title="Calculating confidence intervals on the mean with the Students-t distribution"><span class="index-entry-level-1">Calculating confidence intervals on the mean with the Students-t distribution</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/nc_t_dist.html#math_toolkit.dist_ref.dists.nc_t_dist.table_non_central_t_CDF" title="Table 5.8. Error rates for non central t CDF"><span class="index-entry-level-1">Error rates for non central t CDF</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/nc_t_dist.html#math_toolkit.dist_ref.dists.nc_t_dist.table_non_central_t_CDF_complement" title="Table 5.9. Error rates for non central t CDF complement"><span class="index-entry-level-1">Error rates for non central t CDF complement</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/owens_t.html#math_toolkit.owens_t.table_owens_t" title="Table 6.83. Error rates for owens_t"><span class="index-entry-level-1">Error rates for owens_t</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/owens_t.html#math_toolkit.owens_t.table_owens_t" title="Table 6.86. Error rates for owens_t"><span class="index-entry-level-1">Error rates for owens_t</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/special_tut/special_tut_impl.html" title="Implementation"><span class="index-entry-level-1">Implementation</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/issues.html" title="Known Issues, and TODO List"><span class="index-entry-level-1">Known Issues, and TODO List</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/rational.html" title="Polynomial and Rational Function Evaluation"><span class="index-entry-level-1">Polynomial and Rational Function Evaluation</span></a></p></li>
|
||||
@@ -7419,7 +7580,10 @@
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Using Boost.Multiprecision</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/high_precision/use_multiprecision.html" title="Using Boost.Multiprecision"><span class="index-entry-level-1">constants</span></a></p></li></ul></div>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/high_precision/use_multiprecision.html" title="Using Boost.Multiprecision"><span class="index-entry-level-1">constants</span></a></p></li>
|
||||
<li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/high_precision/use_multiprecision.html" title="Using Boost.Multiprecision"><span class="index-entry-level-1">more</span></a></p></li>
|
||||
</ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">Using C++11 Lambda's</span></p>
|
||||
@@ -7568,6 +7732,10 @@
|
||||
</dt>
|
||||
<dd><div class="index"><ul class="index" style="list-style-type: none; ">
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">W</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/lambert_w.html" title="Lambert W function"><span class="index-entry-level-1">Lambert W function</span></a></p></li></ul></div>
|
||||
</li>
|
||||
<li class="listitem" style="list-style-type: none">
|
||||
<p><span class="index-entry-level-0">weibull</span></p>
|
||||
<div class="index"><ul class="index" style="list-style-type: none; "><li class="listitem" style="list-style-type: none"><p><a class="link" href="../math_toolkit/dist_ref/dists/weibull_dist.html" title="Weibull Distribution"><span class="index-entry-level-1">Weibull Distribution</span></a></p></li></ul></div>
|
||||
</li>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<a name="math_toolkit.conventions"></a><a class="link" href="conventions.html" title="Document Conventions">Document Conventions</a>
|
||||
</h2></div></div></div>
|
||||
<p>
|
||||
<a class="indexterm" name="id915494"></a>
|
||||
<a class="indexterm" name="id921924"></a>
|
||||
</p>
|
||||
<p>
|
||||
This documentation aims to use of the following naming and formatting conventions.
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
zero error</a>.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.expint.expint_i.table_expint_Ei_"></a><p class="title"><b>Table 6.75. Error rates for expint (Ei)</b></p>
|
||||
<a name="math_toolkit.expint.expint_i.table_expint_Ei_"></a><p class="title"><b>Table 6.78. Error rates for expint (Ei)</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for expint (Ei)">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
zero error</a>.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.expint.expint_n.table_expint_En_"></a><p class="title"><b>Table 6.74. Error rates for expint (En)</b></p>
|
||||
<a name="math_toolkit.expint.expint_n.table_expint_En_"></a><p class="title"><b>Table 6.77. Error rates for expint (En)</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for expint (En)">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<link rel="home" href="../../index.html" title="Math Toolkit 2.6.2">
|
||||
<link rel="up" href="../jacobi.html" title="Jacobi Elliptic Functions">
|
||||
<link rel="prev" href="jacobi_sd.html" title="Jacobi Elliptic Function sd">
|
||||
<link rel="next" href="../zetas.html" title="Zeta Functions">
|
||||
<link rel="next" href="../lambert_w.html" title="Lambert W function">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
@@ -20,7 +20,7 @@
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="p" href="jacobi_sd.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../jacobi.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../zetas.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
<a accesskey="p" href="jacobi_sd.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../jacobi.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../lambert_w.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
@@ -77,7 +77,7 @@
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="p" href="jacobi_sd.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../jacobi.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../zetas.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
<a accesskey="p" href="jacobi_sd.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../jacobi.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../lambert_w.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<a name="math_toolkit.navigation"></a><a class="link" href="navigation.html" title="Navigation">Navigation</a>
|
||||
</h2></div></div></div>
|
||||
<p>
|
||||
<a class="indexterm" name="id915345"></a>
|
||||
<a class="indexterm" name="id921807"></a>
|
||||
</p>
|
||||
<p>
|
||||
Boost.Math documentation is provided in both HTML and PDF formats.
|
||||
|
||||
@@ -68,6 +68,34 @@
|
||||
for example <a href="http://keithbriggs.info/xrc.html" target="_top">XRC eXact Real in
|
||||
C</a>.
|
||||
</p>
|
||||
<p>
|
||||
The accuracy of mathematical functions can be assessed and displayed in terms
|
||||
of <a href="https://en.wikipedia.org/wiki/Unit_in_the_last_place" target="_top">Unit in
|
||||
the Last Place</a>, often as a ulps plot or by binning the differences
|
||||
as a histogram. Samples are evaluated using the implementation under test and
|
||||
compared with 'known good' representation obtained using a more accurate method.
|
||||
Other implementations, often using arbitrary precision arithmetic, for example
|
||||
<a href="http://www.wolframalpha.com/" target="_top">Wolfram Alpha</a> are one source
|
||||
of references values. The other method, used widely in Boost.Math special functions,
|
||||
it to carry out the same algorithm, but using a higher precision type, typically
|
||||
using Boost.Multiprecision types like <code class="computeroutput"><span class="identifier">cpp_bin_float_quad</span></code>
|
||||
for 128-bit (about 35 decimal digit precision), or <code class="computeroutput"><span class="identifier">cpp_bin_float_50</span></code>
|
||||
(for 50 decimal digit precision).
|
||||
</p>
|
||||
<p>
|
||||
When converted to a particular machine representation, say <code class="computeroutput"><span class="keyword">double</span></code>,
|
||||
say using a <code class="computeroutput"><span class="keyword">static_cast</span></code>, the value
|
||||
is the nearest representation possible for the <code class="computeroutput"><span class="keyword">double</span></code>
|
||||
type. This value cannot be 'wrong' by more than half a <a href="http://en.wikipedia.org/wiki/Unit_in_the_last_place" target="_top">Unit
|
||||
in the last place (ULP)</a>, and can be obtained using the Boost.Math function
|
||||
<code class="computeroutput"><span class="identifier">ulp</span></code>. (Unless the algorithm
|
||||
is fundamentally flawed, something that should be revealed by 'sanity' checks
|
||||
using some independent sources).
|
||||
</p>
|
||||
<p>
|
||||
See some discussion and example plots by Cleve Moler of Mathworks <a href="https://blogs.mathworks.com/cleve/2017/01/23/ulps-plots-reveal-math-function-accurary/" target="_top">ulps
|
||||
plots reveal math-function accuracy</a>.
|
||||
</p>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
in the last place</a> of <span class="emphasis"><em>x</em></span>.
|
||||
</p>
|
||||
<p>
|
||||
Corner cases are handled as followes:
|
||||
Corner cases are handled as follows:
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||||
<li class="listitem">
|
||||
@@ -70,7 +70,7 @@
|
||||
If the argument is zero then returns the smallest representable value:
|
||||
for example for type <code class="computeroutput"><span class="keyword">double</span></code>
|
||||
this would be either <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">min</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">denorm_min</span><span class="special">()</span></code> depending whether denormals are supported
|
||||
(which have the values 2.<code class="computeroutput"><span class="number">2250738585072014e-308</span></code>
|
||||
(which have the values <code class="computeroutput"><span class="number">2.2250738585072014e-308</span></code>
|
||||
and <code class="computeroutput"><span class="number">4.9406564584124654e-324</span></code>
|
||||
respectively).
|
||||
</li>
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
Over the built-in types and range tested, errors are less than 10 * std::numeric_limits<RealType>::epsilon().
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.owens_t.table_owens_t"></a><p class="title"><b>Table 6.83. Error rates for owens_t</b></p>
|
||||
<a name="math_toolkit.owens_t.table_owens_t"></a><p class="title"><b>Table 6.86. Error rates for owens_t</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for owens_t">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -55,9 +55,9 @@
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_ASSERT_UNDEFINED_POLICY</span> <span class="keyword">false</span>
|
||||
<span class="preprocessor">#define</span> <span class="identifier">BOOST_MATH_OVERFLOW_ERROR_POLICY</span> <span class="identifier">errno_on_error</span></pre>
|
||||
<p>
|
||||
<span class="bold"><strong>may be ignored</strong></span>.
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
|
||||
may be ignored*.
|
||||
</li></ul></div>
|
||||
<p>
|
||||
The compiler command line shows:
|
||||
</p>
|
||||
|
||||
@@ -176,12 +176,12 @@ errno = 33
|
||||
that now the macro BOOST_MATH_DECLARE_DISTRIBUTIONS accepts two parameters:
|
||||
the floating point type to use, and the policy type to apply. For example:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">BOOST_MATH_DECLARE_DISTRIBUTIONS</span><span class="special">(</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">mypolicy</span><span class="special">)</span>
|
||||
<pre class="programlisting"><span class="identifier">BOOST_MATH_DECLARE_DISTRIBUTIONS</span><span class="special">(</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">)</span>
|
||||
</pre>
|
||||
<p>
|
||||
Results a set of typedefs being defined like this:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">normal_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">mypolicy</span><span class="special">></span> <span class="identifier">normal</span><span class="special">;</span>
|
||||
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">normal_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">></span> <span class="identifier">normal</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
The name of each typedef is the same as the name of the distribution class
|
||||
|
||||
@@ -113,14 +113,31 @@
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Define a policy that sets ::errno on overflow, and does</span>
|
||||
<span class="comment">// not promote double to long double internally:</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special"><</span><span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> <span class="identifier">promote_double</span><span class="special"><</span><span class="keyword">false</span><span class="special">></span> <span class="special">></span> <span class="identifier">mypolicy</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">policy</span>
|
||||
<span class="special"><</span>
|
||||
<span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span>
|
||||
<span class="identifier">promote_double</span><span class="special"><</span><span class="keyword">false</span><span class="special">></span>
|
||||
<span class="special">></span> <span class="identifier">my_policy</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
then <code class="computeroutput"><span class="identifier">mypolicy</span></code> defines a policy
|
||||
where only the overflow error handling and <code class="computeroutput"><span class="keyword">double</span></code>-promotion
|
||||
then <code class="computeroutput"><span class="identifier">my_policy</span></code> defines a
|
||||
policy where only the overflow error handling and <code class="computeroutput"><span class="keyword">double</span></code>-promotion
|
||||
policies differ from the defaults.
|
||||
</p>
|
||||
<p>
|
||||
We can also add a desired precision, for example, 9 bits or 3 decimal digits,
|
||||
to an error-handling policy, usually to trade precision for speed:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special"><</span><span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> <span class="identifier">digit2</span><span class="special"><</span><span class="number">9</span><span class="special">></span> <span class="special">></span> <span class="identifier">my_policy</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
Or if you want to further modify an existing user policy, use <code class="computeroutput"><span class="identifier">normalise</span></code>:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">normalise</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">normalise</span><span class="special"><</span><span class="identifier">my_policy</span><span class="special">,</span> <span class="identifier">digits2</span><span class="special"><</span><span class="number">9</span><span class="special">>>::</span><span class="identifier">type</span> <span class="identifier">my_policy_9</span><span class="special">;</span> <span class="comment">// errno on error, and limited precision.</span>
|
||||
</pre>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
|
||||
@@ -36,8 +36,8 @@
|
||||
is the recommended method for setting installation-wide policies</strong></span>.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
By instantiating a distribution object with an explicit policy: this
|
||||
is mainly reserved for ad hoc policy changes.
|
||||
By instantiating a statistical distribution object with an explicit policy:
|
||||
this is mainly reserved for ad hoc policy changes.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
By passing a policy to a special function as an optional final argument:
|
||||
|
||||
@@ -52,21 +52,34 @@
|
||||
</li>
|
||||
</ul></div>
|
||||
<p>
|
||||
Some of these policies could arguably be runtime variables, but then we couldn't
|
||||
use compile-time dispatch internally to select the best evaluation method
|
||||
for the given policies.
|
||||
Some of these policies could arguably be run-time variables, but then we
|
||||
couldn't use compile-time dispatch internally to select the best evaluation
|
||||
method for the given policies.
|
||||
</p>
|
||||
<p>
|
||||
For this reason a Policy is a <span class="emphasis"><em>type</em></span>: in fact it's an
|
||||
instance of the class template <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special"><></span></code>. This class is just a compile-time-container
|
||||
of user-selected policies (sometimes called a type-list):
|
||||
of user-selected policies (sometimes called a type-list).
|
||||
</p>
|
||||
<p>
|
||||
Over a dozen <a class="link" href="policy_tut_defaults.html" title="Policies Have Sensible Defaults">policy
|
||||
defaults</a> are provided, so most of the time you can ignore the policy
|
||||
framework, but you can overwrite the defaults with your own policies to give
|
||||
detailed control, for example:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">;</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="comment">// Define a policy that sets ::errno on overflow, and does</span>
|
||||
<span class="comment">// not promote double to long double internally:</span>
|
||||
<span class="comment">//</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special"><</span><span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> <span class="identifier">promote_double</span><span class="special"><</span><span class="keyword">false</span><span class="special">></span> <span class="special">></span> <span class="identifier">mypolicy</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// Define a policy that sets ::errno on overflow,</span>
|
||||
<span class="comment">// and does not promote double to long double internally,</span>
|
||||
<span class="comment">// and only aims for precision of only 3 decimal digits,</span>
|
||||
<span class="comment">// to an error-handling policy, usually to trade precision for speed:</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">policy</span>
|
||||
<span class="special"><</span>
|
||||
<span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span>
|
||||
<span class="identifier">promote_double</span><span class="special"><</span><span class="keyword">false</span><span class="special">>,</span>
|
||||
<span class="identifier">digits10</span><span class="special"><</span><span class="number">3</span><span class="special">></span>
|
||||
<span class="special">></span> <span class="identifier">my_policy</span><span class="special">;</span>
|
||||
</pre>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
should have approximately 2 epsilon accuracy.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.powers.cbrt.table_cbrt"></a><p class="title"><b>Table 6.80. Error rates for cbrt</b></p>
|
||||
<a name="math_toolkit.powers.cbrt.table_cbrt"></a><p class="title"><b>Table 6.83. Error rates for cbrt</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for cbrt">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
computing the cosine of <span class="emphasis"><em>πx</em></span>.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.powers.cos_pi.table_cos_pi"></a><p class="title"><b>Table 6.77. Error rates for cos_pi</b></p>
|
||||
<a name="math_toolkit.powers.cos_pi.table_cos_pi"></a><p class="title"><b>Table 6.80. Error rates for cos_pi</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for cos_pi">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
should have approximately 1 epsilon accuracy.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.powers.expm1.table_expm1"></a><p class="title"><b>Table 6.79. Error rates for expm1</b></p>
|
||||
<a name="math_toolkit.powers.expm1.table_expm1"></a><p class="title"><b>Table 6.82. Error rates for expm1</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for expm1">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
should have approximately 1 epsilon accuracy.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.powers.log1p.table_log1p"></a><p class="title"><b>Table 6.78. Error rates for log1p</b></p>
|
||||
<a name="math_toolkit.powers.log1p.table_log1p"></a><p class="title"><b>Table 6.81. Error rates for log1p</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for log1p">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
Should have approximately 2-3 epsilon accuracy.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.powers.powm1.table_powm1"></a><p class="title"><b>Table 6.82. Error rates for powm1</b></p>
|
||||
<a name="math_toolkit.powers.powm1.table_powm1"></a><p class="title"><b>Table 6.85. Error rates for powm1</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for powm1">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
computing the sine of <span class="emphasis"><em>πx</em></span>.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.powers.sin_pi.table_sin_pi"></a><p class="title"><b>Table 6.76. Error rates for sin_pi</b></p>
|
||||
<a name="math_toolkit.powers.sin_pi.table_sin_pi"></a><p class="title"><b>Table 6.79. Error rates for sin_pi</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for sin_pi">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
should have approximately 3 epsilon accuracy.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.powers.sqrt1pm1.table_sqrt1pm1"></a><p class="title"><b>Table 6.81. Error rates for sqrt1pm1</b></p>
|
||||
<a name="math_toolkit.powers.sqrt1pm1.table_sqrt1pm1"></a><p class="title"><b>Table 6.84. Error rates for sqrt1pm1</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for sqrt1pm1">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
any type <span class="emphasis"><em>RealType</em></span> that meets the conceptual requirements
|
||||
given below. All the built-in floating-point types like <code class="computeroutput"><span class="keyword">double</span></code>
|
||||
will meet these requirements. (Built-in types are also called <a href="http://en.cppreference.com/w/cpp/language/types" target="_top">fundamental
|
||||
types</a>).
|
||||
(built-in) types</a>).
|
||||
</p>
|
||||
<p>
|
||||
User-defined types that meet the conceptual requirements can also be used.
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
</p>
|
||||
<h5>
|
||||
<a name="math_toolkit.remez.h5"></a>
|
||||
<span class="phrase"><a name="math_toolkit.remez.practical_considerations"></a></span><a class="link" href="remez.html#math_toolkit.remez.practical_considerations">Practical
|
||||
<span class="phrase"><a name="math_toolkit.remez.remez_practical"></a></span><a class="link" href="remez.html#math_toolkit.remez.remez_practical">Practical
|
||||
Considerations</a>
|
||||
</h5>
|
||||
<p>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
</h3></div></div></div>
|
||||
<p>
|
||||
In the table below, the cube root of 28 was computed for three <a href="http://en.cppreference.com/w/cpp/language/types" target="_top">fundamental
|
||||
types</a> floating-point types, and one <a href="../../../../../../libs/multiprecision/doc/html/index.html" target="_top">Boost.Multiprecision</a>
|
||||
(built-in) types</a> floating-point types, and one <a href="../../../../../../libs/multiprecision/doc/html/index.html" target="_top">Boost.Multiprecision</a>
|
||||
type <a href="../../../../../../libs/multiprecision/doc/html/boost_multiprecision/tut/floats/cpp_bin_float.html" target="_top">cpp_bin_float</a>
|
||||
using 50 decimal digit precision, using four algorithms.
|
||||
</p>
|
||||
@@ -202,8 +202,8 @@
|
||||
</li>
|
||||
<li class="listitem">
|
||||
For <a href="http://en.cppreference.com/w/cpp/language/types" target="_top">fundamental
|
||||
types</a>, there was little to choose between the three derivative
|
||||
methods, but for <a href="../../../../../../libs/multiprecision/doc/html/boost_multiprecision/tut/floats/cpp_bin_float.html" target="_top">cpp_bin_float</a>,
|
||||
(built-in) types</a>, there was little to choose between the three
|
||||
derivative methods, but for <a href="../../../../../../libs/multiprecision/doc/html/boost_multiprecision/tut/floats/cpp_bin_float.html" target="_top">cpp_bin_float</a>,
|
||||
<a class="link" href="../roots_deriv.html#math_toolkit.roots_deriv.newton">Newton-Raphson iteration</a>
|
||||
was twice as fast. Note that the cube-root is an extreme test case as
|
||||
the cost of calling the functor is so cheap that the runtimes are largely
|
||||
|
||||
@@ -5202,7 +5202,8 @@
|
||||
<li class="listitem">
|
||||
Perhaps surprisingly, there is little difference between the various
|
||||
algorithms for <a href="http://en.cppreference.com/w/cpp/language/types" target="_top">fundamental
|
||||
types</a> floating-point types. Using the first derivatives (<a class="link" href="../roots_deriv.html#math_toolkit.roots_deriv.newton">Newton-Raphson iteration</a>)
|
||||
(built-in) types</a> floating-point types. Using the first derivatives
|
||||
(<a class="link" href="../roots_deriv.html#math_toolkit.roots_deriv.newton">Newton-Raphson iteration</a>)
|
||||
is usually the best, but while the improvement over the no-derivative
|
||||
<a href="http://portal.acm.org/citation.cfm?id=210111" target="_top">TOMS Algorithm
|
||||
748: enclosing zeros of continuous functions</a> is considerable
|
||||
|
||||
1589
doc/html/math_toolkit/roots/root_comparison/cbrt_comparison.html
Normal file
1871
doc/html/math_toolkit/roots/root_comparison/elliptic_comparison.html
Normal file
5289
doc/html/math_toolkit/roots/root_comparison/root_n_comparison.html
Normal file
@@ -109,15 +109,15 @@
|
||||
be stored as tables of floating point values instead. If mixed arithmetic
|
||||
is slow then add:
|
||||
</p>
|
||||
<p>
|
||||
#define BOOST_MATH_INT_TABLE_TYPE(RT, IT) RT
|
||||
</p>
|
||||
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
|
||||
define BOOST_MATH_INT_TABLE_TYPE(RT, IT) RT
|
||||
</li></ol></div>
|
||||
<p>
|
||||
to boost/math/tools/user.hpp, otherwise the default of:
|
||||
</p>
|
||||
<p>
|
||||
#define BOOST_MATH_INT_TABLE_TYPE(RT, IT) IT
|
||||
</p>
|
||||
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
|
||||
define BOOST_MATH_INT_TABLE_TYPE(RT, IT) IT
|
||||
</li></ol></div>
|
||||
<p>
|
||||
Set in boost/math/config.hpp is fine, and may well result in smaller
|
||||
code.
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||||
<link rel="home" href="../index.html" title="Math Toolkit 2.6.2">
|
||||
<link rel="up" href="../special.html" title="Chapter 6. Special Functions">
|
||||
<link rel="prev" href="jacobi/jacobi_sn.html" title="Jacobi Elliptic Function sn">
|
||||
<link rel="prev" href="lambert_w.html" title="Lambert W function">
|
||||
<link rel="next" href="zetas/zeta.html" title="Riemann Zeta Function">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
@@ -20,7 +20,7 @@
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="p" href="jacobi/jacobi_sn.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../special.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="zetas/zeta.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
<a accesskey="p" href="lambert_w.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../special.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="zetas/zeta.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
@@ -42,7 +42,7 @@
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="p" href="jacobi/jacobi_sn.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../special.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="zetas/zeta.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
<a accesskey="p" href="lambert_w.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../special.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="zetas/zeta.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
zero error</a>.
|
||||
</p>
|
||||
<div class="table">
|
||||
<a name="math_toolkit.zetas.zeta.table_zeta"></a><p class="title"><b>Table 6.73. Error rates for zeta</b></p>
|
||||
<a name="math_toolkit.zetas.zeta.table_zeta"></a><p class="title"><b>Table 6.76. Error rates for zeta</b></p>
|
||||
<div class="table-contents"><table class="table" summary="Error rates for zeta">
|
||||
<colgroup>
|
||||
<col>
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
<dt><span class="section"><a href="math_toolkit/jacobi/jacobi_sn.html">Jacobi Elliptic Function
|
||||
sn</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="math_toolkit/lambert_w.html">Lambert W function</a></span></dt>
|
||||
<dt><span class="section"><a href="math_toolkit/zetas.html">Zeta Functions</a></span></dt>
|
||||
<dd><dl><dt><span class="section"><a href="math_toolkit/zetas/zeta.html">Riemann Zeta Function</a></span></dt></dl></dd>
|
||||
<dt><span class="section"><a href="math_toolkit/expint.html">Exponential Integrals</a></span></dt>
|
||||
|
||||
@@ -223,6 +223,7 @@ math_toolkit/jacobi/jacobi_ns.html
|
||||
math_toolkit/jacobi/jacobi_sc.html
|
||||
math_toolkit/jacobi/jacobi_sd.html
|
||||
math_toolkit/jacobi/jacobi_sn.html
|
||||
math_toolkit/lambert_w.html
|
||||
math_toolkit/zetas.html
|
||||
math_toolkit/zetas/zeta.html
|
||||
math_toolkit/expint.html
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
[/ See also Latin-1 aka Western (ISO-8859-1) in latin1_symbols.qbk]
|
||||
[/ http://www.htmlhelp.com/reference/html40/entities/latin1.html]
|
||||
[/Unicode Latin extended http://www.unicode.org/charts/U0080.pdf]
|
||||
[/https://en.wikipedia.org/wiki/Template:Unicode_chart_Arrows chart arrows]
|
||||
|
||||
[/ Also some miscellaneous math characters added to this list - see the end.]
|
||||
[/ For others see also math_toolkit.symbols.qbk]
|
||||
@@ -117,7 +118,8 @@
|
||||
[template int[]'''∫'''] [/ ? integral]
|
||||
[template there4[]'''∴'''] [/ ? therefore]
|
||||
[template sim[]'''∼'''] [/ ~ tilde operator = varies with = similar to]
|
||||
[template cong[]'''≅'''] [/ ? approximately equal to]
|
||||
[template simeq[]'''≃'''] [/ ~_asymptotic equality]
|
||||
[template cong[]'''≅'''] [/ =~ approximately equal to]
|
||||
[template approx[]'''≈'''] [/ ? ~~ very approximately equal to]
|
||||
[template asymp[]'''≈'''] [/ ˜ almost equal to = asymptotic to]
|
||||
[template ne[]'''≠'''] [/ ? not equal to]
|
||||
@@ -149,6 +151,9 @@
|
||||
[template rchev[]'''⟩'''] [/ right chevron]
|
||||
[template rflat[]'''⟮'''] [/ right flat bracket Misc Math Symbol A]
|
||||
[template lflat[]'''⟮'''] [/ left flat bracket]
|
||||
[template mapsto[]'''↦'''] [/ function maps to https://en.wikipedia.org/wiki/Maplet ]
|
||||
[template obelus[]'''÷'''] [/ division dot over and under dash divide symbol]
|
||||
|
||||
[/ U2000.pdf punctuation]
|
||||
[template endash[]'''–'''] [/ em width dash]
|
||||
[template emdash[]'''—'''] [/ en width dash]
|
||||
@@ -212,6 +217,9 @@
|
||||
[template plusmn[]'''±'''] [/ plus-minus sign = plus-or-minus sign ]
|
||||
[template micro[]'''µ'''] [/ micro sign ]
|
||||
[template cedil[]'''¸'''] [/ cedilla = spacing cedilla ]
|
||||
[template ccedil[]'''ç'''] [/ small c with cedilla ]
|
||||
[template Ccedil[]'''ç'''] [/ capial C with cedilla ]
|
||||
|
||||
[template ordm[]'''º'''] [/ masculine ordinal indicator ]
|
||||
[template ordf[]'''ª'''] [/ feminine ordinal indicator ]
|
||||
[template laquo[]'''«'''] [/ left-pointing double angle quotation mark = left pointing guillemet ]
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<!-- Copyright 2010 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) -->
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0; URL=html/index.html">
|
||||
</head>
|
||||
<body>
|
||||
Automatic redirection failed, please go to
|
||||
<a href="html/index.html">html/index.html</a>
|
||||
<P>Copyright Daryle Walker, Hubert Holin and John Maddock 2013</P>
|
||||
<P>Distributed under the Boost Software License, Version 1.0. (See accompanying file <A href="../../../LICENSE_1_0.txt">
|
||||
LICENSE_1_0.txt</A> or copy at <A href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</A>).</P>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
26
doc/math.qbk
@@ -1,5 +1,5 @@
|
||||
[book Math Toolkit
|
||||
[quickbook 1.6]
|
||||
[quickbook 1.7]
|
||||
[copyright 2006, 2007, 2008, 2009, 2010, 2012, 2013, 2014, 2017 Nikhar Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg, Daryle Walker and Xiaogang Zhang]
|
||||
[/purpose ISBN 0-9504833-2-X 978-0-9504833-2-0, Classification 519.2-dc22]
|
||||
[license
|
||||
@@ -216,6 +216,15 @@ and use the function's name as the link text.]
|
||||
[def __sph_hankel_1 [link math_toolkit.hankel.sph_hankel sph_hankel_1]]
|
||||
[def __sph_hankel_2 [link math_toolkit.hankel.sph_hankel sph_hankel_2]]
|
||||
|
||||
[/Lambert W function]
|
||||
[def __lambert_w [link math_toolkit.sf_lambert_w.lambert_w_function lambert_w]]
|
||||
[def __lambert_w_implementation [link math_toolkit.lambert_w.implementation implementation]]
|
||||
[def __lambert_w_precision[link math_toolkit.lambert_w.precision precision]]
|
||||
[def __lambert_w_examples [link math_toolkit.lambert_w.examples examples]]
|
||||
[def __lambert_w_wm1_near_zero [link math_toolkit.lambert_w.wm1_near_zero wm1_near_zero]]
|
||||
[def __lambert_w_references [link math_toolkit.lambert_w.references references]]
|
||||
|
||||
|
||||
[/Airy Functions]
|
||||
[def __airy_ai [link math_toolkit.airy.ai airy_ai]]
|
||||
[def __airy_bi [link math_toolkit.airy.bi airy_bi]]
|
||||
@@ -379,6 +388,8 @@ and use the function's name as the link text.]
|
||||
|
||||
[def __real_concept [link math_toolkit.real_concepts real concept]]
|
||||
[def __next_float [link math_toolkit.next_float Adjacent Floating-Point Values]]
|
||||
[def __remez_practical [link math_toolkit.remez.practical remez_practical]]
|
||||
|
||||
|
||||
[/ External links]
|
||||
[def __gsl [@http://www.gnu.org/software/gsl/ GSL-1.9]]
|
||||
@@ -406,6 +417,8 @@ and use the function's name as the link text.]
|
||||
[def __errno [@http://en.wikipedia.org/wiki/Errno `::errno`]]
|
||||
[def __Mathworld [@http://mathworld.wolfram.com Wolfram MathWorld]]
|
||||
[def __Mathematica [@http://www.wolfram.com/products/mathematica/index.html Wolfram Mathematica]]
|
||||
[def __Maple [@https://www.maplesoft.com Maple]]
|
||||
|
||||
[def __WolframAlpha [@http://www.wolframalpha.com/ Wolfram Alpha]]
|
||||
[def __TOMS748 [@http://portal.acm.org/citation.cfm?id=210111 TOMS Algorithm 748: enclosing zeros of continuous functions]]
|
||||
[def __TOMS910 [@http://portal.acm.org/citation.cfm?id=1916469 TOMS Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations]]
|
||||
@@ -420,7 +433,7 @@ and use the function's name as the link text.]
|
||||
[def __epsilon [@http://en.wikipedia.org/wiki/Machine_epsilon machine epsilon]]
|
||||
[def __ADL [@http://en.cppreference.com/w/cpp/language/adl Argument Dependent Lookup (ADL)]]
|
||||
[def __function_template_instantiation [@http://en.cppreference.com/w/cpp/language/function_template Function template instantiation]]
|
||||
[def __fundamental_types [@http://en.cppreference.com/w/cpp/language/types fundamental types]]
|
||||
[def __fundamental_types [@http://en.cppreference.com/w/cpp/language/types fundamental (built-in) types]]
|
||||
[def __guard_digits [@http://en.wikipedia.org/wiki/Guard_digit guard digits]]
|
||||
[def __SSE2 [@http://en.wikipedia.org/wiki/SSE2 SSE2 instructions]]
|
||||
[def __representable [@http://en.wikipedia.org/wiki/Floating_point#Representable_numbers.2C_conversion_and_rounding representable]]
|
||||
@@ -429,6 +442,12 @@ and use the function's name as the link text.]
|
||||
[def __random_variable [@http://en.wikipedia.org/wiki/Random_variable random variable]]
|
||||
[def __probability_distribution [@http://en.wikipedia.org/wiki/Probability_distribution probability_distribution]]
|
||||
[def __C_math [@http://www.cplusplus.com/reference/cmath/ C math functions]]
|
||||
[def __Lambert_W [@http://en.wikipedia.org/wiki/Lambert_W_function Lambert W function]]
|
||||
[def __CUDA [@https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-cplusplus-language-support CUDA NVidia GPU C/C++ language support]]
|
||||
[def __Luu_thesis [@http://discovery.ucl.ac.uk/1482128/1/Luu_thesis.pdf Thomas Luu, Thesis, University College London (2015)]]
|
||||
[def __rational_function [@https://en.wikipedia.org/wiki/Rational_function rational function]]
|
||||
[def __remez [@http://en.wikipedia.org/wiki/Remez_algorithm Remez algorithm]]
|
||||
[def __ULP [@https://en.wikipedia.org/wiki/Unit_in_the_last_place Unit in the Last Place]]
|
||||
|
||||
[/ Some composite templates]
|
||||
[template super[x]'''<superscript>'''[x]'''</superscript>''']
|
||||
@@ -594,6 +613,9 @@ and as a CD ISBN 0-9504833-2-X 978-0-9504833-2-0, Classification 519.2-dc22.
|
||||
|
||||
[include sf/jacobi_elliptic.qbk]
|
||||
|
||||
[/ Lambert W function]
|
||||
[include sf/lambert_w.qbk]
|
||||
|
||||
[section:zetas Zeta Functions]
|
||||
[include sf/zeta.qbk]
|
||||
[endsect]
|
||||
|
||||
@@ -15,20 +15,30 @@ control:
|
||||
and `double` to `long double` in order to improve precision.
|
||||
* What precision to use when calculating the result.
|
||||
|
||||
Some of these policies could arguably be runtime variables, but then we couldn't
|
||||
Some of these policies could arguably be run-time variables, but then we couldn't
|
||||
use compile-time dispatch internally to select the best evaluation method
|
||||
for the given policies.
|
||||
|
||||
For this reason a Policy is a /type/: in fact it's an instance of the
|
||||
class template `boost::math::policies::policy<>`. This class is just a
|
||||
compile-time-container of user-selected policies (sometimes called a type-list):
|
||||
compile-time-container of user-selected policies (sometimes called a type-list).
|
||||
|
||||
Over a dozen __policy_defaults are provided, so most of the time you can ignore the policy framework,
|
||||
but you can overwrite the defaults with your own policies to give detailed control, for example:
|
||||
|
||||
using namespace boost::math::policies;
|
||||
//
|
||||
// Define a policy that sets ::errno on overflow, and does
|
||||
// not promote double to long double internally:
|
||||
//
|
||||
typedef policy<domain_error<errno_on_error>, promote_double<false> > mypolicy;
|
||||
|
||||
// Define a policy that sets ::errno on overflow,
|
||||
// and does not promote double to long double internally,
|
||||
// and only aims for precision of only 3 decimal digits,
|
||||
// to an error-handling policy, usually to trade precision for speed:
|
||||
|
||||
typedef policy
|
||||
<
|
||||
domain_error<errno_on_error>,
|
||||
promote_double<false>,
|
||||
digits10<3>
|
||||
> my_policy;
|
||||
|
||||
[endsect] [/section:what_is_a_policy So Just What is a Policy Anyway?]
|
||||
|
||||
@@ -83,13 +93,28 @@ inherits the defaults for any policies not explicitly set, so given:
|
||||
//
|
||||
// Define a policy that sets ::errno on overflow, and does
|
||||
// not promote double to long double internally:
|
||||
//
|
||||
typedef policy<domain_error<errno_on_error>, promote_double<false> > mypolicy;
|
||||
|
||||
then `mypolicy` defines a policy where only the overflow error handling and
|
||||
typedef policy
|
||||
<
|
||||
domain_error<errno_on_error>,
|
||||
promote_double<false>
|
||||
> my_policy;
|
||||
|
||||
then `my_policy` defines a policy where only the overflow error handling and
|
||||
`double`-promotion policies differ from the defaults.
|
||||
|
||||
[endsect][/section:policy_tut_defaults Policies Have Sensible Defaults]
|
||||
We can also add a desired precision, for example, 9 bits or 3 decimal digits,
|
||||
to an error-handling policy, usually to trade precision for speed:
|
||||
|
||||
typedef policy<domain_error<errno_on_error>, digit2<9> > my_policy;
|
||||
|
||||
Or if you want to further modify an existing user policy, use `normalise`:
|
||||
|
||||
using boost::math::policies::normalise;
|
||||
|
||||
typedef normalise<my_policy, digits2<9>>::type my_policy_9; // errno on error, and limited precision.
|
||||
|
||||
[endsect] [/section:policy_tut_defaults Policies Have Sensible Defaults]
|
||||
|
||||
[section:policy_usage So How are Policies Used Anyway?]
|
||||
|
||||
@@ -97,7 +122,7 @@ The details follow later, but basically policies can be set by either:
|
||||
|
||||
* Defining some macros that change the default behaviour: [*this is the
|
||||
recommended method for setting installation-wide policies].
|
||||
* By instantiating a distribution object with an explicit policy:
|
||||
* By instantiating a statistical distribution object with an explicit policy:
|
||||
this is mainly reserved for ad hoc policy changes.
|
||||
* By passing a policy to a special function as an optional final argument:
|
||||
this is mainly reserved for ad hoc policy changes.
|
||||
@@ -297,11 +322,11 @@ Handling policies for the statistical distributions is very similar except that
|
||||
the macro BOOST_MATH_DECLARE_DISTRIBUTIONS accepts two parameters: the
|
||||
floating point type to use, and the policy type to apply. For example:
|
||||
|
||||
BOOST_MATH_DECLARE_DISTRIBUTIONS(double, mypolicy)
|
||||
BOOST_MATH_DECLARE_DISTRIBUTIONS(double, my_policy)
|
||||
|
||||
Results a set of typedefs being defined like this:
|
||||
|
||||
typedef boost::math::normal_distribution<double, mypolicy> normal;
|
||||
typedef boost::math::normal_distribution<double, my_policy> normal;
|
||||
|
||||
The name of each typedef is the same as the name of the distribution
|
||||
class template, but without the "_distribution" suffix.
|
||||
|
||||
825
doc/sf/lambert_w.qbk
Normal file
@@ -0,0 +1,825 @@
|
||||
[section:lambert_w Lambert W function]
|
||||
|
||||
[h4:synopsis Synopsis]
|
||||
|
||||
``
|
||||
#include <boost/math/special_functions/lambert_w.hpp>
|
||||
``
|
||||
|
||||
namespace boost { namespace math {
|
||||
|
||||
template <class T>
|
||||
``__sf_result`` lambert_w0(T z); // W0 branch, default policy.
|
||||
template <class T>
|
||||
``__sf_result`` lambert_wm1(T z); // W-1 branch, default policy.
|
||||
template <class T>
|
||||
``__sf_result`` lambert_w0_prime(T z); // W0 branch 1st derivative.
|
||||
template <class T>
|
||||
``__sf_result`` lambert_wm1_prime(T z); // W-1 branch 1st derivative.
|
||||
|
||||
template <class T, class ``__Policy``>
|
||||
``__sf_result`` lambert_w0(T z, const ``__Policy``&); // W0 with policy.
|
||||
template <class T, class ``__Policy``>
|
||||
``__sf_result`` lambert_wm1(T z, const ``__Policy``&); // W-1 with policy.
|
||||
template <class T, class ``__Policy``>
|
||||
``__sf_result`` lambert_w0_prime(T z, const ``__Policy``&); // W0 derivative with policy.
|
||||
template <class T, class ``__Policy``>
|
||||
``__sf_result`` lambert_wm1_prime(T z, const ``__Policy``&); // W-1 derivative with policy.
|
||||
|
||||
} // namespace boost
|
||||
} // namespace math
|
||||
|
||||
|
||||
[h4:description Description]
|
||||
|
||||
The __Lambert_W is the solution of the equation ['W[dot]e[super W] = z].
|
||||
It is also called the Omega function, the inverse function of ['f(W) = W e[super W]].
|
||||
|
||||
On the z-interval \[0, [infin]\] there is just one real solution.
|
||||
On the interval (-1/e, 0) there are two real solutions on two branches called variously W0, W+, W-1, Wp, Wm, W-.
|
||||
Two principal branches functions called `lambert_w0` and `lambert_wm1`, and their 1st derivative,
|
||||
are provided by Boost's real-only implementation.
|
||||
|
||||
In the graphs below, the red line is the W0 branch, and the blue line the W-1 branch.
|
||||
|
||||
[import ../../example/lambert_w_graph.cpp]
|
||||
|
||||
[graph lambert_w_graph]
|
||||
[graph lambert_w_graph_big_w]
|
||||
[graph lambert_w0_prime_graph]
|
||||
[graph lambert_wm1_prime_graph]
|
||||
|
||||
There is a singularity where the branches meet at argument [^z = -1/e] [cong] [^ -0.367879...] and [^W = -1].
|
||||
|
||||
This implementation computes the two real (not complex) branches W0 and W-1
|
||||
with the functions `lambert_w0` and `lambert_wm1`,
|
||||
and their 1st derivatives, `lambert_w0_prime` and `lambert_wm1_prime`,
|
||||
from the first [^z] argument.
|
||||
|
||||
For C++ types `float` the maximum z argument `(std::numeric_limits<>::max)()`
|
||||
Lambert_w0(3.2e+38) = 84.29,
|
||||
and for `double`, lambert_w0(1.797e+308) = 703.3.
|
||||
|
||||
The final __Policy argument is optional and can be used to control the behaviour of the function:
|
||||
how it handles errors.
|
||||
|
||||
Refer to __policy_section for more details and see examples below.
|
||||
|
||||
[h5:applications Applications of the Lambert W function]
|
||||
|
||||
The Lambert W function has a myriad of applications.
|
||||
Corless et al. provide a comprehensive description of the range of applications,
|
||||
from the mathematical, like iterated exponentiation and asymptotic roots of trinomials,
|
||||
to the real-world, such as the range of a jet plane, enzyme kinetics, water movement in soil,
|
||||
epidemics, and diode current (an example replicated [@../../example/lambert_w_diode.cpp here]).
|
||||
Since the publication of their landmark paper, there have been many more applications, and
|
||||
also many new implementations of the function, upon which this implementation builds.
|
||||
|
||||
[h4:examples Examples]
|
||||
|
||||
[import ../../example/lambert_w_simple_examples.cpp]
|
||||
|
||||
You will usually need the following `#include` and `using` statements:
|
||||
|
||||
[lambert_w_simple_examples_includes]
|
||||
|
||||
Some examples follow, starting with the trivial:
|
||||
|
||||
[lambert_w_simple_examples_0]
|
||||
|
||||
Other floating-point types can be used too, here `float`,
|
||||
including user defined types like __multiprecision.
|
||||
It is convenient to use a function like `show_value`
|
||||
to display all (and only) potentially significant decimal digits, including any significant trailing zeros,
|
||||
(`std::numeric_limits<T>::max_digits10`) for the type `T`.
|
||||
|
||||
[lambert_w_simple_examples_1]
|
||||
|
||||
Example of an integer argument to `lambert_w0`,
|
||||
showing that an `int` literal is correctly promoted to a `double`.
|
||||
|
||||
[lambert_w_simple_examples_2]
|
||||
|
||||
Using __multiprecision types to get much higher precision is painless.
|
||||
|
||||
[lambert_w_simple_examples_3]
|
||||
|
||||
[warning When using multiprecision, take very great care not to
|
||||
construct or assign non-integers from `double`, `float` ... silently losing precision.
|
||||
Use `"1.2345678901234567890123456789"` rather than `1.2345678901234567890123456789`.]
|
||||
|
||||
Using multiprecision types, it is all too easy to get multiprecision precision wrong!
|
||||
|
||||
[lambert_w_simple_examples_4]
|
||||
|
||||
[note See spurious non-seven decimal digits appearing after digit #17 in the argument 0.7777777777777777...!]
|
||||
|
||||
And similarly constructing from a literal `double 0.9`, with more random digits after digit number 17.
|
||||
|
||||
[lambert_w_simple_examples_4a]
|
||||
|
||||
Note how the `cpp_float_dec_50` result is only as correct as from a `double = 0.9`.
|
||||
|
||||
Now see the correct result for all 50 decimal digits constructing from a decimal digit string "0.9":
|
||||
|
||||
[lambert_w_simple_examples_4b]
|
||||
|
||||
Note the expected zeros for all places up to 50 - and the correct Lambert W result!
|
||||
|
||||
(It is just as easy to compute even higher precisions,
|
||||
at least to thousands of decimal digits, but not shown here for brevity.
|
||||
See [@../../example/lambert_w_simple_examples.cpp lambert_w_simple_examples.cpp]
|
||||
for comparison of an evaluation at 1000 decimal digit precision with __WolframAlpha).
|
||||
|
||||
Policies can be used to control what action to take on errors:
|
||||
|
||||
[lambert_w_simple_examples_error_policies]
|
||||
|
||||
[tip Always use [^try'n'catch] blocks to ensure you get an error message like this:]
|
||||
|
||||
[lambert_w_simple_examples_error_message_1]
|
||||
|
||||
Show error reporting if a value is passed to `lambert_w0` that is out of range,
|
||||
(and was probably meant to be passed to `lambert_wm1` instead).
|
||||
|
||||
[lambert_w_simple_examples_out_of_range]
|
||||
|
||||
The full source of these examples is at [@../../example/lambert_w_simple_examples.cpp lambert_w_simple_examples.cpp]
|
||||
|
||||
[h5:diode_resistance Diode Resistance Example]
|
||||
|
||||
[import ../../example/lambert_w_diode_graph.cpp]
|
||||
|
||||
A typical example of a practical application is estimating the current flow
|
||||
through a diode with series resistance from a paper by Banwell and Jayakumar.
|
||||
|
||||
Having the Lambert W function available makes it simple to reproduce the plot
|
||||
in their paper (Fig 2) comparing estimates using with Lambert W function
|
||||
and some actual measurements.
|
||||
The colored curves show the effect of various series resistance on the current
|
||||
compared to an extrapolated line in grey with no internal (or external) resistance.
|
||||
|
||||
Two formulae relating the diode current and effect of series resistance can be combined,
|
||||
but yield an otherwise intractable equation relating the current versus voltage
|
||||
with a varying series resistance. This was reformulated as a
|
||||
generalized equation in terms of the Lambert W function:
|
||||
|
||||
Banwell and Jakaumar equation 5
|
||||
|
||||
[sixemspace][space] I(V) = [mu] V[sub T]/ R [sub S] [dot] W[sub 0](I[sub 0] R[sub S] / ([mu] V[sub T]))
|
||||
|
||||
Using these variables
|
||||
|
||||
[lambert_w_diode_graph_1]
|
||||
|
||||
the formula can be rendered in C++
|
||||
|
||||
[lambert_w_diode_graph_2]
|
||||
|
||||
to reproduce their Fig 2:
|
||||
|
||||
[graph diode_iv_plot]
|
||||
|
||||
The plotted points for no external series resistance
|
||||
(derived from their published plot as the raw data are not publicly available)
|
||||
are used to extrapolate back to estimate the intrinsic emitter resistance as 0.3 ohm.
|
||||
Its effect is visible when the straight line from low voltages starts to curve.
|
||||
|
||||
See [@../../example/lambert_w_diode.cpp lambert_w_diode.cpp] and
|
||||
[@../../example/lambert_w_diode_graph.cpp lambert_w_diode_graph.cpp]
|
||||
for details of the calculation.
|
||||
|
||||
[h5:implementations Existing implementations]
|
||||
|
||||
The function is described in Wolfram Mathworld as
|
||||
[@http://mathworld.wolfram.com/LambertW-Function.html [^Lambert W function]].
|
||||
The principal value of the Lambert W function is implemented in the Wolfram Language as ['ProductLog\[k, z\]]
|
||||
where k is the branch, by default zero, but also the negative branch when k = -1.
|
||||
|
||||
__WolframAlpha has provided many reference values for testing.
|
||||
For example, the output from [@https://www.wolframalpha.com/input/?i=productlog(1)]
|
||||
is 0.56714329040978387299996866221035554975381578718651...
|
||||
|
||||
Also the [@https://www.wolframalpha.com Wolfram language] command: [^N\[ProductLog\[-1\], 50\]]
|
||||
|
||||
produces the same output to the specified 50 decimal digit precision.
|
||||
|
||||
The symbolic algebra program __Maple also computes Lambert W to an arbitrary precision.
|
||||
|
||||
[h4:precision Controlling the compromise between Precision and Speed]
|
||||
|
||||
[h5:small_floats Floating-point types `double` and `float`]
|
||||
This implementation provides good precision and excellent speed for __fundamental types `float` and `double`.
|
||||
|
||||
All the functions usually return values within a few __ulp
|
||||
for the floating-point type, except for very small arguments very near zero,
|
||||
and for arguments very close to the singularity at the branch point.
|
||||
|
||||
By default, this implementation provides the best possible speed.
|
||||
Very slightly average higher precision and less bias might be obtained
|
||||
by adding a __halley step refinement,
|
||||
but at the cost of more than doubling the run time.
|
||||
|
||||
[h5:big_floats Floating-point types larger than double]
|
||||
|
||||
For floating-point types with precision greater than `double` and `float` __fundamental_types,
|
||||
a `double` evaluation is used as a first approximation followed by Halley refinement,
|
||||
using a single step where it can be predicted that this will be sufficient,
|
||||
and only using __halley iteration when necessary.
|
||||
Higher precision types are always going to be [*very, very much slower].
|
||||
|
||||
The 'best' evaluation (the nearest __representable) can be achieved by `static_cast`ing from a
|
||||
higher precision type, typically a __multiprecision type like `cpp_bin_float_50`,
|
||||
but at the cost of increasing run-time >100-fold;
|
||||
this has been used here to provide our reference values for testing.
|
||||
|
||||
[import ../../example/lambert_w_precision_example.cpp]
|
||||
|
||||
For example, we get a reference value using a high precision type, for example;
|
||||
|
||||
using boost::multiprecision::cpp_bin_float_50;
|
||||
|
||||
that uses Halley iteration to refine until it is as precise as possible for this `cpp_bin_float_50` type.
|
||||
|
||||
As a further check we can compare this with a __WolframAlpha computation
|
||||
using command [^N\[ProductLog\[10.\], 50\]] to get 50 decimal digits
|
||||
and similarly [^N\[ProductLog\[10.\], 17\]] to get the nearest representable for 64-bit `double` precision.
|
||||
|
||||
[lambert_w_precision_reference_w]
|
||||
|
||||
giving us the same nearest representable using 64-bit `double` as `1.7455280027406994`.
|
||||
|
||||
However, the rational polynomial and Fukushima Schroder approximations are so good for type `float` and `double`
|
||||
that negligible improvement is gained from a `double` Halley step.
|
||||
|
||||
This is shown with [@../../example/lambert_w_precision_example.cpp lambert_w_precision_example.cpp]
|
||||
for Lambert W0:
|
||||
|
||||
[lambert_w_precision_1]
|
||||
|
||||
with this output:
|
||||
|
||||
[lambert_w_precision_output_1]
|
||||
|
||||
and then for W-1:
|
||||
|
||||
[lambert_w_precision_2]
|
||||
|
||||
with this output:
|
||||
|
||||
[lambert_w_precision_output_2]
|
||||
|
||||
[h5:differences_distribution Distribution of differences from 'best' `double` evaluations]
|
||||
|
||||
The distribution of differences from 'best' are shown in these graphs comparing `double` precision evaluations
|
||||
with reference 'best' z50 evaluations using `cpp_bin_float_50` type reduced to `double` with `static_cast<double(z50)` :
|
||||
|
||||
[graph lambert_w0_errors_graph]
|
||||
|
||||
[graph lambert_wm1_errors_graph]
|
||||
|
||||
As noted in the implementation section, the distribution of these differences is somewhat biased
|
||||
for Lambert W-1 and this might be reduced using a `double` Halley step at small runtime cost.
|
||||
But if you are serisouly concerned to get really precise computations,
|
||||
the only way is using a higher precision type and then reduce to the desired type.
|
||||
Fortunately, __multiprecision makes this very easy to program, if much slower.
|
||||
|
||||
[h4:edge_cases Edge and Corner cases]
|
||||
|
||||
[h5:w0_edges w0 Branch]
|
||||
|
||||
The range mathematically is -1/e <= z <= +[infin], but numerically, (for the floating-point type T)
|
||||
|
||||
* `z == -1/e` returns exactly -1.
|
||||
* `z < -1/e` throws a `domain_error`, and/or returns `NaN` according to the policy.
|
||||
Provided that there is a `catch` clause, an error message (similar to that below) will be reported.
|
||||
* `z == (std::numeric_limits<T>::max)()` returns W for the floating_point type T, (for example, for `double`, 703.22703310477018L)
|
||||
* `z == std::numeric_limits<T>::infinity()` throws a `overflow_error`.
|
||||
|
||||
(An argument z passed as infinity probably indicates that something has already gone wrong,
|
||||
but if it is desired to return infinity,
|
||||
this case should be handled before calling `lambert_w0`).
|
||||
|
||||
[h5:wm1_edges w-1 Branch]
|
||||
|
||||
The range mathematically is -1/e <= z <= 0, but numerically,
|
||||
|
||||
* `z == -1/e` (for the type T) returns exactly -1.
|
||||
* `z == 0` returns -[infin] (or the nearest equivalent if `std::has_infinity == false`).
|
||||
* `z == std::numeric_limits<T>::min()` returns the maximum (most negative) possible value of Lambert W for the type T. [br]
|
||||
For example, for `double`: lambert_wm1(-2.2250738585072014e-308) = -714.96865723796634 [br]
|
||||
and for `float`: lambert_wm1(-1.17549435e-38) = -91.8567734 [br]
|
||||
|
||||
* `z < std::numeric_limits<T>::min()`, means that z is zero or denormalized (if `std::numeric_limits<T>::has_denorm_min == true`),
|
||||
for example: `r = lambert_wm1(std::numeric_limits<double>::denorm_min());` and an overflow_error exception is thrown,
|
||||
and will give a message like:
|
||||
|
||||
Error in function boost::math::lambert_wm1<RealType>(<RealType>):
|
||||
Argument z = -4.9406564584124654e-324 is too small
|
||||
(z < -std::numeric_limits<T>::min so denormalized) for Lambert W-1 branch!
|
||||
|
||||
Denormalized values of z are not supported for Lambert W-1 (because not all floating-point types denormalize),
|
||||
and anyway it only covers a tiny fraction of the range of possible z arguments values.
|
||||
|
||||
[h4:compilers Compilers]
|
||||
|
||||
The code has been tested on VS 15.7.5, Clang 6.0.0 and GCC 8.1.0; it is expected to work on all C++ compilers.
|
||||
As expected, debug mode is very much slower. The release version optimisation also varied.
|
||||
|
||||
[h5:diagnostics Diagnostics Macros]
|
||||
|
||||
Several macros are provided to output diagnostic information (potentially [*much] output).
|
||||
These can be statements, for example:
|
||||
|
||||
`#define BOOST_MATH_INSTRUMENT_LAMBERT_W_TERMS`
|
||||
|
||||
placed [*before] the `lambert_w` include statement
|
||||
|
||||
`#include <boost/math/special_functions/lambert_w.hpp>`,
|
||||
|
||||
or defined on the project compile command-line: `/DBOOST_MATH_INSTRUMENT_LAMBERT_W_TERMS`,
|
||||
|
||||
or defined in a jamfile.v2: `<define>BOOST_MATH_INSTRUMENT_LAMBERT_W_TERMS`
|
||||
|
||||
[import ../../include/boost/math/special_functions/lambert_w.hpp]
|
||||
|
||||
[boost_math_instrument_lambert_w_macros]
|
||||
|
||||
[h4:implementation Implementation]
|
||||
|
||||
There are many previous implementations, each with increasing accuracy and/or speed.
|
||||
See __lambert_w_references below.
|
||||
|
||||
For most of the range of ['z] arguments, some initial approximation followed by a single refinement,
|
||||
often using Halley or similar method, gives a useful precision.
|
||||
For speed, several implementations avoid evaluation of a iteration test using the exponential function,
|
||||
estimating that a single refinement step will suffice,
|
||||
but these rarely get to the best result possible.
|
||||
To get a better precision, additional refinements, probably iterative, are needed
|
||||
for example, using __halley or __schroder methods.
|
||||
|
||||
For C++, the most precise results possible, closest to the nearest __representable for the C++ type being used,
|
||||
it is usually necessary to use a higher precision type for intermediate computation,
|
||||
finally static-casting back to the smaller desired result type.
|
||||
This strategy is used by __Maple and WolframAlpha, for example, using arbitrary precision arithmetic,
|
||||
and some of their high-precision values are used for testing this library.
|
||||
This method is also used to provide __boost_test values using __multiprecision,
|
||||
typically, a 50 decimal digit type like `cpp_bin_float_50`
|
||||
`static_cast` to a `float`, `double` or `long double` type.
|
||||
|
||||
For ['z] argument values near the singularity and near zero, other approximations may be used,
|
||||
possibly followed by refinement or increasing number of series terms until a desired precision is achieved.
|
||||
At extreme arguments near to zero or the singularity at the branch point,
|
||||
even this fails and the only method to achieve a really close result is to cast from a higher precision type.
|
||||
|
||||
In practical applications, the increased computation required
|
||||
(often towards a thousand-fold slower and requiring much additional code for __multiprecision)
|
||||
is not justified and the algorithms here do not implement this.
|
||||
But because the Boost.Lambert_W algorithms has been tested using __multiprecision,
|
||||
users who require this can always easily achieve the nearest representation for the fundamental_types
|
||||
- if the application justifies the very large extra computation cost.
|
||||
|
||||
[h5 Evolution of this implementation]
|
||||
|
||||
One compact real-only implementation was based on an algorithm by __Luu_thesis,
|
||||
(see routine 11 on page 98 for his Lambert W algorithm)
|
||||
and his Halley refinement is used iteratively when required.
|
||||
A first implementation was based on Thomas Luu's code posted at
|
||||
[@https://svn.boost.org/trac/boost/ticket/11027 Boost Trac \#11027].
|
||||
It has been implemented from Luu's algorithm but templated on `RealType` parameter and result
|
||||
and handles both __fundamental_types (`float, double, long double`), __multiprecision,
|
||||
and also has been tested successfully with a proposed fixed_point type.
|
||||
|
||||
A first approximation was computed using the method of Barry et al (see references 5 & 6 below).
|
||||
This was extended to the widely used [@https://people.sc.fsu.edu/~jburkardt/f_src/toms443/toms443.html TOMS443]
|
||||
FORTRAN and C++ versions by John Burkardt using Schroeder refinement(s).
|
||||
(For users only requiring an accuracy of relative accuracy of 0.02%, Barry's function alone might suffice,
|
||||
but a better __rational_function approximation method has since been developed for this implementation).
|
||||
|
||||
We also considered using __newton method.
|
||||
``
|
||||
f(w) = w e^w -z = 0 // Luu equation 6.37
|
||||
f'(w) = e^w (1 + w), Wolfram alpha (d)/(dw)(f(w) = w exp(w) - z) = e^w (w + 1)
|
||||
if (f(w) / f'(w) -1 < tolerance
|
||||
w1 = w0 - (expw0 * (w0 + 1)); // Refine new Newton/Raphson estimate.
|
||||
``
|
||||
but concluded that since the Newton-Raphson method takes typically 6 iterations to converge within tolerance,
|
||||
whereas Halley usually takes only 1 to 3 iterations to achieve an result within 1 __ulp,
|
||||
so the Newton-Raphson method is unlikely to be quicker
|
||||
than the additional cost of computing the 2nd derivative for Halley's method.
|
||||
|
||||
Halley refinement uses the simplified formulae obtained from
|
||||
[@http://www.wolframalpha.com/input/?i=%5B2(z+exp(z)-w)+d%2Fdx+(z+exp(z)-w)%5D+%2F+%5B2+(d%2Fdx+(z+exp(z)-w))%5E2+-+(z+exp(z)-w)+d%5E2%2Fdx%5E2+(z+exp(z)-w)%5D Wolfram Alpha]
|
||||
|
||||
[2(z exp(z)-w) d/dx (z exp(z)-w)] / [2 (d/dx (z exp(z)-w))^2 - (z exp(z)-w) d^2/dx^2 (z exp(z)-w)]
|
||||
|
||||
[h4:compact_implementation Implementing Compact Algorithms]
|
||||
|
||||
The most compact algorithm can probably be implemented using the log approximation of Corless et al.
|
||||
followed by Halley iteration (but is also slowest and least precise near zero and near the branch singularity).
|
||||
|
||||
[h4:faster_implementation Implementing Faster Algorithms]
|
||||
|
||||
More recently, the Tosio Fukushima has developed an even faster algorithm,
|
||||
avoiding any transcendental function calls as these are necessarily expensive.
|
||||
The current implementation of Lambert W-1 is based on his algorithm
|
||||
starting with a translation from Fukushima's FORTRAN into C++ by Darko Veberic.
|
||||
|
||||
Many applications of the Lambert W function make many repeated evaluations for Monte Carlo methods;
|
||||
for these applications speed is very important.
|
||||
Luu, and Chapeau-Blondeau and Monir provide typical usage examples.
|
||||
|
||||
Fukushima improves the important observation that much of the execution time of all
|
||||
previous iterative algorithms was spent evaluating transcendental functions, usually `exp`.
|
||||
He has put a lot of work into avoiding any slow transcendental functions by using lookup tables and
|
||||
bisection, finishing with a single Schroeder refinement,
|
||||
without any check on the final precision of the result (necessarily evaluating an expensive exponential).
|
||||
|
||||
Theoretical and practical tests confirm that Fukushima's algorithm gives Lambert W estimates
|
||||
with a known small error bound (several __ulp) over nearly all the range of ['z] argument.
|
||||
|
||||
A mean difference was computed to express the typical error and is often about 0.5 epsilon,
|
||||
the theoretical minimum. Using the __float_distance, we can also express this as the number of
|
||||
bits that are different from the nearest representable or 'exact' or 'best' value.
|
||||
The number and distribution of these few bits differences was studied by binning, including their sign.
|
||||
Bins for (signed) 0, 1, 2 and 3 and 4 bits proved suitable.
|
||||
|
||||
However, though these give results within a few __epsilon of the nearest representable result,
|
||||
they do not get as close as is very often possible with further refinement,
|
||||
nrealy always to within one or two __epsilon.
|
||||
|
||||
More significantly, the evaluations of the sum of all signed differences using the Fukshima algorithm
|
||||
show a slight bias, being more likely to be a bit or few below the nearest representation than above;
|
||||
bias might have unwanted effects on some statistical computations.
|
||||
|
||||
Fukushima's method also does not cover the full range of z arguments of 'float' precision and above.
|
||||
|
||||
For this implementation of Lambert W0, John Maddock used the Boost.Math `minimax.exe` __remez method program
|
||||
to devise a __rational_function for several ranges of argument z for the W0 branch of Lambert W0 function.
|
||||
These minimax rational approximations are combined for an algorithm that is both smaller and faster.
|
||||
|
||||
Sadly it has not proved practical to use the same __remez method for Lambert W-1 branch
|
||||
and so the Fukushima algorithm is retained for this branch.
|
||||
|
||||
An advantage of both minimax rational __remez approximations
|
||||
is that the [*distribution] from the reference values is reasonably random and insignificantly biased.
|
||||
|
||||
For example, table below a test of Lambert W0 10000 values of argument z covering the main range of possible values,
|
||||
10000 comparisons from z = 0.0501 to 703, in 0.001 step factor 1.05 when module 7 == 0
|
||||
|
||||
[table:lambert_w0_Fukushima Fukushima Lambert W0 and typical improvement from a single Halley step.
|
||||
[[Method] [Exact] [One_bit] [Two_bits] [Few_bits] [inexact] [bias]]
|
||||
[[Schroeder W0] [8804 ] [ 1154 ] [ 37 ] [ 5 ] [1243 ] [-1193]]
|
||||
[[after Halley step] [ 9710 ] [ 288 ] [ 2 ] [0] [ 292 ] [22]]
|
||||
] [/table:lambert_w0_Fukushima W0]
|
||||
|
||||
Lambert W0 values computed using the Fukushima method with Schroeder refinement gave about 1/6 lambert_w0 values that are
|
||||
one bit different from the 'best', and < 1% that are a few bits 'wrong'.
|
||||
If a Halley refinement step is added, only 1 in 30 are even one bit different, and only 2 two bits 'wrong'.
|
||||
|
||||
[table:lambert_w0_plus_halley Rational polynomial Lambert W0 and typical improvement from a single Halley step.
|
||||
[[Method] [Exact] [One_bit] [Two_bits] [Few_bits] [inexact] [bias]]
|
||||
[[rational/polynomial] [7135] [ 2863 ] [ 2 ] [0] [ 2867 ] [ -59] ]
|
||||
[[after Halley step ] [ 9724 ] [273] [ 3 ] [0] [ 279 ] [5] ]
|
||||
] [/table:lambert_w0_plus_halley]
|
||||
|
||||
With the rational polynomial approximation method, there are a third one bit from the best and none more than two bits.
|
||||
Adding a Halley step (or iteration) reduces the number that are one bit different from about a third down to one in 30;
|
||||
this is unavoidable 'computational noise'.
|
||||
An extra Halley step would double the runtime for a tiny gain and so is not chosen for this implementation,
|
||||
but remains a option, as detailed above.
|
||||
|
||||
For the Lambert W-1 branch, the Fukushima algorithm is used.
|
||||
|
||||
[table:lambert_wm1_fukushima Lambert W-1 using Fukushima algorithm.
|
||||
[[Method] [Exact] [One_bit] [Two_bits] [Few_bits] [inexact] [bias]]
|
||||
[[Fukushima W-1] [ 7167] [2704 ] [ 129 ] [0] [2962 ] [-160]]
|
||||
[[plus Halley step] [ 7379 ] [ 2529 ] [92 ] [0] [ 2713 ] [ 549]]
|
||||
] [/table:lambert_wm1_fukushima]
|
||||
|
||||
[/ generated using PAB j:\Cpp\Misc\lambert_w_compare_jm2\lambert_w_compare_jm2.cpp]
|
||||
|
||||
[h5:lookup_tables Lookup tables]
|
||||
|
||||
For speed during the bisection, Fukushima's algorithm computes lookup tables of powers of e and z for integral Lambert W.
|
||||
There are 64 elements in these tables. The FORTRAN version (and the C++ translation by Veberic)
|
||||
computed these (once) as `static` data. This is slower, may cause trouble with multithreading, and
|
||||
is slightly inaccurate because of rounding errors from repeated(64) multiplications.
|
||||
|
||||
In this implementation the array values have been computed using __multiprecision 50 decimal digit
|
||||
and output as C++ arrays 37 decimal digit `long double` literals using `max_digits10` precision
|
||||
|
||||
std::cout.precision(std::numeric_limits<cpp_bin_float_quad>::max_digits10);
|
||||
|
||||
The arrays are as `const` and `constexpr` and `static` as possible (for the compiler version),
|
||||
using BOOST_STATIC_CONSTEXPR macro.
|
||||
(See [@../../test/lambert_w_lookup_table_generator.cpp lambert_w_lookup_table_generator.cpp]
|
||||
The precision was chosen to ensure that if used as `long double` arrays,
|
||||
then the values output to
|
||||
[@ ../../include/boost/math/special_functions/lambert_w_lookup_table.ipp lambert_w_lookup_table.ipp]
|
||||
will be the nearest representable value for the type chose by a `typedef` in
|
||||
[@../../include/boost/math/special_functions/lambert_w.hpp lambert_w.hpp].
|
||||
|
||||
typedef double lookup_t; // Type for lookup table (`double` or `float`, or even `long double`?)
|
||||
|
||||
This is to allow for future use at higher precision, up to platforms that use 128-bit
|
||||
(hardware or software) for their `long double` type.
|
||||
|
||||
The accuracy of the tables was confirmed using __WolframAlpha and agrees at the 37th decimal place,
|
||||
so ensuring that the value is exactly read into even 128-bit `long double` to the nearest representation.
|
||||
|
||||
[h5:higher_precision Higher precision]
|
||||
|
||||
For types more precise than `double`, Fukushima reported that it was best to use the `double` estimate
|
||||
as a starting point, followed by refinement using __halley iterations or other methods;
|
||||
our experience confirms this.
|
||||
|
||||
Using __multiprecision it is simple to compute very high precision values of Lambert
|
||||
W at least to thousands of decimal digits over most of the range of z arguments.
|
||||
|
||||
For this reason, the lookup tables and bisection are only carried out at low precision,
|
||||
usually `double`, chosen by the `typedef double lookup_t`. Unlike the FORTRAN version,
|
||||
the lookup tables of Lambert_W of integral values are precomputed as C++ static arrays of floating-point literals.
|
||||
The default is a `typedef` setting the type to `double`.
|
||||
To allow users to vary the precision from `float` to `long double` these are computed to
|
||||
128-bit precision to ensure that even platforms with `long double` do not lose precision.
|
||||
|
||||
The FORTRAN version and translation only permits the z argument to be the largest
|
||||
items in these lookup arrays, `wm0s[64] = 3.99049`, producing an error message and returning `NaN`.
|
||||
So 64 is the largest possible value ever returned from the `lambert_w0` function.
|
||||
This is far from the `std::numeric_limits<>::max()` for even `float`s.
|
||||
Therefore this implementation uses an approximation or 'guess' and Halley's method to refine the result.
|
||||
Logarithmic approximation is discussed at length by R.M.Corless et al. (page 349).
|
||||
Here we use the first two terms of equation 4.19:
|
||||
|
||||
T lz = log(z);
|
||||
T llz = log(lz);
|
||||
guess = lz - llz + (llz / lz);
|
||||
|
||||
This gives a useful precision suitable for Halley refinement.
|
||||
|
||||
Similarly, for Lambert W-1 branch, tiny values very near zero,
|
||||
W > 64 cannot be computed using the lookup table.
|
||||
For this region, an approximation followed by a few (usually 3) Halley refinements.
|
||||
See __lambert_w_wm1_near_zero.
|
||||
|
||||
For the less well-behaved regions for Lambert W0 ['z] arguments near zero,
|
||||
and near the branch singularity at ['-1/e], some series functions are used.
|
||||
|
||||
[h5:small_z Small values of argument z near zero]
|
||||
|
||||
When argument ['z] is small and near zero, there is an efficient and accurate series evaluation method available
|
||||
(implemented in `lambert_w0_small_z`).
|
||||
There is no equivalent for the W-1 branch as this only covers argument `z < -1/e`.
|
||||
The cutoff used `abs(z) < 0.05` is as found by trial and error by Fukushima.
|
||||
|
||||
Coefficients of the inverted series expansion of the Lambert W function around `z = 0`
|
||||
are computed following Fukushima using 17 terms of a Taylor series
|
||||
computed using __Mathematica with
|
||||
|
||||
InverseSeries[Series[z Exp[z],{z,0,17}]]
|
||||
|
||||
See Tosio Fukushima, Journal of Computational and Applied Mathematics 244 (2013), page 86.
|
||||
|
||||
To provide higher precision constants (34 decimal digits) for types larger than `long double`,
|
||||
|
||||
InverseSeries[Series[z Exp[z],{z,0,34}]]
|
||||
|
||||
were also computed, but for current hardware it was found that evaluating a `double` precision
|
||||
and then refining with Halley's method was quicker and more accurate.
|
||||
|
||||
Decimal values of specifications for built-in floating-point types below
|
||||
are 21 digits precision == `std::numeric_limits<T>::max_digits10` for `long double`.
|
||||
|
||||
Specializations for `lambert_w0_small_z` are provided for
|
||||
`float`, `double`, `long double`, `float128` and for __multiprecision types.
|
||||
|
||||
The `tag_type` selection is based on the value `std::numeric_limits<T>::max_digits10`
|
||||
(and [*not] on the floating-point type T).
|
||||
This distinguishes between `long double` types that commonly vary between 64 and 80-bits,
|
||||
and also compilers that have a `float` type using 64 bits and/or `long double` using 128-bits.
|
||||
|
||||
As noted in the __lambert_w_implementation section above,
|
||||
it is only possible to ensure the nearest representable value by casting from a higher precision type,
|
||||
computed at very, very much greater cost.
|
||||
|
||||
For multiprecision types, first several terms of the series are tabulated and evaluated as a polynomial:
|
||||
(this will save us a bunch of expensive calls to `pow`).
|
||||
Then our series functor is initialized "as if" it had already reached term 18,
|
||||
enough evaluation of built-in 64-bit double and float (and 80-bit `long double`) types.
|
||||
Finally the functor is called repeatedly to compute as many additional series terms
|
||||
as necessary to achive the desired precision, set from `get_epsilon`
|
||||
(or terminated by `evaluation_error` on reaching the set iteration limit `max_series_iterations`).
|
||||
|
||||
A little more than one decimal digit of precision is gained by each additional series term.
|
||||
This allows computation of Lambert W near zero to at least 1000 decimal digit precision,
|
||||
given sufficient compute time.
|
||||
|
||||
[h4:near_singularity Argument z near the singularity at -1/e between branches W0 and W-1]
|
||||
|
||||
Variants of Function `lambert_w_singularity_series` are used to handle ['z] arguments
|
||||
which are near to the singularity at `z = -exp(-1) = -3.6787944` where the branches W0 and W-1 join.
|
||||
|
||||
T. Fukushima / Journal of Computational and Applied Mathematics 244 (2013) 77-89
|
||||
describes using __Mathematica
|
||||
|
||||
InverseSeries\[Series\[sqrt\[2(p Exp\[1 + p\] + 1)\], {p,-1, 20}\]\]
|
||||
|
||||
to provide his Table 3, page 85.
|
||||
|
||||
This implementation used __Mathematica to obtain 40 series terms at 50 decimal digit precision
|
||||
``
|
||||
N\[InverseSeries\[Series\[Sqrt\[2(p Exp\[1 + p\] + 1)\], { p,-1,40 }\]\], 50\]
|
||||
|
||||
-1+p-p^2/3+(11 p^3)/72-(43 p^4)/540+(769 p^5)/17280-(221 p^6)/8505+(680863 p^7)/43545600 ...
|
||||
``
|
||||
These constants are computed at compile time for the full precision for any `RealType T`
|
||||
using the original rationals from Fukushima Table 3.
|
||||
|
||||
Longer decimal digits strings are rationals pre-evaluated using __Mathematica.
|
||||
Some integer constants overflow, so largest size available is used, suffixed by `uLL`.
|
||||
|
||||
Above the 14th term, the rationals exceed the range of `unsigned long long` and are replaced
|
||||
by pre-computed decimal values at least 21 digits precision == `max_digits10` for `long double`.
|
||||
|
||||
A macro `BOOST_MATH_TEST_VALUE` (defined in [@../../test/test_value.hpp test_value.hpp])
|
||||
taking a decimal floating-point literal was used
|
||||
to allow testing with both built-in floating-point types like `double`
|
||||
which have contructors taking literal decimal values like `3.14`,
|
||||
[*and] also multiprecision and other User-defined Types that only provide full-precision construction
|
||||
from decimal digit strings like `"3.14"`.
|
||||
(Construction of multiprecision types from built-in floating-point types
|
||||
only provides the precision of the built-in type, like `double`, only 17 decimal digits).
|
||||
|
||||
[tip Be exceeding careful not to silently lose precision by constructing multiprecision types from literal decimal types, usually [^double]. Use decimal digit strings like "3.1459" instead. See examples.]
|
||||
|
||||
Fukushima's implementation used 20 series terms; it was confirmed that using more terms does not usefully increase accuracy.
|
||||
|
||||
[h5:wm1_near_zero Lambert W-1 arguments values very near zero.]
|
||||
|
||||
The lookup tables of Fukushima have only 64 elements,
|
||||
so that the z argument nearest zero is -1.0264389699511303e-26,
|
||||
that corresponds to a maximum Lambert W-1 value of 64.0.
|
||||
Fukushima's implementation did not cater for z argument values that are smaller (nearer to zero),
|
||||
but this implementation adds code to accept smaller (but not denormalised) values of z.
|
||||
A crude approximation for these very small values is to take the exponent and multiply by ln[10] ~= 2.3.
|
||||
We also tried the approximation first proposed by Corless et al. using ln(-z), (equation 4.19 page 349)
|
||||
and then tried improving by a 2nd term -ln(ln(-z)), and finally the ratio term -ln(ln(-z))/ln(-z).
|
||||
|
||||
For a z very close to z = -1.0264389699511303e-26 when W = 64, when effect of ln(ln(-z) term, and ratio L1/L2 is greatest,
|
||||
the possible 'guesses' are
|
||||
|
||||
z = -1.e-26, w = -64.02, guess = -64.0277, ln(-z) = -59.8672, ln(-ln(-z) = 4.0921, llz/lz = -0.0684
|
||||
|
||||
whereas at the minimum (unnormalized) z
|
||||
|
||||
z = -2.2250e-308, w = -714.9, guess = -714.9687, ln(-z) = -708.3964, ln(-ln(-z) = 6.5630, llz/lz = -0.0092
|
||||
|
||||
Although the addition of the 3rd ratio term did not reduce the number of Halley iterations needed,
|
||||
it might allow return of a better low precision estimate [*without any Halley iterations].
|
||||
For the worst case near w = 64, the error in the 'guess' is 0.008, ratio 0.0001 or 1 in 10,000 digits 10 ~= 4.
|
||||
Two log evalutations are still needed, but is probably over an order of magnitude faster.
|
||||
|
||||
Halley's method was then used to refine the estimate of Lambert W-1 from this guess.
|
||||
Experiments showed that although all approximations reached with __ulp of the closest representable value,
|
||||
the computational cost of the log functions was easily paid by far fewer iterations
|
||||
(typically from 8 down to 4 iterations for double or float).
|
||||
[h5:halley Halley refinement]
|
||||
|
||||
After obtaining a double approximation, for `double`, `long double` and `quad` 128-bit precision,
|
||||
a single iteration should suffice because
|
||||
Halley iteration should triple the precision with each step
|
||||
(as long as the function is well behaved - and it is),
|
||||
and since we have at least half of the bits correct already,
|
||||
one Halley step is ample to get to 128-bit precision.
|
||||
|
||||
|
||||
[h5:lambert_w_derivatives Lambert W Derivatives]
|
||||
|
||||
The derivatives are computed using the formulae in [@https://en.wikipedia.org/wiki/Lambert_W_function#Derivative Wikipedia].
|
||||
|
||||
[h4:testing Testing]
|
||||
|
||||
Initial testing of the algorithm was done using a small number of spot tests.
|
||||
|
||||
After it was established that the underlying algorithm (including unlimited Halley refinements with a tight terminating criterion) was correct,
|
||||
some tables of Lambert W values were computed using a 100 decimal digit precision __multiprecision `cpp_dec_float_100` type and saved as
|
||||
a C++ program that will initialise arrays of values of z arguments and lambert_W0 (`lambert_w_mp_high_values.ipp` and `lambert_w_mp_low_values.ipp` ).
|
||||
|
||||
(A few of these pairs were checked against values computed by Wolfram Alpha to try to guard against mistakes;
|
||||
all those tested agreed to the penultimate decimal place, so they can be considered reliable to at least 98 decimal digits precision).
|
||||
|
||||
A macro `BOOST_MATH_TEST_VALUE` was used to allow tests with any real type, both __fundamental_types and __multiprecision.
|
||||
(This is necessary because __fundamental_types have a constructor from floating-point literals like 3.1459F, 3.1459 or 3.1459L
|
||||
whereas __multiprecision types may lose precision unless constructed from decimal digits strings like "3.1459").
|
||||
|
||||
The 100-decimal digits precision pairs were then used to assess the precision of less-precise types, including
|
||||
__multiprecision `cpp_bin_float_quad` and `cpp_bin_float_50`. `static_cast`ing from the high precision types should
|
||||
give the closest representable value of the less-precise type; this is then be used to assess the precision of
|
||||
the Lambert W algorithm.
|
||||
|
||||
Tests using
|
||||
confirm that over nearly all the range of z arguments,
|
||||
nearly all estimates are the nearest __representable value, a minority are within 1 __ulp and only a very few 2 ULP.
|
||||
|
||||
[graph lambert_w0_errors_graph]
|
||||
[graph lambert_wm1_errors_graph]
|
||||
|
||||
For the range of z arguments over the range -0.35 to 0.5, a different algorithm is used, but the same
|
||||
technique of evaluating reference values using a __multiprecision `cpp_dec_float_100` was used.
|
||||
For extremely small z arguments, near zero, and those extremely near the singularity at the branch point,
|
||||
precision can be much lower, as might be expected.
|
||||
|
||||
See source at:
|
||||
[@../../example/lambert_w_simple_examples.cpp lambert_w_simple_examples.cpp]
|
||||
[@../../test/test_lambert_w.cpp test_lambert_w.cpp] contains routine tests using __boost_test.
|
||||
[@../sf/lambert_w_errors_graph.cpp lambert_w_errors_graph.cpp] generating error graphs.
|
||||
|
||||
[h5:quadrature_testing Testing with quadrature]
|
||||
|
||||
A further method of testing over a wide range of argument z values was devised by Nick Thompson
|
||||
(cunningly also to test the recently written quadrature routines!).
|
||||
These are definite integral formulas involving the W function that are exactly known constants,
|
||||
for example, LambertW0(1/(z[sup2]) == [sqrt](2[pi]),
|
||||
see [@https://en.wikipedia.org/wiki/Lambert_W_function#Definite_integrals Definite Integrals].
|
||||
Some care was needed to avoid overflow and underflow as the integral function must evaluate to a finite result over the entire range.
|
||||
|
||||
[h5 Other implementations]
|
||||
|
||||
The Lambert W has also been discussed in a [@http://lists.boost.org/Archives/boost/2016/09/230819.php Boost thread].
|
||||
|
||||
This also gives link to a prototype version by which also gives complex results [^(x < -exp(-1)], about -0.367879).
|
||||
[@https://github.com/CzB404/lambert_w/ Balazs Cziraki 2016]
|
||||
Physicist, PhD student at Eotvos Lorand University, ELTE TTK Institute of Physics, Budapest.
|
||||
has also produced a prototype C++ library that can compute the Lambert W function for floating point
|
||||
[*and complex number types].
|
||||
This is not implemented here but might be completed in the future.
|
||||
|
||||
[h4:acknowledgements Acknowledgements]
|
||||
|
||||
* Thanks to Wolfram for use of their invaluable online Wolfram Alpha service.
|
||||
* Thanks for Mark Chapman for performing offline Wolfram computations.
|
||||
|
||||
[h4:references References]
|
||||
|
||||
# NIST Digital Library of Mathematical Functions. [@http://dlmf.nist.gov/4.13.F1].
|
||||
|
||||
# [@http://www.orcca.on.ca/LambertW/ Lambert W Poster],
|
||||
R. M. Corless, G. H. Gonnet, D. E. G. Hare, D. J. Jeffery and D. E. Knuth,
|
||||
On the Lambert W function Advances in Computational Mathematics, Vol 5, (1996) pp 329-359.
|
||||
|
||||
# [@https://people.sc.fsu.edu/~jburkardt/f_src/toms443/toms443.html TOMS443],
|
||||
Andrew Barry, S. J. Barry, Patricia Culligan-Hensley,
|
||||
Algorithm 743: WAPR - A Fortran routine for calculating real values of the W-function,[br]
|
||||
ACM Transactions on Mathematical Software, Volume 21, Number 2, June 1995, pages 172-181.[br]
|
||||
BISECT approximates the W function using bisection (GNU licence).
|
||||
Original FORTRAN77 version by Andrew Barry, S. J. Barry, Patricia Culligan-Hensley,
|
||||
this version by C++ version by John Burkardt.
|
||||
|
||||
# [@https://people.sc.fsu.edu/~jburkardt/f_src/toms743/toms743.html TOMS743] Fortran 90 (updated 2014).
|
||||
|
||||
Initial guesses based on:
|
||||
|
||||
# R.M.Corless, G.H.Gonnet, D.E.G.Hare, D.J.Jeffrey, and D.E.Knuth,
|
||||
On the Lambert W function, Adv.Comput.Math., vol. 5, pp. 329 to 359, (1996).
|
||||
|
||||
# D.A. Barry, J.-Y. Parlange, L. Li, H. Prommer, C.J. Cunningham, and
|
||||
F. Stagnitti. Analytical approximations for real values of the Lambert
|
||||
W-function. Mathematics and Computers in Simulation, 53(1), 95-103 (2000).
|
||||
|
||||
# D.A. Barry, J.-Y. Parlange, L. Li, H. Prommer, C.J. Cunningham, and
|
||||
F. Stagnitti. Erratum to analytical approximations for real values of the
|
||||
Lambert W-function. Mathematics and Computers in Simulation, 59(6):543-543, 2002.
|
||||
|
||||
# C++ __CUDA version of Luu algorithm, [@https://github.com/thomasluu/plog/blob/master/plog.cu plog].
|
||||
|
||||
# __Luu_thesis, see routine 11, page 98 for Lambert W algorithm.
|
||||
|
||||
# Having Fun with Lambert W(x) Function, Darko Veberic
|
||||
University of Nova Gorica, Slovenia IK, Forschungszentrum Karlsruhe, Germany, J. Stefan Institute, Ljubljana, Slovenia.
|
||||
|
||||
# Fran[ccedil]ois Chapeau-Blondeau and Abdelilah Monir, Numerical Evaluation of the Lambert W Function and Application to Generation of Generalized
|
||||
Gaussian Noise With Exponent 1/2, IEEE Transactions on Signal Processing, 50(9) (2002) 2160 - 2165.
|
||||
|
||||
# Toshio Fukushima, Precise and fast computation of Lambert W-functions without transcendental function evaluations, Journal of Computational and Applied
|
||||
Mathematics, 244 (2013) 77-89.
|
||||
|
||||
# T.C. Banwell and A. Jayakumar, Electronic Letter, Feb 2000, 36(4), pages 291-2.
|
||||
Exact analytical solution for current flow through diode with series resistance.
|
||||
[@http://dx.doi.org/10.1049/el:20000301]
|
||||
|
||||
# Princeton Companion to Applied Mathematics,
|
||||
'The Lambert-W function', Section 1.3: Series and Generating Functions.
|
||||
|
||||
# Cleve Moler, Mathworks blog [@https://blogs.mathworks.com/cleve/2013/09/02/the-lambert-w-function/#bfba4e2d-e049-45a6-8285-fe8b51d69ce7 The Lambert W Function]
|
||||
|
||||
# Digital Library of Mathematical Function, [@https://dlmf.nist.gov/4.13 Lambert W function].
|
||||
|
||||
[endsect] [/section:lambert_w Lambert W function]
|
||||
|
||||
[/
|
||||
Copyright 2016 John Maddock, Paul A. Bristow, Thomas Luu, Nicholas Thompson.
|
||||
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).
|
||||
]
|
||||
@@ -33,6 +33,9 @@ project
|
||||
<toolset>msvc:<cxxflags>/wd4456 # declaration of hides previous local declaration.
|
||||
#-<toolset>msvc:<cxxflags>/Za # nonfinite Serialization examples fail link if disable MS extensions,
|
||||
# because serialization library is built with MS extensions enabled (default).
|
||||
<toolset>clang:<cxxflags>-Wno-unknown-pragmas
|
||||
<toolset>clang:<cxxflags>-Wno-language-extension-token
|
||||
|
||||
<include>../../..
|
||||
<include>../include_private
|
||||
<exception-handling>off:<source>../test//no_eh
|
||||
|
||||
165
example/lambert_w_diode.cpp
Normal file
@@ -0,0 +1,165 @@
|
||||
// Copyright Paul A. Bristow 2016
|
||||
// Copyright John Z. Maddock 2016
|
||||
|
||||
// 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).
|
||||
|
||||
/*! brief Example of using Lambert W function to compute current through a diode connected transistor with preset series resistance.
|
||||
\details T. C. Banwell and A. Jayakumar,
|
||||
Exact analytical solution of current flow through diode with series resistance,
|
||||
Electron Letters, 36(4):291-2 (2000)
|
||||
DOI: dx.doi.org/10.1049/el:20000301
|
||||
|
||||
The current through a diode connected NPN bipolar junction transistor (BJT)
|
||||
type 2N2222 (See https://en.wikipedia.org/wiki/2N2222 and
|
||||
https://www.fairchildsemi.com/datasheets/PN/PN2222.pdf Datasheet)
|
||||
was measured, for a voltage between 0.3 to 1 volt, see Fig 2 for a log plot,
|
||||
showing a knee visible at about 0.6 V.
|
||||
|
||||
The transistor parameter isat was estimated to be 25 fA and the ideality factor = 1.0.
|
||||
The intrinsic emitter resistance re was estimated from the rsat = 0 data to be 0.3 ohm.
|
||||
|
||||
The solid curves in Figure 2 are calculated using equation 5 with rsat included with re.
|
||||
|
||||
http://www3.imperial.ac.uk/pls/portallive/docs/1/7292572.PDF
|
||||
*/
|
||||
|
||||
#include <boost/math/special_functions/lambert_w.hpp>
|
||||
using boost::math::lambert_w0;
|
||||
|
||||
#include <iostream>
|
||||
// using std::cout;
|
||||
// using std::endl;
|
||||
#include <exception>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <array>
|
||||
#include <vector>
|
||||
|
||||
/*!
|
||||
Compute thermal voltage as a function of temperature,
|
||||
about 25 mV at room temperature.
|
||||
https://en.wikipedia.org/wiki/Boltzmann_constant#Role_in_semiconductor_physics:_the_thermal_voltage
|
||||
|
||||
\param temperature Temperature (degrees centigrade).
|
||||
*/
|
||||
const double v_thermal(double temperature)
|
||||
{
|
||||
constexpr const double boltzmann_k = 1.38e-23; // joules/kelvin.
|
||||
const double charge_q = 1.6021766208e-19; // Charge of an electron (columb).
|
||||
double temp =+ 273; // Degrees C to K.
|
||||
return boltzmann_k * temp / charge_q;
|
||||
} // v_thermal
|
||||
|
||||
/*!
|
||||
Banwell & Jayakumar, equation 2
|
||||
*/
|
||||
double i(double isat, double vd, double vt, double nu)
|
||||
{
|
||||
double i = isat * (exp(vd / (nu * vt)) - 1);
|
||||
return i;
|
||||
} //
|
||||
|
||||
/*!
|
||||
|
||||
Banwell & Jayakumar, Equation 4.
|
||||
i current flow = isat
|
||||
v voltage source.
|
||||
isat reverse saturation current in equation 4.
|
||||
(might implement equation 4 instead of simpler equation 5?).
|
||||
vd voltage drop = v - i* rs (equation 1).
|
||||
vt thermal voltage, 0.0257025 = 25 mV.
|
||||
nu junction ideality factor (default = unity), also known as the emission coefficient.
|
||||
re intrinsic emitter resistance, estimated to be 0.3 ohm from low current.
|
||||
rsat reverse saturation current
|
||||
|
||||
\param v Voltage V to compute current I(V).
|
||||
\param vt Thermal voltage, for example 0.0257025 = 25 mV, computed from boltzmann_k * temp / charge_q;
|
||||
\param rsat Resistance in series with the diode.
|
||||
\param re Instrinsic emitter resistance (estimated to be 0.3 ohm from the Rs = 0 data)
|
||||
\param isat Reverse saturation current (See equation 2).
|
||||
\param nu Ideality factor (default = unity).
|
||||
|
||||
\returns I amp as function of V volt.
|
||||
|
||||
*/
|
||||
double iv(double v, double vt, double rsat, double re, double isat, double nu = 1.)
|
||||
{
|
||||
// V thermal 0.0257025 = 25 mV
|
||||
// was double i = (nu * vt/r) * lambert_w((i0 * r) / (nu * vt)); equ 5.
|
||||
|
||||
rsat = rsat + re;
|
||||
double i = nu * vt / rsat;
|
||||
std::cout << "nu * vt / rsat = " << i << std::endl; // 0.000103223
|
||||
|
||||
double x = isat * rsat / (nu * vt);
|
||||
std::cout << "isat * rsat / (nu * vt) = " << x << std::endl;
|
||||
|
||||
double eterm = (v + isat * rsat) / (nu * vt);
|
||||
std::cout << "(v + isat * rsat) / (nu * vt) = " << eterm << std::endl;
|
||||
|
||||
double e = exp(eterm);
|
||||
std::cout << "exp(eterm) = " << e << std::endl;
|
||||
|
||||
double w0 = lambert_w0(x * e);
|
||||
std::cout << "w0 = " << w0 << std::endl;
|
||||
return i * w0 - isat;
|
||||
|
||||
} // double iv
|
||||
|
||||
std::array<double, 5> rss = {0., 2.18, 10., 51., 249}; // series resistance (ohm).
|
||||
std::array<double, 8> vds = { 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 }; // Diode voltage.
|
||||
|
||||
int main()
|
||||
{
|
||||
try
|
||||
{
|
||||
std::cout << "Lambert W diode current example." << std::endl;
|
||||
|
||||
//[lambert_w_diode_example_1
|
||||
double x = 0.01;
|
||||
//std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.00990147
|
||||
|
||||
double nu = 1.0; // Assumed ideal.
|
||||
double vt = v_thermal(25); // v thermal, Shockley equation, expect about 25 mV at room temperature.
|
||||
double boltzmann_k = 1.38e-23; // joules/kelvin
|
||||
double temp = 273 + 25;
|
||||
double charge_q = 1.6e-19; // column
|
||||
vt = boltzmann_k * temp / charge_q;
|
||||
std::cout << "V thermal "
|
||||
<< vt << std::endl; // V thermal 0.0257025 = 25 mV
|
||||
double rsat = 0.;
|
||||
double isat = 25.e-15; // 25 fA;
|
||||
std::cout << "Isat = " << isat << std::endl;
|
||||
|
||||
double re = 0.3; // Estimated from slope of straight section of graph (equation 6).
|
||||
|
||||
double v = 0.9;
|
||||
double icalc = iv(v, vt, 249., re, isat);
|
||||
|
||||
std::cout << "voltage = " << v << ", current = " << icalc << ", " << log(icalc) << std::endl; // voltage = 0.9, current = 0.00108485, -6.82631
|
||||
//] [/lambert_w_diode_example_1]
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
} // int main()
|
||||
|
||||
/*
|
||||
Output:
|
||||
//[lambert_w_output_1
|
||||
Lambert W diode current example.
|
||||
V thermal 0.0257025
|
||||
Isat = 2.5e-14
|
||||
nu * vt / rsat = 0.000103099
|
||||
isat * rsat / (nu * vt) = 2.42486e-10
|
||||
(v + isat * rsat) / (nu * vt) = 35.016
|
||||
exp(eterm) = 1.61167e+15
|
||||
w0 = 10.5225
|
||||
voltage = 0.9, current = 0.00108485, -6.82631
|
||||
|
||||
//] [/lambert_w_output_1]
|
||||
*/
|
||||
|
||||
280
example/lambert_w_diode_graph.cpp
Normal file
@@ -0,0 +1,280 @@
|
||||
// Copyright Paul A. Bristow 2016
|
||||
// Copyright John Z. Maddock 2016
|
||||
|
||||
// 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).
|
||||
|
||||
/*! \brief Graph showing use of Lambert W function to compute current
|
||||
through a diode-connected transistor with preset series resistance.
|
||||
|
||||
\details T. C. Banwell and A. Jayakumar,
|
||||
Exact analytical solution of current flow through diode with series resistance,
|
||||
Electron Letters, 36(4):291-2 (2000).
|
||||
DOI: dx.doi.org/10.1049/el:20000301
|
||||
|
||||
The current through a diode connected NPN bipolar junction transistor (BJT)
|
||||
type 2N2222 (See https://en.wikipedia.org/wiki/2N2222 and
|
||||
https://www.fairchildsemi.com/datasheets/PN/PN2222.pdf Datasheet)
|
||||
was measured, for a voltage between 0.3 to 1 volt, see Fig 2 for a log plot, showing a knee visible at about 0.6 V.
|
||||
|
||||
The transistor parameter I sat was estimated to be 25 fA and the ideality factor = 1.0.
|
||||
The intrinsic emitter resistance re was estimated from the rsat = 0 data to be 0.3 ohm.
|
||||
|
||||
The solid curves in Figure 2 are calculated using equation 5 with rsat included with re.
|
||||
|
||||
http://www3.imperial.ac.uk/pls/portallive/docs/1/7292572.PDF
|
||||
|
||||
*/
|
||||
|
||||
#include <boost/math/special_functions/lambert_w.hpp>
|
||||
using boost::math::lambert_w0;
|
||||
#include <boost/math/special_functions.hpp>
|
||||
using boost::math::isfinite;
|
||||
#include <boost/svg_plot/svg_2d_plot.hpp>
|
||||
using namespace boost::svg;
|
||||
|
||||
#include <iostream>
|
||||
// using std::cout;
|
||||
// using std::endl;
|
||||
#include <exception>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <array>
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
using std::pair;
|
||||
#include <map>
|
||||
using std::map;
|
||||
#include <set>
|
||||
using std::multiset;
|
||||
#include <limits>
|
||||
using std::numeric_limits;
|
||||
#include <cmath> //
|
||||
|
||||
/*!
|
||||
Compute thermal voltage as a function of temperature,
|
||||
about 25 mV at room temperature.
|
||||
https://en.wikipedia.org/wiki/Boltzmann_constant#Role_in_semiconductor_physics:_the_thermal_voltage
|
||||
|
||||
\param temperature Temperature (degrees Celsius).
|
||||
*/
|
||||
const double v_thermal(double temperature)
|
||||
{
|
||||
BOOST_CONSTEXPR const double boltzmann_k = 1.38e-23; // joules/kelvin.
|
||||
BOOST_CONSTEXPR double charge_q = 1.6021766208e-19; // Charge of an electron (columb).
|
||||
double temp = +273; // Degrees C to K.
|
||||
return boltzmann_k * temp / charge_q;
|
||||
} // v_thermal
|
||||
|
||||
/*!
|
||||
Banwell & Jayakumar, equation 2, page 291.
|
||||
*/
|
||||
double i(double isat, double vd, double vt, double nu)
|
||||
{
|
||||
double i = isat * (exp(vd / (nu * vt)) - 1);
|
||||
return i;
|
||||
} //
|
||||
|
||||
/*!
|
||||
Banwell & Jayakumar, Equation 4, page 291.
|
||||
i current flow = isat
|
||||
v voltage source.
|
||||
isat reverse saturation current in equation 4.
|
||||
(might implement equation 4 instead of simpler equation 5?).
|
||||
vd voltage drop = v - i* rs (equation 1).
|
||||
vt thermal voltage, 0.0257025 = 25 mV.
|
||||
nu junction ideality factor (default = unity), also known as the emission coefficient.
|
||||
re intrinsic emitter resistance, estimated to be 0.3 ohm from low current.
|
||||
rsat reverse saturation current
|
||||
|
||||
\param v Voltage V to compute current I(V).
|
||||
\param vt Thermal voltage, for example 0.0257025 = 25 mV, computed from boltzmann_k * temp / charge_q;
|
||||
\param rsat Resistance in series with the diode.
|
||||
\param re Instrinsic emitter resistance (estimated to be 0.3 ohm from the Rs = 0 data)
|
||||
\param isat Reverse saturation current (See equation 2).
|
||||
\param nu Ideality factor (default = unity).
|
||||
|
||||
\returns I amp as function of V volt.
|
||||
*/
|
||||
|
||||
//[lambert_w_diode_graph_2
|
||||
double iv(double v, double vt, double rsat, double re, double isat, double nu = 1.)
|
||||
{
|
||||
// V thermal 0.0257025 = 25 mV
|
||||
// was double i = (nu * vt/r) * lambert_w((i0 * r) / (nu * vt)); equ 5.
|
||||
|
||||
rsat = rsat + re;
|
||||
double i = nu * vt / rsat;
|
||||
// std::cout << "nu * vt / rsat = " << i << std::endl; // 0.000103223
|
||||
|
||||
double x = isat * rsat / (nu * vt);
|
||||
// std::cout << "isat * rsat / (nu * vt) = " << x << std::endl;
|
||||
|
||||
double eterm = (v + isat * rsat) / (nu * vt);
|
||||
// std::cout << "(v + isat * rsat) / (nu * vt) = " << eterm << std::endl;
|
||||
|
||||
double e = exp(eterm);
|
||||
// std::cout << "exp(eterm) = " << e << std::endl;
|
||||
|
||||
double w0 = lambert_w0(x * e);
|
||||
// std::cout << "w0 = " << w0 << std::endl;
|
||||
return i * w0 - isat;
|
||||
} // double iv
|
||||
|
||||
//] [\lambert_w_diode_graph_2]
|
||||
|
||||
|
||||
std::array<double, 5> rss = { 0., 2.18, 10., 51., 249 }; // series resistance (ohm).
|
||||
std::array<double, 7> vds = { 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 }; // Diode voltage.
|
||||
std::array<double, 7> lni = { -19.65, -15.75, -11.86, -7.97, -4.08, -0.0195, 3.6 }; // ln(current).
|
||||
|
||||
int main()
|
||||
{
|
||||
try
|
||||
{
|
||||
std::cout << "Lambert W diode current example." << std::endl;
|
||||
|
||||
//[lambert_w_diode_graph_1
|
||||
double nu = 1.0; // Assumed ideal.
|
||||
double vt = v_thermal(25); // v thermal, Shockley equation, expect about 25 mV at room temperature.
|
||||
double boltzmann_k = 1.38e-23; // joules/kelvin
|
||||
double temp = 273 + 25;
|
||||
double charge_q = 1.6e-19; // column
|
||||
vt = boltzmann_k * temp / charge_q;
|
||||
std::cout << "V thermal " << vt << std::endl; // V thermal 0.0257025 = 25 mV
|
||||
double rsat = 0.;
|
||||
double isat = 25.e-15; // 25 fA;
|
||||
std::cout << "Isat = " << isat << std::endl;
|
||||
double re = 0.3; // Estimated from slope of straight section of graph (equation 6).
|
||||
double v = 0.9;
|
||||
double icalc = iv(v, vt, 249., re, isat);
|
||||
std::cout << "voltage = " << v << ", current = " << icalc << ", " << log(icalc) << std::endl; // voltage = 0.9, current = 0.00108485, -6.82631
|
||||
//] [/lambert_w_diode_graph_1]
|
||||
|
||||
// Plot a few measured data points.
|
||||
std::map<const double, double> zero_data; // Extrapolated from slope of measurements with no external resistor.
|
||||
zero_data[0.3] = -19.65;
|
||||
zero_data[0.4] = -15.75;
|
||||
zero_data[0.5] = -11.86;
|
||||
zero_data[0.6] = -7.97;
|
||||
zero_data[0.7] = -4.08;
|
||||
zero_data[0.8] = -0.0195;
|
||||
zero_data[0.9] = 3.9;
|
||||
|
||||
std::map<const double, double> measured_zero_data; // No external series resistor.
|
||||
measured_zero_data[0.3] = -19.65;
|
||||
measured_zero_data[0.4] = -15.75;
|
||||
measured_zero_data[0.5] = -11.86;
|
||||
measured_zero_data[0.6] = -7.97;
|
||||
measured_zero_data[0.7] = -4.2;
|
||||
measured_zero_data[0.72] = -3.5;
|
||||
measured_zero_data[0.74] = -2.8;
|
||||
measured_zero_data[0.76] = -2.3;
|
||||
measured_zero_data[0.78] = -2.0;
|
||||
// Measured from Fig 2 as raw data not available.
|
||||
|
||||
double step = 0.1;
|
||||
for (int i = 0; i < vds.size(); i++)
|
||||
{
|
||||
zero_data[vds[i]] = lni[i];
|
||||
std::cout << lni[i] << " " << vds[i] << std::endl;
|
||||
}
|
||||
step = 0.01;
|
||||
|
||||
std::map<const double, double> data_2;
|
||||
for (double v = 0.3; v < 1.; v += step)
|
||||
{
|
||||
double current = iv(v, vt, 2., re, isat);
|
||||
data_2[v] = log(current);
|
||||
// std::cout << "v " << v << ", current = " << current << " log current = " << log(current) << std::endl;
|
||||
}
|
||||
std::map<const double, double> data_10;
|
||||
for (double v = 0.3; v < 1.; v += step)
|
||||
{
|
||||
double current = iv(v, vt, 10., re, isat);
|
||||
data_10[v] = log(current);
|
||||
// std::cout << "v " << v << ", current = " << current << " log current = " << log(current) << std::endl;
|
||||
}
|
||||
std::map<const double, double> data_51;
|
||||
for (double v = 0.3; v < 1.; v += step)
|
||||
{
|
||||
double current = iv(v, vt, 51., re, isat);
|
||||
data_51[v] = log(current);
|
||||
// std::cout << "v " << v << ", current = " << current << " log current = " << log(current) << std::endl;
|
||||
}
|
||||
std::map<const double, double> data_249;
|
||||
for (double v = 0.3; v < 1.; v += step)
|
||||
{
|
||||
double current = iv(v, vt, 249., re, isat);
|
||||
data_249[v] = log(current);
|
||||
// std::cout << "v " << v << ", current = " << current << " log current = " << log(current) << std::endl;
|
||||
}
|
||||
|
||||
svg_2d_plot data_plot;
|
||||
|
||||
data_plot.title("Diode current versus voltage")
|
||||
.x_size(400)
|
||||
.y_size(300)
|
||||
.legend_on(true)
|
||||
.legend_lines(true)
|
||||
.x_label("voltage (V)")
|
||||
.y_label("log(current) (A)")
|
||||
//.x_label_on(true)
|
||||
//.y_label_on(true)
|
||||
//.xy_values_on(false)
|
||||
.x_range(0.25, 1.)
|
||||
.y_range(-20., +4.)
|
||||
.x_major_interval(0.1)
|
||||
.y_major_interval(4)
|
||||
.x_major_grid_on(true)
|
||||
.y_major_grid_on(true)
|
||||
//.x_values_on(true)
|
||||
//.y_values_on(true)
|
||||
.y_values_rotation(horizontal)
|
||||
//.plot_window_on(true)
|
||||
.x_values_precision(3)
|
||||
.y_values_precision(3)
|
||||
.coord_precision(4) // Needed to avoid stepping on curves.
|
||||
.copyright_holder("Paul A. Bristow")
|
||||
.copyright_date("2016")
|
||||
//.background_border_color(black);
|
||||
;
|
||||
|
||||
// ₀ = subscript zero.
|
||||
data_plot.plot(zero_data, "I₀(V)").fill_color(lightgray).shape(none).size(3).line_on(true).line_width(0.5);
|
||||
data_plot.plot(measured_zero_data, "Rs=0 Ω").fill_color(lightgray).shape(square).size(3).line_on(true).line_width(0.5);
|
||||
data_plot.plot(data_2, "Rs=2 Ω").line_color(blue).shape(none).line_on(true).bezier_on(false).line_width(1);
|
||||
data_plot.plot(data_10, "Rs=10 Ω").line_color(purple).shape(none).line_on(true).bezier_on(false).line_width(1);
|
||||
data_plot.plot(data_51, "Rs=51 Ω").line_color(green).shape(none).line_on(true).line_width(1);
|
||||
data_plot.plot(data_249, "Rs=249 Ω").line_color(red).shape(none).line_on(true).line_width(1);
|
||||
data_plot.write("./diode_iv_plot");
|
||||
|
||||
// bezier_on(true);
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
|
||||
|
||||
} // int main()
|
||||
|
||||
/*
|
||||
|
||||
//[lambert_w_output_1
|
||||
Output:
|
||||
Lambert W diode current example.
|
||||
V thermal 0.0257025
|
||||
Isat = 2.5e-14
|
||||
voltage = 0.9, current = 0.00108485, -6.82631
|
||||
-19.65 0.3
|
||||
-15.75 0.4
|
||||
-11.86 0.5
|
||||
-7.97 0.6
|
||||
-4.08 0.7
|
||||
-0.0195 0.8
|
||||
3.6 0.9
|
||||
|
||||
//] [/lambert_w_output_1]
|
||||
*/
|
||||
239
example/lambert_w_example.cpp
Normal file
@@ -0,0 +1,239 @@
|
||||
// Copyright Paul A. Bristow 2016.
|
||||
|
||||
// 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).
|
||||
|
||||
// Test that can build and run a simple example of Lambert W function,
|
||||
// using algorithm of Thomas Luu.
|
||||
// https://svn.boost.org/trac/boost/ticket/11027
|
||||
|
||||
#include <boost/config.hpp> // for BOOST_PLATFORM, BOOST_COMPILER, BOOST_STDLIB ...
|
||||
#include <boost/version.hpp> // for BOOST_MSVC versions.
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/exception/exception.hpp> // boost::exception
|
||||
#include <boost/math/constants/constants.hpp> // For exp_minus_one == 3.67879441171442321595523770161460867e-01.
|
||||
|
||||
#define BOOST_MATH_INSTRUMENT_LAMBERT_W // #define only for diagnostic output.
|
||||
|
||||
// For lambert_w function.
|
||||
#include <boost/math/special_functions/lambert_w.hpp>
|
||||
|
||||
#include <iostream>
|
||||
// using std::cout;
|
||||
// using std::endl;
|
||||
#include <exception>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <limits> // For std::numeric_limits.
|
||||
|
||||
//! Show information about build, architecture, address model, platform, ...
|
||||
std::string show_versions()
|
||||
{
|
||||
std::ostringstream message;
|
||||
|
||||
message << "Program: " << __FILE__ << "\n";
|
||||
#ifdef __TIMESTAMP__
|
||||
message << __TIMESTAMP__;
|
||||
#endif
|
||||
message << "\nBuildInfo:\n" " Platform " << BOOST_PLATFORM;
|
||||
// http://stackoverflow.com/questions/1505582/determining-32-vs-64-bit-in-c
|
||||
#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
|
||||
#define IS64BIT 1
|
||||
message << ", 64-bit.";
|
||||
#else
|
||||
#define IS32BIT 1
|
||||
message << ", 32-bit.";
|
||||
#endif
|
||||
|
||||
message << "\n Compiler " BOOST_COMPILER;
|
||||
#ifdef BOOST_MSC_VER
|
||||
#ifdef _MSC_FULL_VER
|
||||
message << "\n MSVC version " << BOOST_STRINGIZE(_MSC_FULL_VER) << ".";
|
||||
#endif
|
||||
#ifdef __WIN64
|
||||
mess age << "\n WIN64" << std::endl;
|
||||
#endif // __WIN64
|
||||
#ifdef _WIN32
|
||||
message << "\n WIN32" << std::endl;
|
||||
#endif // __WIN32
|
||||
#endif
|
||||
#ifdef __GNUC__
|
||||
//PRINT_MACRO(__GNUC__);
|
||||
//PRINT_MACRO(__GNUC_MINOR__);
|
||||
//PRINT_MACRO(__GNUC_PATCH__);
|
||||
std::cout << "GCC " << __VERSION__ << std::endl;
|
||||
//PRINT_MACRO(LONG_MAX);
|
||||
#endif // __GNUC__
|
||||
|
||||
message << "\n STL " << BOOST_STDLIB;
|
||||
|
||||
message << "\n Boost version " << BOOST_VERSION / 100000 << "." << BOOST_VERSION / 100 % 1000 << "." << BOOST_VERSION % 100;
|
||||
|
||||
#ifdef BOOST_HAS_FLOAT128
|
||||
message << ", BOOST_HAS_FLOAT128" << std::endl;
|
||||
#endif
|
||||
message << std::endl;
|
||||
return message.str();
|
||||
} // std::string versions()
|
||||
|
||||
int main()
|
||||
{
|
||||
try
|
||||
{
|
||||
//std::cout << "Lambert W example basic!" << std::endl;
|
||||
//std::cout << show_versions() << std::endl;
|
||||
|
||||
//std::cout << exp(1) << std::endl; // 2.71828
|
||||
//std::cout << exp(-1) << std::endl; // 0.367879
|
||||
//std::cout << std::numeric_limits<double>::epsilon() / 2 << std::endl; // 1.11022e-16
|
||||
|
||||
using namespace boost::math;
|
||||
using boost::math::constants::exp_minus_one;
|
||||
double x = 1.;
|
||||
|
||||
double W1 = lambert_w(1.);
|
||||
// Note, NOT integer X, for example: lambert_w(1); or will get message like
|
||||
// error C2338: Must be floating-point, not integer type, for example W(1.), not W(1)!
|
||||
//
|
||||
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.567143
|
||||
// This 'golden ratio' for exponentials is http://mathworld.wolfram.com/OmegaConstant.html
|
||||
// since exp[-W(1)] = W(1)
|
||||
// A030178 Decimal expansion of LambertW(1): the solution to x*exp(x)
|
||||
// = 0.5671432904097838729999686622103555497538157871865125081351310792230457930866
|
||||
// http://oeis.org/A030178
|
||||
|
||||
double expplogone = exp(-lambert_w(1.));
|
||||
if (expplogone != W1)
|
||||
{
|
||||
std::cout << expplogone << " " << W1 << std::endl; //
|
||||
}
|
||||
|
||||
|
||||
//[lambert_w_example_1
|
||||
|
||||
x = 0.01;
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.00990147
|
||||
//] [/lambert_w_example_1]
|
||||
x = -0.01;
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // -0.0101015
|
||||
x = -0.1;
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; //
|
||||
/**/
|
||||
|
||||
for (double xd = 1.; xd < 1e20; xd *= 10)
|
||||
{
|
||||
|
||||
// 1. 0.56714329040978387
|
||||
// 0.56714329040978384
|
||||
|
||||
// 10 1.7455280027406994
|
||||
// 1.7455280027406994
|
||||
|
||||
// 100 3.3856301402900502
|
||||
// 3.3856301402900502
|
||||
// 1000 5.2496028524015959
|
||||
// 5.249602852401596227126056319697306282521472386059592844451465483991362228320942832739693150854347718
|
||||
|
||||
// 1e19 40.058769161984308
|
||||
// 40.05876916198431163898797971203180915622644925765346546858291325452428038208071849105889199253335063
|
||||
std::cout << "Lambert W (" << xd << ") = " << lambert_w(xd) << std::endl; //
|
||||
}
|
||||
//
|
||||
// Test near singularity.
|
||||
|
||||
// http://www.wolframalpha.com/input/?i=N%5Blambert_w%5B-0.367879%5D,17%5D test value N[lambert_w[-0.367879],17]
|
||||
// -0.367879441171442321595523770161460867445811131031767834
|
||||
x = -0.367879; // < -exp(1) = -0.367879
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // Lambert W (-0.36787900000000001) = -0.99845210378080340
|
||||
// -0.99845210378080340
|
||||
// -0.99845210378072726 N[lambert_w[-0.367879],17] wolfram so very close.
|
||||
|
||||
x = -0.3678794; // expect -0.99952696660756813
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.0
|
||||
x = -0.36787944; // expect -0.99992019848408340
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.0
|
||||
x = -0.367879441; // -0.99996947070054883
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.0
|
||||
x = -0.36787944117; // -0.99999719977527159
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.0
|
||||
x = -0.367879441171; // -0.99999844928821992
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.0
|
||||
|
||||
x = -exp_minus_one<double>() + std::numeric_limits<double>::epsilon();
|
||||
// Lambert W (-0.36787944117144211) = -0.99999996349975895
|
||||
// N[lambert_w[-0.36787944117144211],17] == -0.99999996608315303
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.0
|
||||
std::cout << " 1 - sqrt(eps) = " << static_cast<double>(1) - sqrt(std::numeric_limits<double>::epsilon()) << std::endl;
|
||||
x = -exp_minus_one<double>();
|
||||
// N[lambert_w[-0.36787944117144233],17] == -1.000000000000000 + 6.7595465843924897×10^-9 i
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // 0.0
|
||||
// At Singularity - 0.36787944117144233 == -0.36787944117144233 returned - 1.0000000000000000
|
||||
// Lambert W(-0.36787944117144233) = -1.0000000000000000
|
||||
|
||||
|
||||
x = (std::numeric_limits<double>::max)()/4;
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; // OK 702.023799146706
|
||||
x = (std::numeric_limits<double>::max)()/2;
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; //
|
||||
x = (std::numeric_limits<double>::max)();
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w(x) << std::endl; //
|
||||
// Error in function boost::math::log1p<double>(double): numeric overflow
|
||||
/* */
|
||||
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
|
||||
|
||||
} // int main()
|
||||
|
||||
/*
|
||||
|
||||
//[lambert_w_output_1
|
||||
Output:
|
||||
|
||||
1> example_basic.cpp
|
||||
1> Generating code
|
||||
1> All 237 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
|
||||
1> Finished generating code
|
||||
1> LambertW.vcxproj -> J:\Cpp\Misc\x64\Release\LambertW.exe
|
||||
1> LambertW.vcxproj -> J:\Cpp\Misc\x64\Release\LambertW.pdb (Full PDB)
|
||||
1> Lambert W example basic!
|
||||
1> Platform: Win32
|
||||
1> Compiler: Microsoft Visual C++ version 14.0
|
||||
1> STL : Dinkumware standard library version 650
|
||||
1> Boost : 1.63.0
|
||||
1> _MSC_FULL_VER = 190024123
|
||||
1> Win32
|
||||
1> x64
|
||||
1> (x64)
|
||||
1> Iteration #0, w0 0.577547206058041, w1 = 0.567143616915443, difference = 0.0289944962755619, relative 0.018343835374856
|
||||
1> Iteration #1, w0 0.567143616915443, w1 = 0.567143290409784, difference = 9.02208135089566e-07, relative 5.75702234328901e-07
|
||||
1> Final 0.567143290409784 after 2 iterations, difference = 0
|
||||
1> Iteration #0, w0 0.577547206058041, w1 = 0.567143616915443, difference = 0.0289944962755619, relative 0.018343835374856
|
||||
1> Iteration #1, w0 0.567143616915443, w1 = 0.567143290409784, difference = 9.02208135089566e-07, relative 5.75702234328901e-07
|
||||
1> Final 0.567143290409784 after 2 iterations, difference = 0
|
||||
1> Lambert W (1) = 0.567143290409784
|
||||
1> Iteration #0, w0 0.577547206058041, w1 = 0.567143616915443, difference = 0.0289944962755619, relative 0.018343835374856
|
||||
1> Iteration #1, w0 0.567143616915443, w1 = 0.567143290409784, difference = 9.02208135089566e-07, relative 5.75702234328901e-07
|
||||
1> Final 0.567143290409784 after 2 iterations, difference = 0
|
||||
1> Iteration #0, w0 0.0099072820916067, w1 = 0.00990147384359511, difference = 5.92416060777624e-06, relative 0.000586604388734591
|
||||
1> Final 0.00990147384359511 after 1 iterations, difference = 0
|
||||
1> Lambert W (0.01) = 0.00990147384359511
|
||||
1> Iteration #0, w0 -0.0101016472705154, w1 = -0.0101015271985388, difference = -1.17664437923951e-07, relative 1.18865171889748e-05
|
||||
1> Final -0.0101015271985388 after 1 iterations, difference = 0
|
||||
1> Lambert W (-0.01) = -0.0101015271985388
|
||||
1> Iteration #0, w0 -0.111843322610692, w1 = -0.111832559158964, difference = -8.54817065376601e-06, relative 9.62461362694622e-05
|
||||
1> Iteration #1, w0 -0.111832559158964, w1 = -0.111832559158963, difference = -5.68989300120393e-16, relative 6.43929354282591e-15
|
||||
1> Final -0.111832559158963 after 2 iterations, difference = 0
|
||||
1> Lambert W (-0.1) = -0.111832559158963
|
||||
1> Iteration #0, w0 -0.998452103785573, w1 = -0.998452103780803, difference = -2.72004641033163e-15, relative 4.77662354114727e-12
|
||||
1> Final -0.998452103780803 after 1 iterations, difference = 0
|
||||
1> Lambert W (-0.367879) = -0.998452103780803
|
||||
|
||||
//] [/lambert_w_output_1]
|
||||
*/
|
||||
286
example/lambert_w_graph.cpp
Normal file
@@ -0,0 +1,286 @@
|
||||
// Copyright Paul A. Bristow 2017
|
||||
// Copyright John Z. Maddock 2017
|
||||
|
||||
// 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).
|
||||
|
||||
/*! \brief Graph showing use of Lambert W function.
|
||||
|
||||
\details
|
||||
|
||||
Both Lambert W0 and W-1 branches can be shown on one graph.
|
||||
But useful to have another graph for larger values of argument z.
|
||||
Need two separate graphs for Lambert W0 and -1 prime because
|
||||
the sensible ranges and axes are too different.
|
||||
|
||||
One would get too small LambertW0 in top right and W-1 in bottom left.
|
||||
|
||||
*/
|
||||
|
||||
#include <boost/math/special_functions/lambert_w.hpp>
|
||||
using boost::math::lambert_w0;
|
||||
using boost::math::lambert_wm1;
|
||||
using boost::math::lambert_w0_prime;
|
||||
using boost::math::lambert_wm1_prime;
|
||||
|
||||
#include <boost/math/special_functions.hpp>
|
||||
using boost::math::isfinite;
|
||||
#include <boost/svg_plot/svg_2d_plot.hpp>
|
||||
using namespace boost::svg;
|
||||
#include <boost/svg_plot/show_2d_settings.hpp>
|
||||
using boost::svg::show_2d_plot_settings;
|
||||
|
||||
#include <iostream>
|
||||
// using std::cout;
|
||||
// using std::endl;
|
||||
#include <exception>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <array>
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
using std::pair;
|
||||
#include <map>
|
||||
using std::map;
|
||||
#include <set>
|
||||
using std::multiset;
|
||||
#include <limits>
|
||||
using std::numeric_limits;
|
||||
#include <cmath> //
|
||||
|
||||
/*!
|
||||
*/
|
||||
int main()
|
||||
{
|
||||
try
|
||||
{
|
||||
std::cout << "Lambert W graph example." << std::endl;
|
||||
|
||||
//[lambert_w_graph_1
|
||||
//] [/lambert_w_graph_1]
|
||||
{
|
||||
std::map<const double, double> wm1s; // Lambert W-1 branch values.
|
||||
std::map<const double, double> w0s; // Lambert W0 branch values.
|
||||
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10);
|
||||
|
||||
int count = 0;
|
||||
for (double z = -0.36787944117144232159552377016146086744581113103176804; z < 2.8; z += 0.001)
|
||||
{
|
||||
double w0 = lambert_w0(z);
|
||||
w0s[z] = w0;
|
||||
// std::cout << "z " << z << ", w = " << w0 << std::endl;
|
||||
count++;
|
||||
}
|
||||
std::cout << "points " << count << std::endl;
|
||||
|
||||
count = 0;
|
||||
for (double z = -0.3678794411714423215955237701614608727; z < -0.001; z += 0.001)
|
||||
{
|
||||
double wm1 = lambert_wm1(z);
|
||||
wm1s[z] = wm1;
|
||||
count++;
|
||||
}
|
||||
std::cout << "points " << count << std::endl;
|
||||
|
||||
svg_2d_plot data_plot;
|
||||
data_plot.title("Lambert W function.")
|
||||
.x_size(400)
|
||||
.y_size(300)
|
||||
.legend_on(true)
|
||||
.legend_lines(true)
|
||||
.x_label("z")
|
||||
.y_label("W")
|
||||
.x_range(-1, 3.)
|
||||
.y_range(-4., +1.)
|
||||
.x_major_interval(1.)
|
||||
.y_major_interval(1.)
|
||||
.x_major_grid_on(true)
|
||||
.y_major_grid_on(true)
|
||||
//.x_values_on(true)
|
||||
//.y_values_on(true)
|
||||
.y_values_rotation(horizontal)
|
||||
//.plot_window_on(true)
|
||||
.x_values_precision(3)
|
||||
.y_values_precision(3)
|
||||
.coord_precision(4) // Needed to avoid stepping on curves.
|
||||
.copyright_holder("Paul A. Bristow")
|
||||
.copyright_date("2018")
|
||||
//.background_border_color(black);
|
||||
;
|
||||
data_plot.plot(w0s, "W0 branch").line_color(red).shape(none).line_on(true).bezier_on(false).line_width(1);
|
||||
data_plot.plot(wm1s, "W-1 branch").line_color(blue).shape(none).line_on(true).bezier_on(false).line_width(1);
|
||||
data_plot.write("./lambert_w_graph");
|
||||
|
||||
show_2d_plot_settings(data_plot); // For plot diagnosis only.
|
||||
|
||||
} // small z Lambert W
|
||||
|
||||
{ // bigger argument z Lambert W
|
||||
|
||||
std::map<const double, double> w0s_big; // Lambert W0 branch values for large z and W.
|
||||
std::map<const double, double> wm1s_big; // Lambert W-1 branch values for small z and large -W.
|
||||
int count = 0;
|
||||
for (double z = -0.3678794411714423215955237701614608727; z < 10000.; z += 50.)
|
||||
{
|
||||
double w0 = lambert_w0(z);
|
||||
w0s_big[z] = w0;
|
||||
count++;
|
||||
}
|
||||
std::cout << "points " << count << std::endl;
|
||||
|
||||
count = 0;
|
||||
for (double z = -0.3678794411714423215955237701614608727; z < -0.001; z += 0.001)
|
||||
{
|
||||
double wm1 = lambert_wm1(z);
|
||||
wm1s_big[z] = wm1;
|
||||
count++;
|
||||
}
|
||||
std::cout << "Lambert W0 large z argument points = " << count << std::endl;
|
||||
|
||||
svg_2d_plot data_plot2;
|
||||
data_plot2.title("Lambert W0 function for larger z.")
|
||||
.x_size(400)
|
||||
.y_size(300)
|
||||
.legend_on(false)
|
||||
.x_label("z")
|
||||
.y_label("W")
|
||||
//.x_label_on(true)
|
||||
//.y_label_on(true)
|
||||
//.xy_values_on(false)
|
||||
.x_range(-1, 10000.)
|
||||
.y_range(-1., +8.)
|
||||
.x_major_interval(2000.)
|
||||
.y_major_interval(1.)
|
||||
.x_major_grid_on(true)
|
||||
.y_major_grid_on(true)
|
||||
//.x_values_on(true)
|
||||
//.y_values_on(true)
|
||||
.y_values_rotation(horizontal)
|
||||
//.plot_window_on(true)
|
||||
.x_values_precision(3)
|
||||
.y_values_precision(3)
|
||||
.coord_precision(4) // Needed to avoid stepping on curves.
|
||||
.copyright_holder("Paul A. Bristow")
|
||||
.copyright_date("2018")
|
||||
//.background_border_color(black);
|
||||
;
|
||||
|
||||
data_plot2.plot(w0s_big, "W0 branch").line_color(red).shape(none).line_on(true).bezier_on(false).line_width(1);
|
||||
// data_plot2.plot(wm1s_big, "W-1 branch").line_color(blue).shape(none).line_on(true).bezier_on(false).line_width(1);
|
||||
// This wouldn't show anything useful.
|
||||
data_plot2.write("./lambert_w_graph_big_w");
|
||||
} // Big argument z Lambert W
|
||||
|
||||
{ // Lambert W0 Derivative plots
|
||||
|
||||
// std::map<const double, double> wm1ps; // Lambert W-1 prime branch values.
|
||||
std::map<const double, double> w0ps; // Lambert W0 prime branch values.
|
||||
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10);
|
||||
|
||||
int count = 0;
|
||||
for (double z = -0.36; z < 3.; z += 0.001)
|
||||
{
|
||||
double w0p = lambert_w0_prime(z);
|
||||
w0ps[z] = w0p;
|
||||
// std::cout << "z " << z << ", w0 = " << w0 << std::endl;
|
||||
count++;
|
||||
}
|
||||
std::cout << "points " << count << std::endl;
|
||||
|
||||
//count = 0;
|
||||
//for (double z = -0.36; z < -0.1; z += 0.001)
|
||||
//{
|
||||
// double wm1p = lambert_wm1_prime(z);
|
||||
// std::cout << "z " << z << ", w-1 = " << wm1p << std::endl;
|
||||
// wm1ps[z] = wm1p;
|
||||
// count++;
|
||||
//}
|
||||
//std::cout << "points " << count << std::endl;
|
||||
|
||||
svg_2d_plot data_plotp;
|
||||
data_plotp.title("Lambert W0 prime function.")
|
||||
.x_size(400)
|
||||
.y_size(300)
|
||||
.legend_on(false)
|
||||
.x_label("z")
|
||||
.y_label("W0'")
|
||||
.x_range(-0.3, +1.)
|
||||
.y_range(0., +5.)
|
||||
.x_major_interval(0.2)
|
||||
.y_major_interval(2.)
|
||||
.x_major_grid_on(true)
|
||||
.y_major_grid_on(true)
|
||||
.y_values_rotation(horizontal)
|
||||
.x_values_precision(3)
|
||||
.y_values_precision(3)
|
||||
.coord_precision(4) // Needed to avoid stepping on curves.
|
||||
.copyright_holder("Paul A. Bristow")
|
||||
.copyright_date("2018")
|
||||
;
|
||||
|
||||
// derivative of N[productlog(0, x), 55] at x=0 to 10
|
||||
// Plot[D[N[ProductLog[0, x], 55], x], {x, 0, 10}]
|
||||
// Plot[ProductLog[x]/(x + x ProductLog[x]), {x, 0, 10}]
|
||||
data_plotp.plot(w0ps, "W0 prime branch").line_color(red).shape(none).line_on(true).bezier_on(false).line_width(1);
|
||||
data_plotp.write("./lambert_w0_prime_graph");
|
||||
} // Lambert W0 Derivative plots
|
||||
|
||||
{ // Lambert Wm1 Derivative plots
|
||||
|
||||
std::map<const double, double> wm1ps; // Lambert W-1 prime branch values.
|
||||
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10);
|
||||
|
||||
int count = 0;
|
||||
for (double z = -0.3678; z < -0.00001; z += 0.001)
|
||||
{
|
||||
double wm1p = lambert_wm1_prime(z);
|
||||
// std::cout << "z " << z << ", w-1 = " << wm1p << std::endl;
|
||||
wm1ps[z] = wm1p;
|
||||
count++;
|
||||
}
|
||||
std::cout << "Lambert W-1 prime points = " << count << std::endl;
|
||||
|
||||
svg_2d_plot data_plotp;
|
||||
data_plotp.title("Lambert W-1 prime function.")
|
||||
.x_size(400)
|
||||
.y_size(300)
|
||||
.legend_on(false)
|
||||
.x_label("z")
|
||||
.y_label("W-1'")
|
||||
.x_range(-0.4, +0.01)
|
||||
.x_major_interval(0.1)
|
||||
.y_range(-20., -5.)
|
||||
.y_major_interval(5.)
|
||||
.x_major_grid_on(true)
|
||||
.y_major_grid_on(true)
|
||||
.y_values_rotation(horizontal)
|
||||
.x_values_precision(3)
|
||||
.y_values_precision(3)
|
||||
.coord_precision(4) // Needed to avoid stepping on curves.
|
||||
.copyright_holder("Paul A. Bristow")
|
||||
.copyright_date("2018")
|
||||
;
|
||||
|
||||
// derivative of N[productlog(0, x), 55] at x=0 to 10
|
||||
// Plot[D[N[ProductLog[0, x], 55], x], {x, 0, 10}]
|
||||
// Plot[ProductLog[x]/(x + x ProductLog[x]), {x, 0, 10}]
|
||||
data_plotp.plot(wm1ps, "W-1 prime branch").line_color(blue).shape(none).line_on(true).bezier_on(false).line_width(1);
|
||||
data_plotp.write("./lambert_wm1_prime_graph");
|
||||
} // Lambert W-1 prime graph
|
||||
} // try
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
} // int main()
|
||||
|
||||
/*
|
||||
|
||||
//[lambert_w_graph_1_output
|
||||
|
||||
//] [/lambert_w_graph_1_output]
|
||||
*/
|
||||
269
example/lambert_w_precision_example.cpp
Normal file
@@ -0,0 +1,269 @@
|
||||
// Copyright Paul A. Bristow 2016, 2018.
|
||||
|
||||
// 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).
|
||||
|
||||
//! Lambert W examples of controlling precision
|
||||
|
||||
// #define BOOST_MATH_INSTRUMENT_LAMBERT_W // #define only for (much) diagnostic output.
|
||||
|
||||
#include <boost/config.hpp> // for BOOST_PLATFORM, BOOST_COMPILER, BOOST_STDLIB ...
|
||||
#include <boost/version.hpp> // for BOOST_MSVC versions.
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/exception/exception.hpp> // boost::exception
|
||||
#include <boost/math/constants/constants.hpp> // For exp_minus_one == 3.67879441171442321595523770161460867e-01.
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
#include <boost/math/special_functions/next.hpp> // for float_distance.
|
||||
#include <boost/math/special_functions/relative_difference.hpp> // for relative and epsilon difference.
|
||||
|
||||
// Built-in/fundamental GCC float128 or Intel Quad 128-bit type, if available.
|
||||
#ifdef __GNUC__
|
||||
#include <boost/multiprecision/float128.hpp> // Not available for MSVC.
|
||||
// sets BOOST_MP_USE_FLOAT128 for GCC
|
||||
using boost::multiprecision::float128;
|
||||
#endif //# NOT _MSC_VER
|
||||
|
||||
#include <boost/multiprecision/cpp_dec_float.hpp> // boost::multiprecision::cpp_dec_float_50
|
||||
using boost::multiprecision::cpp_dec_float_50; // 50 decimal digits type.
|
||||
using boost::multiprecision::cpp_dec_float_100; // 100 decimal digits type.
|
||||
|
||||
#include <boost/multiprecision/cpp_bin_float.hpp>
|
||||
using boost::multiprecision::cpp_bin_float_double_extended;
|
||||
using boost::multiprecision::cpp_bin_float_double;
|
||||
using boost::multiprecision::cpp_bin_float_quad;
|
||||
// For lambert_w function.
|
||||
#include <boost/math/special_functions/lambert_w.hpp>
|
||||
// using boost::math::lambert_w0;
|
||||
// using boost::math::lambert_wm1;
|
||||
|
||||
#include <iostream>
|
||||
#include <exception>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <limits> // For std::numeric_limits.
|
||||
|
||||
int main()
|
||||
{
|
||||
try
|
||||
{
|
||||
std::cout << "Lambert W examples of precision control." << std::endl;
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10);
|
||||
std::cout << std::showpoint << std::endl; // Show any trailing zeros.
|
||||
|
||||
using boost::math::constants::exp_minus_one;
|
||||
|
||||
using boost::math::lambert_w0;
|
||||
using boost::math::lambert_wm1;
|
||||
|
||||
// Error handling policy examples.
|
||||
using namespace boost::math::policies;
|
||||
using boost::math::policies::make_policy;
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
//[lambert_w_precision_reference_w
|
||||
|
||||
using boost::multiprecision::cpp_bin_float_50;
|
||||
using boost::math::float_distance;
|
||||
|
||||
cpp_bin_float_50 z("10."); // Note use a decimal digit string, not a double 10.
|
||||
cpp_bin_float_50 r;
|
||||
std::cout.precision(std::numeric_limits<cpp_bin_float_50>::digits10);
|
||||
|
||||
r = lambert_w0(z); // Default policy.
|
||||
std::cout << "lambert_w0(z) cpp_bin_float_50 = " << r << std::endl;
|
||||
//lambert_w0(z) cpp_bin_float_50 = 1.7455280027406993830743012648753899115352881290809
|
||||
// [N[productlog[10], 50]] == 1.7455280027406993830743012648753899115352881290809
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10);
|
||||
std::cout << "lambert_w0(z) static_cast from cpp_bin_float_50 = "
|
||||
<< static_cast<double>(r) << std::endl;
|
||||
// double lambert_w0(z) static_cast from cpp_bin_float_50 = 1.7455280027406994
|
||||
// [N[productlog[10], 17]] == 1.7455280027406994
|
||||
std::cout << "bits different from Wolfram = "
|
||||
<< static_cast<int>(float_distance(static_cast<double>(r), 1.7455280027406994))
|
||||
<< std::endl; // 0
|
||||
|
||||
|
||||
//] [/lambert_w_precision_reference_w]
|
||||
|
||||
//[lambert_w_precision_0
|
||||
std::cout.precision(std::numeric_limits<float>::max_digits10); // Show all potentially significant decimal digits,
|
||||
std::cout << std::showpoint << std::endl; // and show any significant trailing zeros too.
|
||||
|
||||
float x = 10.;
|
||||
std::cout << "Lambert W (" << x << ") = " << lambert_w0(x) << std::endl;
|
||||
//] [/lambert_w_precision_0]
|
||||
|
||||
/*
|
||||
//[lambert_w_precision_output_0
|
||||
Lambert W (10.0000000) = 1.74552800
|
||||
//] [/lambert_w_precision_output_0]
|
||||
*/
|
||||
{ // Lambert W0 Halley step example
|
||||
//[lambert_w_precision_1
|
||||
using boost::math::lambert_w_detail::lambert_w_halley_step;
|
||||
using boost::math::epsilon_difference;
|
||||
using boost::math::relative_difference;
|
||||
|
||||
std::cout << std::showpoint << std::endl; // and show any significant trailing zeros too.
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10); // 17 decimal digits for double.
|
||||
|
||||
cpp_bin_float_50 z50("1.23"); // Note: use a decimal digit string, not a double 1.23!
|
||||
double z = static_cast<double>(z50);
|
||||
cpp_bin_float_50 w50;
|
||||
w50 = lambert_w0(z50);
|
||||
std::cout.precision(std::numeric_limits<cpp_bin_float_50>::max_digits10); // 50 decimal digits.
|
||||
std::cout << "Reference Lambert W (" << z << ") =\n "
|
||||
<< w50 << std::endl;
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10); // 17 decimal digits for double.
|
||||
double wr = static_cast<double>(w50);
|
||||
std::cout << "Reference Lambert W (" << z << ") = " << wr << std::endl;
|
||||
|
||||
double w = lambert_w0(z);
|
||||
std::cout << "Rat/poly Lambert W (" << z << ") = " << lambert_w0(z) << std::endl;
|
||||
// Add a Halley step to the value obtained from rational polynomial approximation.
|
||||
double ww = lambert_w_halley_step(lambert_w0(z), z);
|
||||
std::cout << "Halley Step Lambert W (" << z << ") = " << lambert_w_halley_step(lambert_w0(z), z) << std::endl;
|
||||
|
||||
std::cout << "absolute difference from Halley step = " << w - ww << std::endl;
|
||||
std::cout << "relative difference from Halley step = " << relative_difference(w, ww) << std::endl;
|
||||
std::cout << "epsilon difference from Halley step = " << epsilon_difference(w, ww) << std::endl;
|
||||
std::cout << "epsilon for float = " << std::numeric_limits<double>::epsilon() << std::endl;
|
||||
std::cout << "bits different from Halley step = " << static_cast<int>(float_distance(w, ww)) << std::endl;
|
||||
//] [/lambert_w_precision_1]
|
||||
|
||||
|
||||
/*
|
||||
//[lambert_w_precision_output_1
|
||||
Reference Lambert W (1.2299999999999999822364316059974953532218933105468750) =
|
||||
0.64520356959320237759035605255334853830173300262666480
|
||||
Reference Lambert W (1.2300000000000000) = 0.64520356959320235
|
||||
Rat/poly Lambert W (1.2300000000000000) = 0.64520356959320224
|
||||
Halley Step Lambert W (1.2300000000000000) = 0.64520356959320235
|
||||
absolute difference from Halley step = -1.1102230246251565e-16
|
||||
relative difference from Halley step = 1.7207329236029286e-16
|
||||
epsilon difference from Halley step = 0.77494921535422934
|
||||
epsilon for float = 2.2204460492503131e-16
|
||||
bits different from Halley step = 1
|
||||
//] [/lambert_w_precision_output_1]
|
||||
*/
|
||||
|
||||
} // Lambert W0 Halley step example
|
||||
|
||||
{ // Lambert W-1 Halley step example
|
||||
//[lambert_w_precision_2
|
||||
using boost::math::lambert_w_detail::lambert_w_halley_step;
|
||||
using boost::math::epsilon_difference;
|
||||
using boost::math::relative_difference;
|
||||
|
||||
std::cout << std::showpoint << std::endl; // and show any significant trailing zeros too.
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10); // 17 decimal digits for double.
|
||||
|
||||
cpp_bin_float_50 z50("-0.123"); // Note: use a decimal digit string, not a double -1.234!
|
||||
double z = static_cast<double>(z50);
|
||||
cpp_bin_float_50 wm1_50;
|
||||
wm1_50 = lambert_wm1(z50);
|
||||
std::cout.precision(std::numeric_limits<cpp_bin_float_50>::max_digits10); // 50 decimal digits.
|
||||
std::cout << "Reference Lambert W-1 (" << z << ") =\n "
|
||||
<< wm1_50 << std::endl;
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10); // 17 decimal digits for double.
|
||||
double wr = static_cast<double>(wm1_50);
|
||||
std::cout << "Reference Lambert W-1 (" << z << ") = " << wr << std::endl;
|
||||
|
||||
double w = lambert_wm1(z);
|
||||
std::cout << "Rat/poly Lambert W-1 (" << z << ") = " << lambert_wm1(z) << std::endl;
|
||||
// Add a Halley step to the value obtained from rational polynomial approximation.
|
||||
double ww = lambert_w_halley_step(lambert_wm1(z), z);
|
||||
std::cout << "Halley Step Lambert W (" << z << ") = " << lambert_w_halley_step(lambert_wm1(z), z) << std::endl;
|
||||
|
||||
std::cout << "absolute difference from Halley step = " << w - ww << std::endl;
|
||||
std::cout << "relative difference from Halley step = " << relative_difference(w, ww) << std::endl;
|
||||
std::cout << "epsilon difference from Halley step = " << epsilon_difference(w, ww) << std::endl;
|
||||
std::cout << "epsilon for float = " << std::numeric_limits<double>::epsilon() << std::endl;
|
||||
std::cout << "bits different from Halley step = " << static_cast<int>(float_distance(w, ww)) << std::endl;
|
||||
//] [/lambert_w_precision_2]
|
||||
}
|
||||
/*
|
||||
//[lambert_w_precision_output_2
|
||||
Reference Lambert W-1 (-0.12299999999999999822364316059974953532218933105468750) =
|
||||
-3.2849102557740360179084675531714935199110302996513384
|
||||
Reference Lambert W-1 (-0.12300000000000000) = -3.2849102557740362
|
||||
Rat/poly Lambert W-1 (-0.12300000000000000) = -3.2849102557740357
|
||||
Halley Step Lambert W (-0.12300000000000000) = -3.2849102557740362
|
||||
absolute difference from Halley step = 4.4408920985006262e-16
|
||||
relative difference from Halley step = 1.3519066740696092e-16
|
||||
epsilon difference from Halley step = 0.60884463935795785
|
||||
epsilon for float = 2.2204460492503131e-16
|
||||
bits different from Halley step = -1
|
||||
//] [/lambert_w_precision_output_2]
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// Similar example using cpp_bin_float_quad (128-bit floating-point types).
|
||||
|
||||
cpp_bin_float_quad zq = 10.;
|
||||
std::cout << "\nTest evaluation of cpp_bin_float_quad Lambert W(" << zq << ")"
|
||||
<< std::endl;
|
||||
std::cout << std::setprecision(3) << "std::numeric_limits<cpp_bin_float_quad>::digits = " << std::numeric_limits<cpp_bin_float_quad>::digits << std::endl;
|
||||
std::cout << std::setprecision(3) << "std::numeric_limits<cpp_bin_float_quad>::epsilon() = " << std::numeric_limits<cpp_bin_float_quad>::epsilon() << std::endl;
|
||||
std::cout << std::setprecision(3) << "std::numeric_limits<cpp_bin_float_quad>::max_digits10 = " << std::numeric_limits<cpp_bin_float_quad>::max_digits10 << std::endl;
|
||||
std::cout << std::setprecision(3) << "std::numeric_limits<cpp_bin_float_quad>::digits10 = " << std::numeric_limits<cpp_bin_float_quad>::digits10 << std::endl;
|
||||
std::cout.precision(std::numeric_limits<cpp_bin_float_quad>::max_digits10);
|
||||
// All are same precision because double precision first approximation used before Halley.
|
||||
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
{ // Reference value for lambert_w0(10)
|
||||
cpp_dec_float_50 z("10");
|
||||
cpp_dec_float_50 r;
|
||||
std::cout.precision(std::numeric_limits<cpp_dec_float_50>::digits10);
|
||||
|
||||
r = lambert_w0(z); // Default policy.
|
||||
std::cout << "lambert_w0(z) cpp_dec_float_50 = " << r << std::endl; // 0.56714329040978387299996866221035554975381578718651
|
||||
std::cout.precision(std::numeric_limits<cpp_bin_float_quad>::max_digits10);
|
||||
|
||||
std::cout << "lambert_w0(z) cpp_dec_float_50 cast to quad (max_digits10(" << std::numeric_limits<cpp_bin_float_quad>::max_digits10 <<
|
||||
" ) = " << static_cast<cpp_bin_float_quad>(r) << std::endl; // 1.7455280027406993830743012648753899115352881290809
|
||||
std::cout.precision(std::numeric_limits<cpp_bin_float_quad>::digits10); // 1.745528002740699383074301264875389837
|
||||
std::cout << "lambert_w0(z) cpp_dec_float_50 cast to quad (digits10(" << std::numeric_limits<cpp_bin_float_quad>::digits10 <<
|
||||
" ) = " << static_cast<cpp_bin_float_quad>(r) << std::endl; // 1.74552800274069938307430126487539
|
||||
std::cout.precision(std::numeric_limits<cpp_bin_float_quad>::digits10 + 1); //
|
||||
|
||||
std::cout << "lambert_w0(z) cpp_dec_float_50 cast to quad (digits10(" << std::numeric_limits<cpp_bin_float_quad>::digits10 <<
|
||||
" ) = " << static_cast<cpp_bin_float_quad>(r) << std::endl; // 1.74552800274069938307430126487539
|
||||
|
||||
// [N[productlog[10], 50]] == 1.7455280027406993830743012648753899115352881290809
|
||||
|
||||
// [N[productlog[10], 37]] == 1.745528002740699383074301264875389912
|
||||
// [N[productlog[10], 34]] == 1.745528002740699383074301264875390
|
||||
// [N[productlog[10], 33]] == 1.74552800274069938307430126487539
|
||||
|
||||
// lambert_w0(z) cpp_dec_float_50 cast to quad = 1.745528002740699383074301264875389837
|
||||
|
||||
// lambert_w0(z) cpp_dec_float_50 = 1.7455280027406993830743012648753899115352881290809
|
||||
// lambert_w0(z) cpp_dec_float_50 cast to quad = 1.745528002740699383074301264875389837
|
||||
// lambert_w0(z) cpp_dec_float_50 cast to quad = 1.74552800274069938307430126487539
|
||||
}
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
} // int main()
|
||||
|
||||
/*
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
256
example/lambert_w_simple_examples.cpp
Normal file
@@ -0,0 +1,256 @@
|
||||
// Copyright Paul A. Bristow 2016, 2017.
|
||||
|
||||
// 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).
|
||||
|
||||
// Build and run a simple examples of Lambert W function.
|
||||
|
||||
// Some macros that will show some(or much) diagnostic values if #defined.
|
||||
//#define-able macros
|
||||
//#define BOOST_MATH_INSTRUMENT_LAMBERT_W0 // W0 branch diagnostics.
|
||||
//#define BOOST_MATH_INSTRUMENT_LAMBERT_Wm1 // W1 branch diagnostics.
|
||||
//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_HALLEY // Halley refinement diagnostics.
|
||||
//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_SCHROEDER // Schroeder refinement diagnostics.
|
||||
//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_TERMS // Number of terms used for near-singularity series.
|
||||
//#define BOOST_MATH_INSTRUMENT_LAMBERT_W0_NOT_BUILTIN // higher than built-in precision types approximation and refinement.
|
||||
//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_SINGULARITY_SERIES // Show evaluation of series near branch singularity.
|
||||
//#define BOOST_MATH_INSTRUMENT_LAMBERT_W_SMALL_Z_SERIES_ITERATIONS // Show evaluation of series for small z.
|
||||
//#define BOOST_MATH_INSTRUMENT_LAMBERT_W0_LOOKUP // Show results from lookup table.
|
||||
|
||||
#include <boost/config.hpp> // for BOOST_PLATFORM, BOOST_COMPILER, BOOST_STDLIB ...
|
||||
#include <boost/version.hpp> // for BOOST_MSVC versions.
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/exception/exception.hpp> // boost::exception
|
||||
#include <boost/math/constants/constants.hpp> // For exp_minus_one == 3.67879441171442321595523770161460867e-01.
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
|
||||
#include <boost/multiprecision/cpp_dec_float.hpp> // boost::multiprecision::cpp_dec_float_50
|
||||
using boost::multiprecision::cpp_dec_float_50; // 50 decimal digits type.
|
||||
using boost::multiprecision::cpp_dec_float_100; // 100 decimal digits type.
|
||||
using boost::multiprecision::backends::cpp_dec_float;
|
||||
using boost::multiprecision::number;
|
||||
typedef number<cpp_dec_float<1000> > cpp_dec_float_1000; // 1000 decimal digit types
|
||||
|
||||
#include <boost/multiprecision/cpp_bin_float.hpp>
|
||||
using boost::multiprecision::cpp_bin_float_double; // == double
|
||||
using boost::multiprecision::cpp_bin_float_double_extended; // 80-bit long double emulation.
|
||||
using boost::multiprecision::cpp_bin_float_quad; // 128-bit quad precision.
|
||||
|
||||
//[lambert_w_simple_examples_includes
|
||||
#include <boost/math/special_functions/lambert_w.hpp> // For lambert_w function.
|
||||
|
||||
using boost::math::lambert_w0;
|
||||
using boost::math::lambert_wm1;
|
||||
//] //[/lambert_w_simple_examples_includes]
|
||||
|
||||
#include <iostream>
|
||||
// using std::cout;
|
||||
// using std::endl;
|
||||
#include <exception>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <limits> // For std::numeric_limits.
|
||||
|
||||
//! Show value of z to the full possibly-significant max_digits10 precision of type T.
|
||||
template<typename T>
|
||||
void show_value(T z)
|
||||
{
|
||||
std::streamsize precision = std::cout.precision(std::numeric_limits<T>::max_digits10); // Save.
|
||||
std::cout.precision(std::numeric_limits<T>::max_digits10); // Show all posssibly significant digits.
|
||||
std::ios::fmtflags flags(std::cout.flags());
|
||||
std::cout.setf(std::ios_base::showpoint); // Include any trailing zeros.
|
||||
std::cout << z;
|
||||
// Restore:
|
||||
std::cout.precision(precision);
|
||||
std::cout.flags(flags);
|
||||
} // template<typename T> void show_value(T z)
|
||||
|
||||
int main()
|
||||
{
|
||||
try
|
||||
{
|
||||
std::cout << "Lambert W simple examples." << std::endl;
|
||||
|
||||
using boost::math::constants::exp_minus_one; //-1/e, the branch point, a singularity ~= -0.367879.
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
{
|
||||
//[lambert_w_simple_examples_0
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10);
|
||||
// Show all potentially significant decimal digits,
|
||||
std::cout << std::showpoint << std::endl;
|
||||
// and show significant trailing zeros too.
|
||||
|
||||
double z = 10.;
|
||||
double r = lambert_w0(z); // Default policy for double.
|
||||
std::cout << "lambert_w0(z) = " << r << std::endl;
|
||||
// lambert_w0(z) = 1.7455280027406994
|
||||
//] [/lambert_w_simple_examples_0]
|
||||
}
|
||||
{
|
||||
// Other floating-point types can be used too, here float.
|
||||
// It is convenient to use a function like `show_value`
|
||||
// to display all potentially significant decimal digits
|
||||
// for the type, including any significant trailing zeros.
|
||||
//[lambert_w_simple_examples_1
|
||||
float z = 10.F;
|
||||
float r;
|
||||
r = lambert_w0(z); // Default policy digits10 = 7, digits2 = 24
|
||||
std::cout << "lambert_w0(";
|
||||
show_value(z);
|
||||
std::cout << ") = ";
|
||||
show_value(r);
|
||||
std::cout << std::endl; // lambert_w0(10.0000000) = 1.74552798
|
||||
//] //[/lambert_w_simple_examples_1]
|
||||
}
|
||||
{
|
||||
// Example of an integer argument to lambert_w,
|
||||
// showing that an integer is correctly promoted to a double.
|
||||
//[lambert_w_simple_examples_2
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10);
|
||||
double r = lambert_w0(10); // Pass an int argument "10" that should be promoted to double argument.
|
||||
std::cout << "lambert_w0(10) = " << r << std::endl; // lambert_w0(10) = 1.7455280027406994
|
||||
double rp = lambert_w0(10);
|
||||
std::cout << "lambert_w0(10) = " << rp << std::endl;
|
||||
// lambert_w0(10) = 1.7455280027406994
|
||||
auto rr = lambert_w0(10); // C++11 needed.
|
||||
std::cout << "lambert_w0(10) = " << rr << std::endl;
|
||||
// lambert_w0(10) = 1.7455280027406994 too, showing that rr has been promoted to double.
|
||||
//] //[/lambert_w_simple_examples_2]
|
||||
}
|
||||
{
|
||||
// Using multiprecision types to get much higher precision is painless.
|
||||
//[lambert_w_simple_examples_3
|
||||
cpp_dec_float_50 z("10");
|
||||
// Note construction using a decimal digit string "10",
|
||||
// NOT a floating-point double literal 10.
|
||||
cpp_dec_float_50 r;
|
||||
r = lambert_w0(z);
|
||||
std::cout << "lambert_w0("; show_value(z); std::cout << ") = ";
|
||||
show_value(r);
|
||||
std::cout << std::endl;
|
||||
// lambert_w0(10.000000000000000000000000000000000000000000000000000000000000000000000000000000) =
|
||||
// 1.7455280027406993830743012648753899115352881290809413313533156980404446940000000
|
||||
//] //[/lambert_w_simple_examples_3]
|
||||
}
|
||||
// Using multiprecision types to get multiprecision precision wrong!
|
||||
{
|
||||
//[lambert_w_simple_examples_4
|
||||
cpp_dec_float_50 z(0.7777777777777777777777777777777777777777777777777777777777777777777777777);
|
||||
// Compiler evaluates the nearest double-precision binary representation,
|
||||
// from the max_digits10 of the floating_point literal double 0.7777777777777777777777777777...,
|
||||
// so any extra digits in the multiprecision type
|
||||
// beyond max_digits10 (usually 17) are random and meaningless.
|
||||
cpp_dec_float_50 r;
|
||||
r = lambert_w0(z);
|
||||
std::cout << "lambert_w0(";
|
||||
show_value(z);
|
||||
std::cout << ") = "; show_value(r);
|
||||
std::cout << std::endl;
|
||||
// lambert_w0(0.77777777777777779011358916250173933804035186767578125000000000000000000000000000)
|
||||
// = 0.48086152073210493501934682309060873341910109230469724725005039758139532631901386
|
||||
//] //[/lambert_w_simple_examples_4]
|
||||
}
|
||||
{
|
||||
//[lambert_w_simple_examples_4a
|
||||
cpp_dec_float_50 z(0.9); // Construct from floating_point literal double 0.9.
|
||||
cpp_dec_float_50 r;
|
||||
r = lambert_w0(0.9);
|
||||
std::cout << "lambert_w0(";
|
||||
show_value(z);
|
||||
std::cout << ") = "; show_value(r);
|
||||
std::cout << std::endl;
|
||||
// lambert_w0(0.90000000000000002220446049250313080847263336181640625000000000000000000000000000)
|
||||
// = 0.52983296563343440510607251781038939952850341796875000000000000000000000000000000
|
||||
std::cout << "lambert_w0(0.9) = " << lambert_w0(static_cast<double>(0.9))
|
||||
// lambert_w0(0.9)
|
||||
// = 0.52983296563343441
|
||||
<< std::endl;
|
||||
//] //[/lambert_w_simple_examples_4a]
|
||||
}
|
||||
{
|
||||
// Using multiprecision types to get multiprecision precision right!
|
||||
//[lambert_w_simple_examples_4b
|
||||
cpp_dec_float_50 z("0.9"); // Construct from decimal digit string.
|
||||
cpp_dec_float_50 r;
|
||||
r = lambert_w0(z);
|
||||
std::cout << "lambert_w0(";
|
||||
show_value(z);
|
||||
std::cout << ") = "; show_value(r);
|
||||
std::cout << std::endl;
|
||||
// 0.90000000000000000000000000000000000000000000000000000000000000000000000000000000)
|
||||
// = 0.52983296563343441213336643954546304857788132269804249284012528304239956413801252
|
||||
//] //[/lambert_w_simple_examples_4b]
|
||||
}
|
||||
// Getting extreme precision (1000 decimal digits) Lambert W values.
|
||||
{
|
||||
std::cout.precision(std::numeric_limits<cpp_dec_float_1000>::digits10);
|
||||
cpp_dec_float_1000 z("2.0");
|
||||
cpp_dec_float_1000 r;
|
||||
r = lambert_w0(z);
|
||||
std::cout << "lambert_w0(z) = " << r << std::endl;
|
||||
// 0.8526055020137254913464724146953174668984533001514035087721073946525150656742630448965773783502494847334503972691804119834761668851953598826198984364998343940330324849743119327028383008883133161249045727544669202220292076639777316648311871183719040610274221013237163543451621208284315007250267190731048119566857455987975973474411544571619699938899354169616378479326962044241495398851839432070255805880208619490399218130868317114428351234208216131218024303904457925834743326836272959669122797896855064630871955955318383064292191644322931561534814178034773896739684452724587331245831001449498844495771266728242975586931792421997636537572767708722190588748148949667744956650966402600446780664924889043543203483210769017254907808218556111831854276511280553252641907484685164978750601216344998778097446525021666473925144772131644151718261199915247932015387685261438125313159125475113124470774926288823525823567568542843625471594347837868505309329628014463491611881381186810879712667681285740515197493390563
|
||||
// Wolfram alpha command N[productlog[0, 2.0],1000] gives the identical result:
|
||||
// 0.8526055020137254913464724146953174668984533001514035087721073946525150656742630448965773783502494847334503972691804119834761668851953598826198984364998343940330324849743119327028383008883133161249045727544669202220292076639777316648311871183719040610274221013237163543451621208284315007250267190731048119566857455987975973474411544571619699938899354169616378479326962044241495398851839432070255805880208619490399218130868317114428351234208216131218024303904457925834743326836272959669122797896855064630871955955318383064292191644322931561534814178034773896739684452724587331245831001449498844495771266728242975586931792421997636537572767708722190588748148949667744956650966402600446780664924889043543203483210769017254907808218556111831854276511280553252641907484685164978750601216344998778097446525021666473925144772131644151718261199915247932015387685261438125313159125475113124470774926288823525823567568542843625471594347837868505309329628014463491611881381186810879712667681285740515197493390563
|
||||
}
|
||||
{
|
||||
//[lambert_w_simple_examples_error_policies
|
||||
// Define an error handling policy:
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error> // possibly unwise?
|
||||
> my_throw_policy;
|
||||
|
||||
std::cout.precision(std::numeric_limits<double>::max_digits10);
|
||||
// Show all potentially significant decimal digits,
|
||||
std::cout << std::showpoint << std::endl;
|
||||
// and show significant trailing zeros too.
|
||||
double z = +1;
|
||||
std::cout << "Lambert W (" << z << ") = " << lambert_w0(z) << std::endl;
|
||||
// Lambert W (1.0000000000000000) = 0.56714329040978384
|
||||
std::cout << "\nLambert W (" << z << ", my_throw_policy()) = "
|
||||
<< lambert_w0(z, my_throw_policy()) << std::endl;
|
||||
// Lambert W (1.0000000000000000, my_throw_policy()) = 0.56714329040978384
|
||||
//] //[/lambert_w_simple_example_error_policies]
|
||||
}
|
||||
{
|
||||
// Show error reporting from passing a value to lambert_wm1 that is out of range,
|
||||
// (and probably was meant to be passed to lambert_0 instead).
|
||||
//[lambert_w_simple_examples_out_of_range
|
||||
double z = +1.;
|
||||
double r = lambert_wm1(z);
|
||||
std::cout << "lambert_wm1(+1.) = " << r << std::endl;
|
||||
//] [/lambert_w_simple_examples_out_of_range]
|
||||
// Error in function boost::math::lambert_wm1<RealType>(<RealType>):
|
||||
// Argument z = 1 is out of range (z <= 0) for Lambert W-1 branch! (Try Lambert W0 branch?)
|
||||
}
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
} // int main()
|
||||
|
||||
/*
|
||||
|
||||
Output:
|
||||
//[lambert_w_simple_examples_error_message_1
|
||||
Error in function boost::math::lambert_wm1<RealType>(<RealType>):
|
||||
Argument z = 1 is out of range (z <= 0) for Lambert W-1 branch! (Try Lambert W0 branch?)
|
||||
//] [/lambert_w_simple_examples_error_message_1]
|
||||
|
||||
/*
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
@@ -296,6 +296,15 @@ inline T constant_three_quarters<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_S
|
||||
return static_cast<T>(3) / static_cast<T>(4);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
template<int N>
|
||||
inline T constant_sixth<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
|
||||
{
|
||||
BOOST_MATH_STD_USING
|
||||
return static_cast<T>(1) / static_cast<T>(6);
|
||||
}
|
||||
|
||||
// Pi and related constants.
|
||||
template <class T>
|
||||
template<int N>
|
||||
inline T constant_pi_minus_three<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
|
||||
@@ -326,7 +335,14 @@ inline T constant_exp_minus_half<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_S
|
||||
return exp(static_cast<T>(-0.5));
|
||||
}
|
||||
|
||||
// Pi
|
||||
template <class T>
|
||||
template<int N>
|
||||
inline T constant_exp_minus_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
|
||||
{
|
||||
BOOST_MATH_STD_USING
|
||||
return exp(static_cast<T>(-1.));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
template<int N>
|
||||
inline T constant_one_div_root_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
|
||||
@@ -356,7 +372,6 @@ inline T constant_root_one_div_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_
|
||||
return sqrt(static_cast<T>(1) / pi<T, policies::policy<policies::digits2<N> > >());
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
template<int N>
|
||||
inline T constant_four_thirds_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpl::int_<N>))
|
||||
|
||||
@@ -65,8 +65,7 @@ namespace boost{ namespace math
|
||||
struct dummy_size{};
|
||||
|
||||
//
|
||||
// Max number of binary digits in the string representations
|
||||
// of our constants:
|
||||
// Max number of binary digits in the string representations of our constants:
|
||||
//
|
||||
BOOST_STATIC_CONSTANT(int, max_string_digits = (101 * 1000L) / 301L);
|
||||
|
||||
@@ -266,7 +265,7 @@ namespace boost{ namespace math
|
||||
BOOST_DEFINE_MATH_CONSTANT(third, 3.333333333333333333333333333333333333e-01, "3.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333e-01")
|
||||
BOOST_DEFINE_MATH_CONSTANT(twothirds, 6.666666666666666666666666666666666666e-01, "6.66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-01")
|
||||
BOOST_DEFINE_MATH_CONSTANT(two_thirds, 6.666666666666666666666666666666666666e-01, "6.66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-01")
|
||||
BOOST_DEFINE_MATH_CONSTANT(sixth, 1.66666666666666666666666666666666666666666e-01, "1.66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-01")
|
||||
BOOST_DEFINE_MATH_CONSTANT(sixth, 1.666666666666666666666666666666666666e-01, "1.66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667e-01");
|
||||
BOOST_DEFINE_MATH_CONSTANT(three_quarters, 7.500000000000000000000000000000000000e-01, "7.50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-01")
|
||||
BOOST_DEFINE_MATH_CONSTANT(root_two, 1.414213562373095048801688724209698078e+00, "1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623e+00")
|
||||
BOOST_DEFINE_MATH_CONSTANT(root_three, 1.732050807568877293527446341505872366e+00, "1.73205080756887729352744634150587236694280525381038062805580697945193301690880003708114618675724857567562614142e+00")
|
||||
@@ -302,6 +301,7 @@ namespace boost{ namespace math
|
||||
BOOST_DEFINE_MATH_CONSTANT(one_div_cbrt_pi, 6.827840632552956814670208331581645981e-01, "6.82784063255295681467020833158164598108367515632448804042681583118899226433403918237673501922595519865685577274e-01")
|
||||
BOOST_DEFINE_MATH_CONSTANT(e, 2.718281828459045235360287471352662497e+00, "2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193e+00")
|
||||
BOOST_DEFINE_MATH_CONSTANT(exp_minus_half, 6.065306597126334236037995349911804534e-01, "6.06530659712633423603799534991180453441918135487186955682892158735056519413748423998647611507989456026423789794e-01")
|
||||
BOOST_DEFINE_MATH_CONSTANT(exp_minus_one, 3.678794411714423215955237701614608674e-01, "3.67879441171442321595523770161460867445811131031767834507836801697461495744899803357147274345919643746627325277e-01");
|
||||
BOOST_DEFINE_MATH_CONSTANT(e_pow_pi, 2.314069263277926900572908636794854738e+01, "2.31406926327792690057290863679485473802661062426002119934450464095243423506904527835169719970675492196759527048e+01")
|
||||
BOOST_DEFINE_MATH_CONSTANT(root_e, 1.648721270700128146848650787814163571e+00, "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663776e+00")
|
||||
BOOST_DEFINE_MATH_CONSTANT(log10_e, 4.342944819032518276511289189166050822e-01, "4.34294481903251827651128918916605082294397005803666566114453783165864649208870774729224949338431748318706106745e-01")
|
||||
@@ -344,3 +344,5 @@ namespace boost{ namespace math
|
||||
#include <boost/math/constants/calculate_constants.hpp>
|
||||
|
||||
#endif // BOOST_MATH_CONSTANTS_CONSTANTS_INCLUDED
|
||||
|
||||
|
||||
|
||||
@@ -182,7 +182,7 @@
|
||||
#define BOOST_CSTDFLOAT_FLOAT128_ATANH atanhq_patch
|
||||
#define BOOST_CSTDFLOAT_FLOAT128_TGAMMA tgammaq_patch
|
||||
#endif // BOOST_CSTDFLOAT_BROKEN_FLOAT128_MATH_FUNCTIONS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Implement quadruple-precision <cmath> functions in the namespace
|
||||
// boost::math::cstdfloat::detail. Subsequently inject these into the
|
||||
@@ -536,9 +536,11 @@
|
||||
using boost::math::cstdfloat::detail::ldexp;
|
||||
using boost::math::cstdfloat::detail::frexp;
|
||||
using boost::math::cstdfloat::detail::fabs;
|
||||
|
||||
#if !(defined(_GLIBCXX_USE_FLOAT128) && defined(__GNUC__) && (__GNUC__ >= 7))
|
||||
using boost::math::cstdfloat::detail::abs;
|
||||
#endif
|
||||
|
||||
using boost::math::cstdfloat::detail::floor;
|
||||
using boost::math::cstdfloat::detail::ceil;
|
||||
using boost::math::cstdfloat::detail::sqrt;
|
||||
|
||||
@@ -70,5 +70,6 @@
|
||||
#include <boost/math/special_functions/hankel.hpp>
|
||||
#include <boost/math/special_functions/ulp.hpp>
|
||||
#include <boost/math/special_functions/relative_difference.hpp>
|
||||
#include <boost/math/special_functions/lambert_w.hpp>
|
||||
|
||||
#endif // BOOST_MATH_SPECIAL_FUNCTIONS_HPP
|
||||
|
||||
2176
include/boost/math/special_functions/lambert_w.hpp
Normal file
134
include/boost/math/special_functions/lambert_w_lookup_table.ipp
Normal file
@@ -0,0 +1,134 @@
|
||||
// Copyright Paul A. Bristow 2017.
|
||||
// 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)
|
||||
|
||||
// I:/modular-boost/libs/math/include/boost/math/special_functions/lambert_w_lookup_table.ipp
|
||||
|
||||
// A collection of 128-bit precision integral z argument Lambert W values computed using 37 decimal digits precision.
|
||||
// C++ floating-point precision is 128-bit long double.
|
||||
// Output as 53 decimal digits, suffixed L.
|
||||
|
||||
// C++ floating-point type is provided by lambert_w.hpp typedef.
|
||||
// For example: typedef lookup_t double; (or float or long double)
|
||||
|
||||
// Written by I:\modular-boost\libs\math\test\lambert_w_lookup_table_generator.cpp Thu Jan 25 16:52:07 2018
|
||||
|
||||
// Sizes of arrays of z values for Lambert W[0], W[1] ... W[64]" and W[-1], W[-2] ... W[-64].
|
||||
|
||||
namespace boost {
|
||||
namespace math {
|
||||
namespace lambert_w_detail {
|
||||
namespace lambert_w_lookup
|
||||
{
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_sqrts = 12;
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_halves = 12;
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_w0es = 65;
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_w0zs = 65;
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_wm1es = 64;
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_wm1zs = 64;
|
||||
|
||||
BOOST_STATIC_CONSTEXPR lookup_t halves[noof_halves] =
|
||||
{ // Common to Lambert W0 and W-1 (and exactly representable).
|
||||
0.5L, 0.25L, 0.125L, 0.0625L, 0.03125L, 0.015625L, 0.0078125L, 0.00390625L, 0.001953125L, 0.0009765625L, 0.00048828125L, 0.000244140625L
|
||||
}; // halves, 0.5, 0.25, ... 0.000244140625, common to W0 and W-1.
|
||||
|
||||
BOOST_STATIC_CONSTEXPR lookup_t sqrtw0s[noof_sqrts] =
|
||||
{ // For Lambert W0 only.
|
||||
0.6065306597126334242631173765403218567L, 0.77880078307140486866846070009071995L, 0.882496902584595403104717592968701829L, 0.9394130628134757862473572557999761753L, 0.9692332344763440819139583751755278177L, 0.9844964370054084060204319075254540376L, 0.9922179382602435121227899136829802692L, 0.996101369470117490071323985506950379L, 0.9980487811074754727142805899944244847L, 0.9990239141819756622368328253791383317L, 0.9995118379398893653889967919448497792L, 0.9997558891748972165136242351259789505L
|
||||
}; // sqrtw0s
|
||||
|
||||
BOOST_STATIC_CONSTEXPR lookup_t sqrtwm1s[noof_sqrts] =
|
||||
{ // For Lambert W-1 only.
|
||||
1.648721270700128146848650787814163572L, 1.284025416687741484073420568062436458L, 1.133148453066826316829007227811793873L, 1.064494458917859429563390594642889673L, 1.031743407499102670938747815281507144L, 1.015747708586685747458535072082351749L, 1.007843097206447977693453559760123579L, 1.003913889338347573443609603903460282L, 1.001955033591002812046518898047477216L, 1.000977039492416535242845292611606506L, 1.000488400478694473126173623807163354L, 1.000244170429747854937005233924135774L
|
||||
}; // sqrtwm1s
|
||||
|
||||
BOOST_STATIC_CONSTEXPR lookup_t w0es[noof_w0zs] =
|
||||
{ // Fukushima e powers array e[0] = 2.718, 1., e[2] = e^-1 = 0.135, e[3] = e^-2 = 0.133 ... e[64] = 4.3596100000630809736231248158884615452e-28.
|
||||
2.7182818284590452353602874713526624978e+00L,
|
||||
1.0000000000000000000000000000000000000e+00L, 3.6787944117144232159552377016146086745e-01L, 1.3533528323661269189399949497248440341e-01L, 4.9787068367863942979342415650061776632e-02L,
|
||||
1.8315638888734180293718021273241242212e-02L, 6.7379469990854670966360484231484242488e-03L, 2.4787521766663584230451674308166678915e-03L, 9.1188196555451620800313608440928262647e-04L,
|
||||
3.3546262790251183882138912578086101931e-04L, 1.2340980408667954949763669073003382607e-04L, 4.5399929762484851535591515560550610238e-05L, 1.6701700790245659312635517360580879078e-05L,
|
||||
6.1442123533282097586823081788055323112e-06L, 2.2603294069810543257852772905386894694e-06L, 8.3152871910356788406398514256526229461e-07L, 3.0590232050182578837147949770228963937e-07L,
|
||||
1.1253517471925911451377517906012719164e-07L, 4.1399377187851666596510277189552806229e-08L, 1.5229979744712628436136629233517431862e-08L, 5.6027964375372675400129828162064630798e-09L,
|
||||
2.0611536224385578279659403801558209764e-09L, 7.5825604279119067279417432412681264430e-10L, 2.7894680928689248077189130306442932077e-10L, 1.0261879631701890303927527840612497760e-10L,
|
||||
3.7751345442790977516449695475234067792e-11L, 1.3887943864964020594661763746086856910e-11L, 5.1090890280633247198744001934792157666e-12L, 1.8795288165390832947582704184221926212e-12L,
|
||||
6.9144001069402030094125846587414092712e-13L, 2.5436656473769229103033856148576816666e-13L, 9.3576229688401746049158322233787067450e-14L, 3.4424771084699764583923893328515572846e-14L,
|
||||
1.2664165549094175723120904155965096382e-14L, 4.6588861451033973641842455436101684114e-15L, 1.7139084315420129663027203425760492412e-15L, 6.3051167601469893856390211922465427614e-16L,
|
||||
2.3195228302435693883122636097380800411e-16L, 8.5330476257440657942780498229412441658e-17L, 3.1391327920480296287089646522319196491e-17L, 1.1548224173015785986262442063323868655e-17L,
|
||||
4.2483542552915889953292347828586580179e-18L, 1.5628821893349887680908829951058341550e-18L, 5.7495222642935598066643808805734234249e-19L, 2.1151310375910804866314010070226514702e-19L,
|
||||
7.7811322411337965157133167292798981918e-20L, 2.8625185805493936444701216291839372068e-20L, 1.0530617357553812378763324449428108806e-20L, 3.8739976286871871129314774972691278293e-21L,
|
||||
1.4251640827409351062853210280340602263e-21L, 5.2428856633634639371718053028323436716e-22L, 1.9287498479639177830173428165270125748e-22L, 7.0954741622847041389832693878080734877e-23L,
|
||||
2.6102790696677048047026953153318648093e-23L, 9.6026800545086760302307696700074909076e-24L, 3.5326285722008070297353928101772088374e-24L, 1.2995814250075030736007134060714855303e-24L,
|
||||
4.7808928838854690812771770423179628939e-25L, 1.7587922024243116489558751288034363178e-25L, 6.4702349256454603261540395529264893765e-26L, 2.3802664086944006058943245888024963309e-26L,
|
||||
8.7565107626965203384887328007391660366e-27L, 3.2213402859925160890012477758489437534e-27L, 1.1850648642339810062850307390972809891e-27L, 4.3596100000630809736231248158884596428e-28L,
|
||||
|
||||
}; // w0es
|
||||
|
||||
BOOST_STATIC_CONSTEXPR lookup_t w0zs[noof_w0zs] =
|
||||
{ // z values for W[0], W[1], W[2] ... W[64] (Fukushima array Fk).
|
||||
0.0000000000000000000000000000000000000e+00L,
|
||||
2.7182818284590452353602874713526624978e+00L, 1.4778112197861300454460854921150015626e+01L, 6.0256610769563003222785588963745153691e+01L, 2.1839260013257695631244104481144351361e+02L,
|
||||
7.4206579551288301710557790020276139812e+02L, 2.4205727609564107356503230832603296776e+03L, 7.6764321089992101948460416680168500271e+03L, 2.3847663896333826197948736795623109390e+04L,
|
||||
7.2927755348178456069389970204894839685e+04L, 2.2026465794806716516957900645284244366e+05L, 6.5861555886717600300859134371483559776e+05L, 1.9530574970280470496960624587818413980e+06L,
|
||||
5.7513740961159665432393360873381476632e+06L, 1.6836459978306874888489314790750032292e+07L, 4.9035260587081659589527825691375819733e+07L, 1.4217776832812596218820837985250320561e+08L,
|
||||
4.1063419681078006965118239806655900596e+08L, 1.1818794444719492004981570586630806042e+09L, 3.3911637183005579560532906419857313738e+09L, 9.7033039081958055593821366108308111737e+09L,
|
||||
2.7695130424147508641409976558651358487e+10L, 7.8868082614895014356985518811525255163e+10L, 2.2413047926372475980079655175092843139e+11L, 6.3573893111624333505933989166748517618e+11L,
|
||||
1.8001224834346468131040337866531539479e+12L, 5.0889698451498078710141863447784789126e+12L, 1.4365302496248562650461177217211790925e+13L, 4.0495197800161304862957327843914007993e+13L,
|
||||
1.1400869461717722015726999684446230289e+14L, 3.2059423744573386440971405952224204950e+14L, 9.0051433962267018216365614546207459567e+14L, 2.5268147258457822451512967243234631750e+15L,
|
||||
7.0832381329352301326018261305316090522e+15L, 1.9837699245933465967698692976753294646e+16L, 5.5510470830970075484537561902113104381e+16L, 1.5520433569614702817608320254284931407e+17L,
|
||||
4.3360826779369661842459877227403719730e+17L, 1.2105254067703227363724895246493485480e+18L, 3.3771426165357561311906703760513324357e+18L, 9.4154106734807994163159964299613921804e+18L,
|
||||
2.6233583234732252918129199544138403574e+19L, 7.3049547543861043990576614751671879498e+19L, 2.0329709713386190214340167519800405595e+20L, 5.6547040503180956413560918381429636734e+20L,
|
||||
1.5720421975868292906615658755032744790e+21L, 4.3682149334771264822761478593874428627e+21L, 1.2132170565093316762294432610117848880e+22L, 3.3680332378068632345542636794533635462e+22L,
|
||||
9.3459982052259884835729892206738573922e+22L, 2.5923527642935362320437266614667426924e+23L, 7.1876803203773878618909930893087860822e+23L, 1.9921241603726199616378561653688236827e+24L,
|
||||
5.5192924995054165325072406547517121131e+24L, 1.5286067837683347062387143159276002521e+25L, 4.2321318958281094260005100745711666956e+25L, 1.1713293177672778461879598480402173158e+26L,
|
||||
3.2408603996214813669049988277609543829e+26L, 8.9641258264226027960478448084812796397e+26L, 2.4787141382364034104243901241243054434e+27L, 6.8520443388941057019777430988685937812e+27L,
|
||||
1.8936217407781711443114787060753312270e+28L, 5.2317811346197017832254642778313331353e+28L, 1.4450833904658542238325922893692265683e+29L, 3.9904954117194348050619127737142206367e+29L
|
||||
|
||||
}; // w0zs
|
||||
|
||||
BOOST_STATIC_CONSTEXPR lookup_t wm1es[noof_wm1es] =
|
||||
{ // Fukushima e array e[0] = e^1 = 2.718, e[1] = e^2 = 7.39 ... e[64] = 4.60718e+28.
|
||||
2.7182818284590452353602874713526624978e+00L,
|
||||
7.3890560989306502272304274605750078132e+00L, 2.0085536923187667740928529654581717897e+01L, 5.4598150033144239078110261202860878403e+01L, 1.4841315910257660342111558004055227962e+02L,
|
||||
4.0342879349273512260838718054338827961e+02L, 1.0966331584284585992637202382881214324e+03L, 2.9809579870417282747435920994528886738e+03L, 8.1030839275753840077099966894327599650e+03L,
|
||||
2.2026465794806716516957900645284244366e+04L, 5.9874141715197818455326485792257781614e+04L, 1.6275479141900392080800520489848678317e+05L, 4.4241339200892050332610277594908828178e+05L,
|
||||
1.2026042841647767777492367707678594494e+06L, 3.2690173724721106393018550460917213155e+06L, 8.8861105205078726367630237407814503508e+06L, 2.4154952753575298214775435180385823880e+07L,
|
||||
6.5659969137330511138786503259060033569e+07L, 1.7848230096318726084491003378872270388e+08L, 4.8516519540979027796910683054154055868e+08L, 1.3188157344832146972099988837453027851e+09L,
|
||||
3.5849128461315915616811599459784206892e+09L, 9.7448034462489026000346326848229752776e+09L, 2.6489122129843472294139162152811882341e+10L, 7.2004899337385872524161351466126157915e+10L,
|
||||
1.9572960942883876426977639787609534279e+11L, 5.3204824060179861668374730434117744166e+11L, 1.4462570642914751736770474229969288569e+12L, 3.9313342971440420743886205808435276858e+12L,
|
||||
1.0686474581524462146990468650741401650e+13L, 2.9048849665247425231085682111679825667e+13L, 7.8962960182680695160978022635108224220e+13L, 2.1464357978591606462429776153126088037e+14L,
|
||||
5.8346174252745488140290273461039101900e+14L, 1.5860134523134307281296446257746601252e+15L, 4.3112315471151952271134222928569253908e+15L, 1.1719142372802611308772939791190194522e+16L,
|
||||
3.1855931757113756220328671701298646000e+16L, 8.6593400423993746953606932719264934250e+16L, 2.3538526683701998540789991074903480451e+17L, 6.3984349353005494922266340351557081888e+17L,
|
||||
1.7392749415205010473946813036112352261e+18L, 4.7278394682293465614744575627442803708e+18L, 1.2851600114359308275809299632143099258e+19L, 3.4934271057485095348034797233406099533e+19L,
|
||||
9.4961194206024488745133649117118323102e+19L, 2.5813128861900673962328580021527338043e+20L, 7.0167359120976317386547159988611740546e+20L, 1.9073465724950996905250998409538484474e+21L,
|
||||
5.1847055285870724640874533229334853848e+21L, 1.4093490824269387964492143312370168789e+22L, 3.8310080007165768493035695487861993899e+22L, 1.0413759433029087797183472933493796440e+23L,
|
||||
2.8307533032746939004420635480140745409e+23L, 7.6947852651420171381827455901293939921e+23L, 2.0916594960129961539070711572146737782e+24L, 5.6857199993359322226403488206332533034e+24L,
|
||||
1.5455389355901039303530766911174620068e+25L, 4.2012104037905142549565934307191617684e+25L, 1.1420073898156842836629571831447656302e+26L, 3.1042979357019199087073421411071003721e+26L,
|
||||
8.4383566687414544890733294803731179601e+26L, 2.2937831594696098790993528402686136005e+27L, 6.2351490808116168829092387089284697448e+27L
|
||||
}; // wm1es
|
||||
|
||||
BOOST_STATIC_CONSTEXPR lookup_t wm1zs[noof_wm1zs] =
|
||||
{ // Fukushima G array of z values for integral K, (Fukushima Gk) g[0] (k = -1) = 1 ... g[64] = -1.0264389699511303e-26.
|
||||
-3.6787944117144232159552377016146086745e-01L,
|
||||
-2.7067056647322538378799898994496880682e-01L, -1.4936120510359182893802724695018532990e-01L, -7.3262555554936721174872085092964968848e-02L, -3.3689734995427335483180242115742121244e-02L,
|
||||
-1.4872513059998150538271004584900007349e-02L, -6.3831737588816134560219525908649783853e-03L, -2.6837010232200947105711130062468881545e-03L, -1.1106882367801159454787302165703044346e-03L,
|
||||
-4.5399929762484851535591515560550610238e-04L, -1.8371870869270225243899069096638966986e-04L, -7.3730548239938517104187698145666387735e-05L, -2.9384282290753706235208604777002963102e-05L,
|
||||
-1.1641402067449950376895791995913672125e-05L, -4.5885348075273868255721924655343445906e-06L, -1.8005627955081458322204028649620350662e-06L, -7.0378941219347833214067471222239770590e-07L,
|
||||
-2.7413963540482731185045932620331377352e-07L, -1.0645313231320808326024667350792279852e-07L, -4.1223072448771156559318807603116419528e-08L, -1.5923376898615004128677660806663065530e-08L,
|
||||
-6.1368298043116345769816086674174450569e-09L, -2.3602323152914347699033314033408744848e-09L, -9.0603229062698346039479269140561762700e-10L, -3.4719859662410051486654409365217142276e-10L,
|
||||
-1.3283631472964644271673440503045960993e-10L, -5.0747278046555248958473301297399200773e-11L, -1.9360320299432568426355237044475945959e-11L, -7.3766303773930764398798182830872768331e-12L,
|
||||
-2.8072868906520523814747496670136120235e-12L, -1.0671679036256927021016406931839827582e-12L, -4.0525329757101362313986893299088308423e-13L, -1.5374324278841211301808010293913555758e-13L,
|
||||
-5.8272886672428440854292491647585674200e-14L, -2.2067908660514462849736574172862899665e-14L, -8.3502821888768497979241489950570881481e-15L, -3.1572276215253043438828784344882603413e-15L,
|
||||
-1.1928704609782512589094065678481294667e-15L, -4.5038074274761565346423524046963087756e-16L, -1.6993417021166355981316939131434632072e-16L, -6.4078169762734539491726202799339200356e-17L,
|
||||
-2.4147993510032951187990399698408378385e-17L, -9.0950634616416460925150243301974013218e-18L, -3.4236981860988704669138593608831552044e-18L, -1.2881333612472271400115547331327717431e-18L,
|
||||
-4.8440839844747536942311292467369300505e-19L, -1.8207788854829779430777944237164900798e-19L, -6.8407875971564885101695409345634890862e-20L, -2.5690139750480973292141845983878483991e-20L,
|
||||
-9.6437492398195889150867140826350628738e-21L, -3.6186918227651991108814673877821174787e-21L, -1.3573451162272064984454015639725697008e-21L, -5.0894204288895982960223079251039701810e-22L,
|
||||
-1.9076194289884357960571121174956927722e-22L, -7.1476978375412669048039237333931704166e-23L, -2.6773000149758626855152191436980592206e-23L, -1.0025115553818576399048488234179587012e-23L,
|
||||
-3.7527362568743669891693429406973638384e-24L, -1.4043571811296963574776515073934728352e-24L, -5.2539064576179122030932396804434996219e-25L, -1.9650175744554348142907611432678556896e-25L,
|
||||
-7.3474021582506822389671905824031421322e-26L, -2.7465543000397410133825686340097295749e-26L, -1.0264389699511282259046957018510946438e-26L
|
||||
}; // wm1zs
|
||||
} // namespace lambert_w_lookup
|
||||
} // namespace detail
|
||||
} // namespace math
|
||||
} // namespace boost
|
||||
1671
include/boost/math/special_functions/lambert_w_pb.hpp
Normal file
@@ -1085,6 +1085,27 @@ namespace boost
|
||||
const unsigned number_of_bernoullis_b2n,
|
||||
OutputIterator out_it);
|
||||
|
||||
// Lambert W:
|
||||
template <class T, class Policy>
|
||||
typename boost::math::tools::promote_args<T>::type lambert_w0(T z, const Policy& pol);
|
||||
template <class T>
|
||||
typename boost::math::tools::promote_args<T>::type lambert_w0(T z);
|
||||
template <class T, class Policy>
|
||||
typename boost::math::tools::promote_args<T>::type lambert_wm1(T z, const Policy& pol);
|
||||
template <class T>
|
||||
typename boost::math::tools::promote_args<T>::type lambert_wm1(T z);
|
||||
template <class T, class Policy>
|
||||
typename boost::math::tools::promote_args<T>::type lambert_w0_prime(T z, const Policy& pol);
|
||||
template <class T>
|
||||
typename boost::math::tools::promote_args<T>::type lambert_w0_prime(T z);
|
||||
template <class T, class Policy>
|
||||
typename boost::math::tools::promote_args<T>::type lambert_wm1_prime(T z, const Policy& pol);
|
||||
template <class T>
|
||||
typename boost::math::tools::promote_args<T>::type lambert_wm1_prime(T z);
|
||||
|
||||
|
||||
|
||||
|
||||
} // namespace math
|
||||
} // namespace boost
|
||||
|
||||
@@ -1643,6 +1664,12 @@ template <class OutputIterator, class T>\
|
||||
OutputIterator tangent_t2n(int start_index, unsigned number_of_bernoullis_b2n, OutputIterator out_it)\
|
||||
{ return boost::math::tangent_t2n<T>(start_index, number_of_bernoullis_b2n, out_it, Policy()); }\
|
||||
\
|
||||
template <class T> inline typename boost::math::tools::promote_args<T>::type lambert_w0(T z) { return boost::math::lambert_w0(z, Policy()); }\
|
||||
template <class T> inline typename boost::math::tools::promote_args<T>::type lambert_wm1(T z) { return boost::math::lambert_w0(z, Policy()); }\
|
||||
template <class T> inline typename boost::math::tools::promote_args<T>::type lambert_w0_prime(T z) { return boost::math::lambert_w0(z, Policy()); }\
|
||||
template <class T> inline typename boost::math::tools::promote_args<T>::type lambert_wm1_prime(T z) { return boost::math::lambert_w0(z, Policy()); }\
|
||||
\
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ inline typename tools::promote_args<T>::type trunc(const T& v)
|
||||
// implicit convertion to the integer types. For user-defined
|
||||
// number types this will likely not be the case. In that case
|
||||
// these functions should either be specialized for the UDT in
|
||||
// question, or else overloads should be placed in the same
|
||||
// question, or else overloads should be placed in the same
|
||||
// namespace as the UDT: these will then be found via argument
|
||||
// dependent lookup. See our concept archetypes for examples.
|
||||
//
|
||||
|
||||
118
include/boost/math/tools/test_value.hpp
Normal file
@@ -0,0 +1,118 @@
|
||||
// Copyright Paul A. Bristow 2017.
|
||||
// Copyright John Maddock 2017.
|
||||
|
||||
// Use, modification and distribution are subject to 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)
|
||||
|
||||
// test_value.hpp
|
||||
|
||||
#ifndef TEST_VALUE_HPP
|
||||
#define TEST_VALUE_HPP
|
||||
|
||||
// BOOST_MATH_TEST_VALUE is used to create a test value of suitable type from a decimal digit string.
|
||||
// Two parameters, both a floating-point literal double like 1.23 (not long double so no suffix L)
|
||||
// and a decimal digit string const char* like "1.23" must be provided.
|
||||
// The decimal value represented must be the same of course, with at least enough precision for long double.
|
||||
// Note there are two gotchas to this approach:
|
||||
// * You need all values to be real floating-point values
|
||||
// * and *MUST* include a decimal point (to avoid confusion with an integer literal).
|
||||
// * It's slow to compile compared to a simple literal.
|
||||
|
||||
// Speed is not an issue for a few test values,
|
||||
// but it's not generally usable in large tables
|
||||
// where you really need everything to be statically initialized.
|
||||
|
||||
// Macro BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE provides a global diagnostic value for create_type.
|
||||
|
||||
#include <boost/cstdfloat.hpp> // For float_64_t, float128_t. Must be first include!
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/type_traits/is_constructible.hpp>
|
||||
#include <boost/type_traits/is_convertible.hpp>
|
||||
|
||||
#ifdef BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE
|
||||
// global int create_type(0); must be defined before including this file.
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_HAS_FLOAT128
|
||||
typedef __float128 largest_float;
|
||||
#define BOOST_MATH_TEST_LARGEST_FLOAT_SUFFIX(x) x##Q
|
||||
#define BOOST_MATH_TEST_LARGEST_FLOAT_DIGITS 113
|
||||
#else
|
||||
typedef long double largest_float;
|
||||
#define BOOST_MATH_TEST_LARGEST_FLOAT_SUFFIX(x) x##L
|
||||
#define BOOST_MATH_TEST_LARGEST_FLOAT_DIGITS std::numeric_limits<long double>::digits
|
||||
#endif
|
||||
|
||||
template <class T, class T2>
|
||||
inline T create_test_value(largest_float val, const char*, const boost::mpl::true_&, const T2&)
|
||||
{ // Construct from long double or quad parameter val (ignoring string/const char* str).
|
||||
// (This is case for MPL parameters = true_ and T2 == false_,
|
||||
// and MPL parameters = true_ and T2 == true_ cpp_bin_float)
|
||||
// All built-in/fundamental floating-point types,
|
||||
// and other User-Defined Types that can be constructed without loss of precision
|
||||
// from long double suffix L (or quad suffix Q),
|
||||
//
|
||||
// Choose this method, even if can be constructed from a string,
|
||||
// because it will be faster, and more likely to be the closest representation.
|
||||
// (This is case for MPL parameters = mpl::true_ and T2 == mpl::true_).
|
||||
#ifdef BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE
|
||||
create_type = 1;
|
||||
#endif
|
||||
return static_cast<T>(val);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline T create_test_value(largest_float, const char* str, const boost::mpl::false_&, const boost::mpl::true_&)
|
||||
{ // Construct from decimal digit string const char* @c str (ignoring long double parameter).
|
||||
// For example, extended precision or other User-Defined types which ARE constructible from a string
|
||||
// (but not from double, or long double without loss of precision).
|
||||
// (This is case for MPL parameters = mpl::false_ and T2 == mpl::true_).
|
||||
#ifdef BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE
|
||||
create_type = 2;
|
||||
#endif
|
||||
return T(str);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline T create_test_value(largest_float, const char* str, const boost::mpl::false_&, const boost::mpl::false_&)
|
||||
{ // Create test value using from lexical cast of decimal digit string const char* str.
|
||||
// For example, extended precision or other User-Defined types which are NOT constructible from a string
|
||||
// (NOR constructible from a long double).
|
||||
// (This is case T1 = mpl::false and T2 == mpl::false).
|
||||
#ifdef BOOST_MATH_INSTRUMENT_CREATE_TEST_VALUE
|
||||
create_type = 3;
|
||||
#endif
|
||||
return boost::lexical_cast<T>(str);
|
||||
}
|
||||
|
||||
// T real type, x a decimal digits representation of a floating-point, for example: 12.34.
|
||||
// It must include a decimal point (or it would be interpreted as an integer).
|
||||
|
||||
// x is converted to a long double by appending the letter L (to suit long double fundamental type), 12.34L.
|
||||
// x is also passed as a const char* or string representation "12.34"
|
||||
// (to suit most other types that cannot be constructed from long double without possible loss).
|
||||
|
||||
// BOOST_MATH_TEST_LARGEST_FLOAT_SUFFIX(x) makes a long double or quad version, with
|
||||
// suffix a letter L (or Q) to suit long double (or quad) fundamental type, 12.34L or 12.34Q.
|
||||
// #x makes a decimal digit string version to suit multiprecision and fixed_point constructors, "12.34".
|
||||
// (Constructing from double or long double (or quad) could lose precision for multiprecision or fixed-point).
|
||||
|
||||
// The matching create_test_value function above is chosen depending on the T1 and T2 mpl bool truths.
|
||||
// The string version from #x is used if the precision of T is greater than long double.
|
||||
|
||||
// Example: long double test_value = BOOST_MATH_TEST_VALUE(double, 1.23456789);
|
||||
|
||||
#define BOOST_MATH_TEST_VALUE(T, x) create_test_value<T>(\
|
||||
BOOST_MATH_TEST_LARGEST_FLOAT_SUFFIX(x),\
|
||||
#x,\
|
||||
boost::mpl::bool_<\
|
||||
std::numeric_limits<T>::is_specialized &&\
|
||||
(std::numeric_limits<T>::radix == 2)\
|
||||
&& (std::numeric_limits<T>::digits <= BOOST_MATH_TEST_LARGEST_FLOAT_DIGITS)\
|
||||
&& boost::is_convertible<largest_float, T>::value>(),\
|
||||
boost::mpl::bool_<\
|
||||
boost::is_constructible<T, const char*>::value>()\
|
||||
)
|
||||
#endif // TEST_VALUE_HPP
|
||||
@@ -1,29 +1,29 @@
|
||||
# Copyright John Maddock 2010
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# Copyright Paul A. Bristow 2018
|
||||
# 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.
|
||||
# \math_toolkit\libs\math\test\jamfile.v2
|
||||
# Runs all math toolkit tests, functions & distributions,
|
||||
# and build math examples.
|
||||
# \math_toolkit\libs\math\minimax\jamfile.v2
|
||||
# Runs minimax using multiprecision, (rather than gmp and mpfr)
|
||||
|
||||
# bring in the rules for testing
|
||||
# bring in the rules for testing.
|
||||
import modules ;
|
||||
import path ;
|
||||
|
||||
project
|
||||
: requirements
|
||||
project
|
||||
: requirements
|
||||
<toolset>gcc:<cxxflags>-Wno-missing-braces
|
||||
<toolset>darwin:<cxxflags>-Wno-missing-braces
|
||||
<toolset>acc:<cxxflags>+W2068,2461,2236,4070,4069
|
||||
<toolset>intel-win:<cxxflags>-nologo
|
||||
<toolset>intel-win:<linkflags>-nologo
|
||||
<toolset>intel-win:<cxxflags>-nologo
|
||||
<toolset>intel-win:<linkflags>-nologo
|
||||
<toolset>msvc:<warnings>all
|
||||
<toolset>msvc:<asynch-exceptions>on
|
||||
<toolset>msvc:<cxxflags>/wd4996
|
||||
<toolset>msvc:<cxxflags>/wd4512
|
||||
<toolset>msvc:<cxxflags>/wd4610
|
||||
<toolset>msvc:<cxxflags>/wd4510
|
||||
<toolset>msvc:<cxxflags>/wd4127
|
||||
<toolset>msvc:<cxxflags>/wd4512
|
||||
<toolset>msvc:<cxxflags>/wd4610
|
||||
<toolset>msvc:<cxxflags>/wd4510
|
||||
<toolset>msvc:<cxxflags>/wd4127
|
||||
<toolset>msvc:<cxxflags>/wd4701 # needed for lexical cast - temporary.
|
||||
<link>static
|
||||
<toolset>borland:<runtime-link>static
|
||||
@@ -32,15 +32,15 @@ project
|
||||
<define>BOOST_UBLAS_UNSUPPORTED_COMPILER=0
|
||||
<include>.
|
||||
<include>../include_private
|
||||
<include>$(ntl-path)/include
|
||||
#<include>$(ntl-path)/include
|
||||
;
|
||||
|
||||
#lib mpfr : gmp : <name>mpfr ;
|
||||
|
||||
lib mpfr : gmp : <name>mpfr ;
|
||||
#lib gmp : : <name>gmp ;
|
||||
|
||||
lib gmp : : <name>gmp ;
|
||||
|
||||
exe minimax : f.cpp main.cpp gmp mpfr ;
|
||||
# exe minimax : f.cpp main.cpp gmp mpfr ;
|
||||
exe minimax : f.cpp main.cpp ;
|
||||
|
||||
install bin : minimax ;
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <boost/math/special_functions.hpp>
|
||||
#include <boost/math/special_functions/zeta.hpp>
|
||||
#include <boost/math/special_functions/expint.hpp>
|
||||
#include <boost/math/special_functions/lambert_w.hpp>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
@@ -358,6 +359,30 @@ mp_type f(const mp_type& x, int variant)
|
||||
mp_type xx = 1 / x;
|
||||
return boost::math::cyl_bessel_k(1, xx) * sqrt(xx) * exp(xx);
|
||||
}
|
||||
// Lambert W0
|
||||
case 40:
|
||||
return boost::math::lambert_w0(x);
|
||||
case 41:
|
||||
{
|
||||
if (x == 0)
|
||||
return 1;
|
||||
return boost::math::lambert_w0(x) / x;
|
||||
}
|
||||
case 42:
|
||||
{
|
||||
static const mp_type e1 = exp(mp_type(-1));
|
||||
return x / -boost::math::lambert_w0(-e1 + x);
|
||||
}
|
||||
case 43:
|
||||
{
|
||||
mp_type xx = 1 / x;
|
||||
return 1 / boost::math::lambert_w0(xx);
|
||||
}
|
||||
case 44:
|
||||
{
|
||||
mp_type ex = exp(x);
|
||||
return boost::math::lambert_w0(ex) - x;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -64,6 +64,57 @@ namespace boost {
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined(USE_CPP_BIN_FLOAT_100)
|
||||
|
||||
#include <boost/multiprecision/cpp_bin_float.hpp>
|
||||
|
||||
typedef boost::multiprecision::cpp_bin_float_100 mp_type;
|
||||
|
||||
inline void set_working_precision(int n)
|
||||
{
|
||||
}
|
||||
|
||||
inline void set_output_precision(int n)
|
||||
{
|
||||
std::cout << std::setprecision(n);
|
||||
std::cerr << std::setprecision(n);
|
||||
}
|
||||
|
||||
inline mp_type round_to_precision(mp_type m, int bits)
|
||||
{
|
||||
int i;
|
||||
mp_type f = frexp(m, &i);
|
||||
f = ldexp(f, bits);
|
||||
i -= bits;
|
||||
f = floor(f);
|
||||
return ldexp(f, i);
|
||||
}
|
||||
|
||||
inline int get_working_precision()
|
||||
{
|
||||
return std::numeric_limits<mp_type>::digits;
|
||||
}
|
||||
|
||||
namespace boost {
|
||||
namespace math {
|
||||
namespace tools {
|
||||
|
||||
template <>
|
||||
inline boost::multiprecision::cpp_bin_float_double_extended real_cast<boost::multiprecision::cpp_bin_float_double_extended, mp_type>(mp_type val)
|
||||
{
|
||||
return boost::multiprecision::cpp_bin_float_double_extended(val);
|
||||
}
|
||||
template <>
|
||||
inline boost::multiprecision::cpp_bin_float_quad real_cast<boost::multiprecision::cpp_bin_float_quad, mp_type>(mp_type val)
|
||||
{
|
||||
return boost::multiprecision::cpp_bin_float_quad(val);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#elif defined(USE_MPFR_100)
|
||||
|
||||
#include <boost/multiprecision/mpfr.hpp>
|
||||
|
||||
@@ -53,6 +53,7 @@ project
|
||||
<toolset>msvc:<cxxflags>/wd4189 # local variable is initialized but not referenced
|
||||
<toolset>msvc-7.1:<source>../vc71_fix//vc_fix
|
||||
<toolset>msvc-7.1:<pch>off
|
||||
<toolset>clang-6.0.0:<pch>off # added to see effect.
|
||||
<toolset>gcc,<target-os>windows:<pch>off
|
||||
<toolset>borland:<runtime-link>static
|
||||
# <toolset>msvc:<cxxflags>/wd4506 has no effect?
|
||||
@@ -421,6 +422,19 @@ test-suite special_fun :
|
||||
[ run test_instantiate1.cpp test_instantiate2.cpp ]
|
||||
[ run test_jacobi.cpp pch_light ../../test/build//boost_unit_test_framework ]
|
||||
[ run test_laguerre.cpp test_instances//test_instances pch_light ../../test/build//boost_unit_test_framework ]
|
||||
|
||||
[ run test_lambert_w.cpp ../../test/build//boost_unit_test_framework ]
|
||||
[ run test_lambert_w.cpp ../../test/build//boost_unit_test_framework : : : <define>BOOST_MATH_TEST_MULTIPRECISION=1 [ check-target-builds ../config//has_float128 "GCC libquadmath and __float128 support" : <define>BOOST_MATH_TEST_FLOAT128 <linkflags>"-Bstatic -lquadmath -Bdynamic" ] : test_lambert_w_multiprecision_1 ]
|
||||
[ run test_lambert_w.cpp ../../test/build//boost_unit_test_framework : : : <define>BOOST_MATH_TEST_MULTIPRECISION=2 [ check-target-builds ../config//has_float128 "GCC libquadmath and __float128 support" : <define>BOOST_MATH_TEST_FLOAT128 <linkflags>"-Bstatic -lquadmath -Bdynamic" ] : test_lambert_w_multiprecision_2 ]
|
||||
[ run test_lambert_w.cpp ../../test/build//boost_unit_test_framework : : : <define>BOOST_MATH_TEST_MULTIPRECISION=3 [ check-target-builds ../config//has_float128 "GCC libquadmath and __float128 support" : <define>BOOST_MATH_TEST_FLOAT128 <linkflags>"-Bstatic -lquadmath -Bdynamic" ] : test_lambert_w_multiprecision_3 ]
|
||||
[ run test_lambert_w.cpp ../../test/build//boost_unit_test_framework : : : <define>BOOST_MATH_TEST_MULTIPRECISION=4 <define>BOOST_MATH_TEST_FLOAT128 [ check-target-builds ../config//has_float128 "GCC libquadmath and __float128 support" : <define>BOOST_MATH_TEST_FLOAT128 <linkflags>"-Bstatic -lquadmath -Bdynamic" ] : test_lambert_w_multiprecision_4 ]
|
||||
[ run test_lambert_w_integrals_float128.cpp ../../test/build//boost_unit_test_framework : : : [ check-target-builds ../config//has_float128 "GCC libquadmath and __float128 support" : <linkflags>"-Bstatic -lquadmath -Bdynamic" : <build>no ] [ requires cxx11_auto_declarations cxx11_lambdas cxx11_smart_ptr cxx11_unified_initialization_syntax sfinae_expr ] ]
|
||||
[ run test_lambert_w_integrals_quad.cpp ../../test/build//boost_unit_test_framework : : : [ requires cxx11_auto_declarations cxx11_lambdas cxx11_smart_ptr cxx11_unified_initialization_syntax sfinae_expr ] [ check-target-builds ../config//has_float128 "GCC libquadmath and __float128 support" : <define>BOOST_MATH_TEST_FLOAT128 <linkflags>"-Bstatic -lquadmath -Bdynamic" ] ]
|
||||
[ run test_lambert_w_integrals_long_double.cpp ../../test/build//boost_unit_test_framework : : : [ requires cxx11_auto_declarations cxx11_lambdas cxx11_smart_ptr cxx11_unified_initialization_syntax sfinae_expr ] ]
|
||||
[ run test_lambert_w_integrals_double.cpp ../../test/build//boost_unit_test_framework : : : [ requires cxx11_auto_declarations cxx11_lambdas cxx11_smart_ptr cxx11_unified_initialization_syntax sfinae_expr ] ]
|
||||
[ run test_lambert_w_integrals_float.cpp ../../test/build//boost_unit_test_framework : : : [ requires cxx11_auto_declarations cxx11_lambdas cxx11_smart_ptr cxx11_unified_initialization_syntax sfinae_expr ] ]
|
||||
[ run test_lambert_w_derivative.cpp ../../test/build//boost_unit_test_framework : : : <define>BOOST_MATH_TEST_MULTIPRECISION [ check-target-builds ../config//has_float128 "GCC libquadmath and __float128 support" : <define>BOOST_MATH_TEST_FLOAT128 <linkflags>"-Bstatic -lquadmath -Bdynamic" ] ]
|
||||
|
||||
[ run test_legendre.cpp test_instances//test_instances pch_light ../../test/build//boost_unit_test_framework : : : [ check-target-builds ../config//has_float128 "GCC libquadmath and __float128 support" : <linkflags>"-Bstatic -lquadmath -Bdynamic" ] ]
|
||||
[ run chebyshev_test.cpp : : : [ check-target-builds ../config//has_float128 "GCC libquadmath and __float128 support" : <linkflags>"-Bstatic -lquadmath -Bdynamic" ] ]
|
||||
[ run chebyshev_transform_test.cpp ../config//fftw3f : : : <define>TEST1 [ requires cxx11_auto_declarations cxx11_range_based_for ] [ check-target-builds ../config//has_fftw3 "libfftw3" : : <build>no ] : chebyshev_transform_test_1 ]
|
||||
|
||||
@@ -305,6 +305,9 @@ void instantiate(RealType)
|
||||
boost::math::cyl_bessel_j_zero(v1, i, i, oi);
|
||||
boost::math::cyl_neumann_zero(v1, i);
|
||||
boost::math::cyl_neumann_zero(v1, i, i, oi);
|
||||
boost::math::lambert_w0(v1);
|
||||
boost::math::lambert_wm1(v1);
|
||||
boost::math::lambert_w0_prime(v1);
|
||||
#ifdef TEST_COMPLEX
|
||||
boost::math::cyl_hankel_1(v1, v2);
|
||||
boost::math::cyl_hankel_1(i, v2);
|
||||
@@ -506,6 +509,9 @@ void instantiate(RealType)
|
||||
boost::math::cyl_bessel_j_zero(v1 * 1, i, i, oi);
|
||||
boost::math::cyl_neumann_zero(v1 * 1, i);
|
||||
boost::math::cyl_neumann_zero(v1 * 1, i, i, oi);
|
||||
boost::math::lambert_w0(v1 * 1);
|
||||
boost::math::lambert_wm1(v1 * 1);
|
||||
boost::math::lambert_w0_prime(v1 * 1);
|
||||
#ifdef TEST_COMPLEX
|
||||
boost::math::cyl_hankel_1(v1, v2);
|
||||
boost::math::cyl_hankel_1(i, v2);
|
||||
@@ -685,6 +691,9 @@ void instantiate(RealType)
|
||||
boost::math::cyl_bessel_j_zero(v1, i, i, oi, pol);
|
||||
boost::math::cyl_neumann_zero(v1, i, pol);
|
||||
boost::math::cyl_neumann_zero(v1, i, i, oi, pol);
|
||||
boost::math::lambert_w0(v1, pol);
|
||||
boost::math::lambert_wm1(v1, pol);
|
||||
boost::math::lambert_w0_prime(v1, pol);
|
||||
#ifdef TEST_COMPLEX
|
||||
boost::math::cyl_hankel_1(v1, v2, pol);
|
||||
boost::math::cyl_hankel_1(i, v2, pol);
|
||||
@@ -886,6 +895,9 @@ void instantiate(RealType)
|
||||
test::cyl_bessel_j_zero(v1, i, i, oi);
|
||||
test::cyl_neumann_zero(v1, i);
|
||||
test::cyl_neumann_zero(v1, i, i, oi);
|
||||
test::lambert_w0(v1);
|
||||
test::lambert_wm1(v1);
|
||||
test::lambert_w0_prime(v1);
|
||||
#ifdef TEST_COMPLEX
|
||||
test::cyl_hankel_1(v1, v2);
|
||||
test::cyl_hankel_1(i, v2);
|
||||
@@ -1264,6 +1276,9 @@ void instantiate_mixed(RealType)
|
||||
boost::math::sph_neumann_prime(i, i, pol);
|
||||
boost::math::owens_t(fr, dr, pol);
|
||||
boost::math::owens_t(i, s, pol);
|
||||
boost::math::lambert_w0(i, pol);
|
||||
boost::math::lambert_wm1(i, pol);
|
||||
boost::math::lambert_w0_prime(i, pol);
|
||||
#endif
|
||||
#ifdef TEST_GROUP_8
|
||||
test::tgamma(i);
|
||||
@@ -1410,6 +1425,9 @@ void instantiate_mixed(RealType)
|
||||
test::airy_bi_prime(i);
|
||||
test::owens_t(fr, dr);
|
||||
test::owens_t(i, s);
|
||||
boost::math::lambert_w0(i);
|
||||
boost::math::lambert_wm1(i);
|
||||
boost::math::lambert_w0_prime(i);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@ struct numeric_limits<boost::math::concepts::std_real_concept>
|
||||
static boost::math::concepts::std_real_concept max NULL_MACRO() throw();
|
||||
static const int digits = 24;
|
||||
static const int digits10 = 6;
|
||||
static const int max_digits10 = 9;
|
||||
static const bool is_signed = true;
|
||||
static const bool is_integer = false;
|
||||
static const bool is_exact = false;
|
||||
@@ -86,6 +87,7 @@ struct numeric_limits<boost::math::concepts::std_real_concept>
|
||||
static boost::math::concepts::std_real_concept max NULL_MACRO() throw();
|
||||
static const int digits = 53;
|
||||
static const int digits10 = 15;
|
||||
static const int max_digits10 = 17;
|
||||
static const bool is_signed = true;
|
||||
static const bool is_integer = false;
|
||||
static const bool is_exact = false;
|
||||
@@ -124,6 +126,7 @@ struct numeric_limits<boost::math::concepts::std_real_concept>
|
||||
static boost::math::concepts::std_real_concept max NULL_MACRO() throw();
|
||||
static const int digits = 64;
|
||||
static const int digits10 = 18;
|
||||
static const int max_digits10 = 22;
|
||||
static const bool is_signed = true;
|
||||
static const bool is_integer = false;
|
||||
static const bool is_exact = false;
|
||||
@@ -162,6 +165,7 @@ struct numeric_limits<boost::math::concepts::std_real_concept>
|
||||
static boost::math::concepts::std_real_concept max NULL_MACRO() throw();
|
||||
static const int digits = 113;
|
||||
static const int digits10 = 33;
|
||||
static const int max_digits10 = 37;
|
||||
static const bool is_signed = true;
|
||||
static const bool is_integer = false;
|
||||
static const bool is_exact = false;
|
||||
|
||||
933
test/lambert_w_high_reference_values.ipp
Normal file
@@ -0,0 +1,933 @@
|
||||
|
||||
|
||||
// A collection of big Lambert W test values computed using 100 decimal digits precision.
|
||||
// C++ floating-point type is RealType.
|
||||
|
||||
// Written by I:\modular-boost\libs\math\test\lambert_w_high_reference_values.cpp Tue Oct 10 14:32:47 2017
|
||||
|
||||
// Copyright Paul A. Bristow 2017.
|
||||
// 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)
|
||||
|
||||
// Size of arrays of arguments z and Lambert W
|
||||
static const unsigned int noof_tests = 450;
|
||||
|
||||
// Declare arrays of arguments z and Lambert W(z)
|
||||
|
||||
template <typename RealType>
|
||||
static RealType zs[450];
|
||||
|
||||
template <typename RealType>
|
||||
static RealType ws[450];
|
||||
// The values are defined using the macro BOOST_MATH_TEST_VALUE to ensure
|
||||
// that both built-in and multiprecision types are correctly initialiased with full precision.
|
||||
// built-in types like float, double require a floating-point literal like 3.14,
|
||||
// but multiprecision types require a decimal digit string like "3.14".
|
||||
// Numerical values are chosen to avoid exactly representable values.
|
||||
|
||||
template <typename RealType>
|
||||
void init_zws()
|
||||
{
|
||||
zs<RealType>[0] = BOOST_MATH_TEST_VALUE(RealType, 0.5999999999999999777955395074968691915273666381835937500000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[0] = BOOST_MATH_TEST_VALUE(RealType, 0.4015636367870725840596232119093618401250821463765781307144089819032551434525179709162089487011544152);
|
||||
zs<RealType>[1] = BOOST_MATH_TEST_VALUE(RealType, 1.699999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[1] = BOOST_MATH_TEST_VALUE(RealType, 0.7796011225311008662356536916883580556792500749037209859530390902424444585607630246126725241921761054);
|
||||
zs<RealType>[2] = BOOST_MATH_TEST_VALUE(RealType, 2.199999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[2] = BOOST_MATH_TEST_VALUE(RealType, 0.8970741340486472832529094012483877796469756302241005331449133504770916140694317158875490176641388180);
|
||||
zs<RealType>[3] = BOOST_MATH_TEST_VALUE(RealType, 2.699999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[3] = BOOST_MATH_TEST_VALUE(RealType, 0.9966287342654774578203091807272871494846015619689842252588224928604557045580020903399140826514419525);
|
||||
zs<RealType>[4] = BOOST_MATH_TEST_VALUE(RealType, 3.199999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[4] = BOOST_MATH_TEST_VALUE(RealType, 1.083216216147652072726562700563454011684986526601600660806443834509711499483389930134543612892458143);
|
||||
zs<RealType>[5] = BOOST_MATH_TEST_VALUE(RealType, 3.699999999999999955591079014993738383054733276367187500000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[5] = BOOST_MATH_TEST_VALUE(RealType, 1.159953178612022143701086341067113318247085320992117266262618001908576504625710753138135645536760705);
|
||||
zs<RealType>[6] = BOOST_MATH_TEST_VALUE(RealType, 7.899999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[6] = BOOST_MATH_TEST_VALUE(RealType, 1.598067606240196984785534680781403865575242180069554020841247076138095065416648450279328891063284787);
|
||||
zs<RealType>[7] = BOOST_MATH_TEST_VALUE(RealType, 8.399999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[7] = BOOST_MATH_TEST_VALUE(RealType, 1.635986015616761306128656680352102711658504330413761752847915150776296724715125185878789170353595843);
|
||||
zs<RealType>[8] = BOOST_MATH_TEST_VALUE(RealType, 8.899999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[8] = BOOST_MATH_TEST_VALUE(RealType, 1.672019249364215143714449427934723990551745560176619694762404483433765553308432498126823728454150807);
|
||||
zs<RealType>[9] = BOOST_MATH_TEST_VALUE(RealType, 9.399999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[9] = BOOST_MATH_TEST_VALUE(RealType, 1.706351956427362203924265356724807963736463682858697517135613748929048683757986880699421428246987716);
|
||||
zs<RealType>[10] = BOOST_MATH_TEST_VALUE(RealType, 9.899999999999999911182158029987476766109466552734375000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[10] = BOOST_MATH_TEST_VALUE(RealType, 1.739142551733351601404562031720166836256093578556407891184787967858395290655747464534386031726054901);
|
||||
zs<RealType>[11] = BOOST_MATH_TEST_VALUE(RealType, 20.29999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[11] = BOOST_MATH_TEST_VALUE(RealType, 2.215253873529547121281024099654049024258898512352506053956048219674735189566735605935868519028886428);
|
||||
zs<RealType>[12] = BOOST_MATH_TEST_VALUE(RealType, 20.79999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[12] = BOOST_MATH_TEST_VALUE(RealType, 2.232037942848570707824689153745947970289311384094147352193787995777039984911477501437729555943891179);
|
||||
zs<RealType>[13] = BOOST_MATH_TEST_VALUE(RealType, 21.29999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[13] = BOOST_MATH_TEST_VALUE(RealType, 2.248461062664032810797682669829614177334474567497410976269795770382256291948680343286055598456930946);
|
||||
zs<RealType>[14] = BOOST_MATH_TEST_VALUE(RealType, 21.79999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[14] = BOOST_MATH_TEST_VALUE(RealType, 2.264538836003641674575766487227130628592151315874095763183468118573707558576164351416415105283538250);
|
||||
zs<RealType>[15] = BOOST_MATH_TEST_VALUE(RealType, 22.29999999999999982236431605997495353221893310546875000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[15] = BOOST_MATH_TEST_VALUE(RealType, 2.280285864286149926152034464925849817265625703056626970221292432804223262557041139245862876595960246);
|
||||
zs<RealType>[16] = BOOST_MATH_TEST_VALUE(RealType, 45.09999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[16] = BOOST_MATH_TEST_VALUE(RealType, 2.784730975471531592298228296023808374578957621993717936291403085791375505867336041880555203144734624);
|
||||
zs<RealType>[17] = BOOST_MATH_TEST_VALUE(RealType, 45.59999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[17] = BOOST_MATH_TEST_VALUE(RealType, 2.792846418923343663453351656549736190861671652329623509279809945695836105896108078166742811990549890);
|
||||
zs<RealType>[18] = BOOST_MATH_TEST_VALUE(RealType, 46.09999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[18] = BOOST_MATH_TEST_VALUE(RealType, 2.800879481577357402817907432620737944445117856442267934361375865486347844977822691465905776042660153);
|
||||
zs<RealType>[19] = BOOST_MATH_TEST_VALUE(RealType, 46.59999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[19] = BOOST_MATH_TEST_VALUE(RealType, 2.808831854396542967901795549912651228215931108039763441789870364477609029775521508274395566200250327);
|
||||
zs<RealType>[20] = BOOST_MATH_TEST_VALUE(RealType, 47.09999999999999964472863211994990706443786621093750000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[20] = BOOST_MATH_TEST_VALUE(RealType, 2.816705176341098453894950633365766251645928038203952811501285665902169257597881259137118085186909385);
|
||||
zs<RealType>[21] = BOOST_MATH_TEST_VALUE(RealType, 94.69999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[21] = BOOST_MATH_TEST_VALUE(RealType, 3.343650750934026694453868349588423323594970057683998463032955783031328100668795635364027627344237744);
|
||||
zs<RealType>[22] = BOOST_MATH_TEST_VALUE(RealType, 95.19999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[22] = BOOST_MATH_TEST_VALUE(RealType, 3.347704927126314354014952127881909800322435946123852141764728005964807369865451182872647651261526300);
|
||||
zs<RealType>[23] = BOOST_MATH_TEST_VALUE(RealType, 95.69999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[23] = BOOST_MATH_TEST_VALUE(RealType, 3.351738986777429550093016062864573016038852034507491269297237351947364962103400790753443005963042748);
|
||||
zs<RealType>[24] = BOOST_MATH_TEST_VALUE(RealType, 96.19999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[24] = BOOST_MATH_TEST_VALUE(RealType, 3.355753131971562146591617562968067128167583310591520027232903513337163599725129242852363808925517286);
|
||||
zs<RealType>[25] = BOOST_MATH_TEST_VALUE(RealType, 96.69999999999999928945726423989981412887573242187500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[25] = BOOST_MATH_TEST_VALUE(RealType, 3.359747561740841558826391853676861600267695314122615815793967179881207925371616384184099572300595115);
|
||||
zs<RealType>[26] = BOOST_MATH_TEST_VALUE(RealType, 193.8999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[26] = BOOST_MATH_TEST_VALUE(RealType, 3.905067494884853812892253268046191881524005958444131697564696414502793024379297479024372424749155738);
|
||||
zs<RealType>[27] = BOOST_MATH_TEST_VALUE(RealType, 194.3999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[27] = BOOST_MATH_TEST_VALUE(RealType, 3.907117899842841728838668195110205529083454921828289550856799078486258603076095983089478749398791291);
|
||||
zs<RealType>[28] = BOOST_MATH_TEST_VALUE(RealType, 194.8999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[28] = BOOST_MATH_TEST_VALUE(RealType, 3.909163256350964853423766659493861241213806026764267552120249985812650869611378163906691630909022161);
|
||||
zs<RealType>[29] = BOOST_MATH_TEST_VALUE(RealType, 195.3999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[29] = BOOST_MATH_TEST_VALUE(RealType, 3.911203589561939804120818106435026078510094046010650488053868908640181610985462139185885264355418070);
|
||||
zs<RealType>[30] = BOOST_MATH_TEST_VALUE(RealType, 195.8999999999999985789145284797996282577514648437500000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[30] = BOOST_MATH_TEST_VALUE(RealType, 3.913238924439855435510247090467540747905833384629853846395096935851013937767959235773727554750691716);
|
||||
zs<RealType>[31] = BOOST_MATH_TEST_VALUE(RealType, 392.2999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[31] = BOOST_MATH_TEST_VALUE(RealType, 4.473790759373999449370836932900380698603499930598355812583693103082314531706325269694063530407295371);
|
||||
zs<RealType>[32] = BOOST_MATH_TEST_VALUE(RealType, 392.7999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[32] = BOOST_MATH_TEST_VALUE(RealType, 4.474831809850706594148527116907834093420614735070734923094248837531977152944616462128228522597237267);
|
||||
zs<RealType>[33] = BOOST_MATH_TEST_VALUE(RealType, 393.2999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[33] = BOOST_MATH_TEST_VALUE(RealType, 4.475871580159411118557716684955449097432917202595361508172914971791116938813457453917365177551691682);
|
||||
zs<RealType>[34] = BOOST_MATH_TEST_VALUE(RealType, 393.7999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[34] = BOOST_MATH_TEST_VALUE(RealType, 4.476910073482067128895548362807270116617425992201334451790294796151311859601136186866422234634474300);
|
||||
zs<RealType>[35] = BOOST_MATH_TEST_VALUE(RealType, 394.2999999999999971578290569595992565155029296875000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[35] = BOOST_MATH_TEST_VALUE(RealType, 4.477947292988721649990662195165267393745885698851422229805500000725367834662498733709056508177586635);
|
||||
zs<RealType>[36] = BOOST_MATH_TEST_VALUE(RealType, 789.0999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[36] = BOOST_MATH_TEST_VALUE(RealType, 5.051256108760896701894497014701900464234767080894666089938550993707446937559086016796794249885331870);
|
||||
zs<RealType>[37] = BOOST_MATH_TEST_VALUE(RealType, 789.5999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[37] = BOOST_MATH_TEST_VALUE(RealType, 5.051784868057603576951613257575983601901987808830448747962646970040648657993520282283444052127887316);
|
||||
zs<RealType>[38] = BOOST_MATH_TEST_VALUE(RealType, 790.0999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[38] = BOOST_MATH_TEST_VALUE(RealType, 5.052313301769511279751645919401950992205691275454166720959640667514665636089541176437079485020106302);
|
||||
zs<RealType>[39] = BOOST_MATH_TEST_VALUE(RealType, 790.5999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[39] = BOOST_MATH_TEST_VALUE(RealType, 5.052841410301356078567942312344300154667895407100576839086958094315459736887113324816418833061471414);
|
||||
zs<RealType>[40] = BOOST_MATH_TEST_VALUE(RealType, 791.0999999999999943156581139191985130310058593750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[40] = BOOST_MATH_TEST_VALUE(RealType, 5.053369194057116916125095352093384287199494222654442252497641737159855576046108292479434106853949424);
|
||||
zs<RealType>[41] = BOOST_MATH_TEST_VALUE(RealType, 1582.699999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[41] = BOOST_MATH_TEST_VALUE(RealType, 5.637454835061548840266762838608075961241621341710147974330149448636747596037634477093772466715414237);
|
||||
zs<RealType>[42] = BOOST_MATH_TEST_VALUE(RealType, 1583.199999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[42] = BOOST_MATH_TEST_VALUE(RealType, 5.637723113558296965227371679987485292172631743514584329014143690566703873701821724552724491259434917);
|
||||
zs<RealType>[43] = BOOST_MATH_TEST_VALUE(RealType, 1583.699999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[43] = BOOST_MATH_TEST_VALUE(RealType, 5.637991309264171414360659662528863849150184273111159470910102371892495978961903358821307687677635837);
|
||||
zs<RealType>[44] = BOOST_MATH_TEST_VALUE(RealType, 1584.199999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[44] = BOOST_MATH_TEST_VALUE(RealType, 5.638259422230692585112176850810679719906543165397130936013277468573934642794738015313302920143170105);
|
||||
zs<RealType>[45] = BOOST_MATH_TEST_VALUE(RealType, 1584.699999999999988631316227838397026062011718750000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[45] = BOOST_MATH_TEST_VALUE(RealType, 5.638527452509332631758526797455952459448323578747282813479742362912515476029842704193513987433394644);
|
||||
zs<RealType>[46] = BOOST_MATH_TEST_VALUE(RealType, 3169.899999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[46] = BOOST_MATH_TEST_VALUE(RealType, 6.231791473267630119617879242959215790063493036893226016268939602113573649847295482162112707750032205);
|
||||
zs<RealType>[47] = BOOST_MATH_TEST_VALUE(RealType, 3170.399999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[47] = BOOST_MATH_TEST_VALUE(RealType, 6.231927385287213295870608336780291881793156334477048126729390997875392137109426481813143445559537548);
|
||||
zs<RealType>[48] = BOOST_MATH_TEST_VALUE(RealType, 3170.899999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[48] = BOOST_MATH_TEST_VALUE(RealType, 6.232063276283731898910298571907046320310117335045161587714712693774590117520030116772150624981197754);
|
||||
zs<RealType>[49] = BOOST_MATH_TEST_VALUE(RealType, 3171.399999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[49] = BOOST_MATH_TEST_VALUE(RealType, 6.232199146263736642645449823754129665166787360756180379390602947566154676495717638352300033758537319);
|
||||
zs<RealType>[50] = BOOST_MATH_TEST_VALUE(RealType, 3171.899999999999977262632455676794052124023437500000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[50] = BOOST_MATH_TEST_VALUE(RealType, 6.232334995233775170638824027293638315162522524016381054824777727129130712726670908695639061242466679);
|
||||
zs<RealType>[51] = BOOST_MATH_TEST_VALUE(RealType, 6344.299999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[51] = BOOST_MATH_TEST_VALUE(RealType, 6.833478246863882246641726870717734354293613258312600642204509694006101911629409462573891987188902394);
|
||||
zs<RealType>[52] = BOOST_MATH_TEST_VALUE(RealType, 6344.799999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[52] = BOOST_MATH_TEST_VALUE(RealType, 6.833546994320183648585668463184962739224514055009742694319567301283431438840148992714833003589320204);
|
||||
zs<RealType>[53] = BOOST_MATH_TEST_VALUE(RealType, 6345.299999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[53] = BOOST_MATH_TEST_VALUE(RealType, 6.833615736447355580644330241871199203480309206612453771835338393474744796397760691906867357518286300);
|
||||
zs<RealType>[54] = BOOST_MATH_TEST_VALUE(RealType, 6345.799999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[54] = BOOST_MATH_TEST_VALUE(RealType, 6.833684473246229472880513750644790479773339419112019177698673979527062571403548057152859520971070532);
|
||||
zs<RealType>[55] = BOOST_MATH_TEST_VALUE(RealType, 6346.299999999999954525264911353588104248046875000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[55] = BOOST_MATH_TEST_VALUE(RealType, 6.833753204717636560302304979968870884092145760178319785601850619423465965447586003582575169154068642);
|
||||
zs<RealType>[56] = BOOST_MATH_TEST_VALUE(RealType, 12693.09999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[56] = BOOST_MATH_TEST_VALUE(RealType, 7.441712782644182656362567954733218054310136462342348107691598780010100425506115311857309428345451583);
|
||||
zs<RealType>[57] = BOOST_MATH_TEST_VALUE(RealType, 12693.59999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[57] = BOOST_MATH_TEST_VALUE(RealType, 7.441747507160214264985418199644937473985616288224663570878672057496608603535012780430207292902251849);
|
||||
zs<RealType>[58] = BOOST_MATH_TEST_VALUE(RealType, 12694.09999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[58] = BOOST_MATH_TEST_VALUE(RealType, 7.441782230327669457854270012077867036991216446419568353636383337201042455550854674638301527917381460);
|
||||
zs<RealType>[59] = BOOST_MATH_TEST_VALUE(RealType, 12694.59999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[59] = BOOST_MATH_TEST_VALUE(RealType, 7.441816952146653566134582734750438863756337927374408689634478920961001428844890048307273438220285103);
|
||||
zs<RealType>[60] = BOOST_MATH_TEST_VALUE(RealType, 12695.09999999999990905052982270717620849609375000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[60] = BOOST_MATH_TEST_VALUE(RealType, 7.441851672617271908624631672809964354572668086864496527202255560220860635169893350319392062176172956);
|
||||
zs<RealType>[61] = BOOST_MATH_TEST_VALUE(RealType, 25390.69999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[61] = BOOST_MATH_TEST_VALUE(RealType, 8.055751887730669404078767770906158058132806188168812278807914210510560983286915475256358360988722249);
|
||||
zs<RealType>[62] = BOOST_MATH_TEST_VALUE(RealType, 25391.19999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[62] = BOOST_MATH_TEST_VALUE(RealType, 8.055769405252722224984585767512155671001638813031160420183226603705765994004819084590112882738598672);
|
||||
zs<RealType>[63] = BOOST_MATH_TEST_VALUE(RealType, 25391.69999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[63] = BOOST_MATH_TEST_VALUE(RealType, 8.055786922434032119761416627590837471869427434519755833207927697913643222261584517182449368833198187);
|
||||
zs<RealType>[64] = BOOST_MATH_TEST_VALUE(RealType, 25392.19999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[64] = BOOST_MATH_TEST_VALUE(RealType, 8.055804439274612409649066171031328348764224415259811919589560542548689157122598047317682477881428519);
|
||||
zs<RealType>[65] = BOOST_MATH_TEST_VALUE(RealType, 25392.69999999999981810105964541435241699218750000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[65] = BOOST_MATH_TEST_VALUE(RealType, 8.055821955774476415104661363464701307020928082642356236080373490396966544402792637267897239283500728);
|
||||
zs<RealType>[66] = BOOST_MATH_TEST_VALUE(RealType, 50785.89999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[66] = BOOST_MATH_TEST_VALUE(RealType, 8.674936078635983017984123951954366186973716699495736629864279614242284857757227515949355498579742855);
|
||||
zs<RealType>[67] = BOOST_MATH_TEST_VALUE(RealType, 50786.39999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[67] = BOOST_MATH_TEST_VALUE(RealType, 8.674944906241453706059825549964349902974004039927040359264744515026031399261972506772892769382818801);
|
||||
zs<RealType>[68] = BOOST_MATH_TEST_VALUE(RealType, 50786.89999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[68] = BOOST_MATH_TEST_VALUE(RealType, 8.674953733760944136535950689333928914142360745655931032041490757092023706394578714640748394257288035);
|
||||
zs<RealType>[69] = BOOST_MATH_TEST_VALUE(RealType, 50787.39999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[69] = BOOST_MATH_TEST_VALUE(RealType, 8.674962561194455991628227539852952953077017660325256919933499525371091080399080487843972214866128384);
|
||||
zs<RealType>[70] = BOOST_MATH_TEST_VALUE(RealType, 50787.89999999999963620211929082870483398437500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[70] = BOOST_MATH_TEST_VALUE(RealType, 8.674971388541990953502931535257895802702731784533955912147060505216027254503478909260086842672435376);
|
||||
zs<RealType>[71] = BOOST_MATH_TEST_VALUE(RealType, 101576.2999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[71] = BOOST_MATH_TEST_VALUE(RealType, 9.298691796027940703796635264110043143787629375260023629778966472817740701497549236671005785312535137);
|
||||
zs<RealType>[72] = BOOST_MATH_TEST_VALUE(RealType, 101576.7999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[72] = BOOST_MATH_TEST_VALUE(RealType, 9.298696240460783074349599408079465706595862952879886273836096426172349132276424038993850275528909958);
|
||||
zs<RealType>[73] = BOOST_MATH_TEST_VALUE(RealType, 101577.2999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[73] = BOOST_MATH_TEST_VALUE(RealType, 9.298700684871954559132336105768526810554925567844384854912235341295989207897852971537611849804454104);
|
||||
zs<RealType>[74] = BOOST_MATH_TEST_VALUE(RealType, 101577.7999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[74] = BOOST_MATH_TEST_VALUE(RealType, 9.298705129261455370304348674457005008539407510001142864340543902043967324875967473097043636378431136);
|
||||
zs<RealType>[75] = BOOST_MATH_TEST_VALUE(RealType, 101578.2999999999992724042385816574096679687500000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[75] = BOOST_MATH_TEST_VALUE(RealType, 9.298709573629285720022020159137488905547397121761906103664298171650800509043504137427221381746219971);
|
||||
zs<RealType>[76] = BOOST_MATH_TEST_VALUE(RealType, 203157.0999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[76] = BOOST_MATH_TEST_VALUE(RealType, 9.926524439637924502814640096432844232405010548632138451412344878257773957471037720806722776924379539);
|
||||
zs<RealType>[77] = BOOST_MATH_TEST_VALUE(RealType, 203157.5999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[77] = BOOST_MATH_TEST_VALUE(RealType, 9.926526675539305999408212665862555525393765588240345090590079743764108100617622492751979808963302929);
|
||||
zs<RealType>[78] = BOOST_MATH_TEST_VALUE(RealType, 203158.0999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[78] = BOOST_MATH_TEST_VALUE(RealType, 9.926528911435230720557328431324006644047736665798752128461117587165401958858923779103702189649205849);
|
||||
zs<RealType>[79] = BOOST_MATH_TEST_VALUE(RealType, 203158.5999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[79] = BOOST_MATH_TEST_VALUE(RealType, 9.926531147325698692990351270769682423599587366983008197322280565618502972980495987784743296088232692);
|
||||
zs<RealType>[80] = BOOST_MATH_TEST_VALUE(RealType, 203159.0999999999985448084771633148193359375000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[80] = BOOST_MATH_TEST_VALUE(RealType, 9.926533383210709943435448417027560593313394713874207050608325275972416603539435687443617960861779968);
|
||||
zs<RealType>[81] = BOOST_MATH_TEST_VALUE(RealType, 406318.6999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[81] = BOOST_MATH_TEST_VALUE(RealType, 10.55800844020678300858930169345380918056498196515847559789815847210932705985905912177836375627483410);
|
||||
zs<RealType>[82] = BOOST_MATH_TEST_VALUE(RealType, 406319.1999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[82] = BOOST_MATH_TEST_VALUE(RealType, 10.55800956429896255310197650482898317196991260081559124902272662470413320348092630336068243562420612);
|
||||
zs<RealType>[83] = BOOST_MATH_TEST_VALUE(RealType, 406319.6999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[83] = BOOST_MATH_TEST_VALUE(RealType, 10.55801068838976919073174818917086439876248092007955187694896892558084843931726958729264479171526918);
|
||||
zs<RealType>[84] = BOOST_MATH_TEST_VALUE(RealType, 406320.1999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[84] = BOOST_MATH_TEST_VALUE(RealType, 10.55801181247920292484283725870748463023358051483533901203380901404123382789184489956279108152225757);
|
||||
zs<RealType>[85] = BOOST_MATH_TEST_VALUE(RealType, 406320.6999999999970896169543266296386718750000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[85] = BOOST_MATH_TEST_VALUE(RealType, 10.55801293656726375879945184504060224737500313478807503007007909767698116683614226527139047633989602);
|
||||
zs<RealType>[86] = BOOST_MATH_TEST_VALUE(RealType, 812641.8999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[86] = BOOST_MATH_TEST_VALUE(RealType, 11.19277715105303335957380751089185510982783382888615163475399731608447432939046539739780186010205819);
|
||||
zs<RealType>[87] = BOOST_MATH_TEST_VALUE(RealType, 812642.3999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[87] = BOOST_MATH_TEST_VALUE(RealType, 11.19277771586759068427927907791232978730718798905802091714667366555094578546313245757715733663116681);
|
||||
zs<RealType>[88] = BOOST_MATH_TEST_VALUE(RealType, 812642.8999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[88] = BOOST_MATH_TEST_VALUE(RealType, 11.19277828068180282941234300813602678219028255437023366225732009891673392268727353365317316060216307);
|
||||
zs<RealType>[89] = BOOST_MATH_TEST_VALUE(RealType, 812643.3999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[89] = BOOST_MATH_TEST_VALUE(RealType, 11.19277884549566979539611569279587635086022997209586259427933274111486838234969448101548392041897529);
|
||||
zs<RealType>[90] = BOOST_MATH_TEST_VALUE(RealType, 812643.8999999999941792339086532592773437500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[90] = BOOST_MATH_TEST_VALUE(RealType, 11.19277941030919158265371274430325256214137887195738215091099754333691681726015244339566835725917388);
|
||||
zs<RealType>[91] = BOOST_MATH_TEST_VALUE(RealType, 1625288.299999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[91] = BOOST_MATH_TEST_VALUE(RealType, 11.83051367496350653298055098412234220179378826002120373759410524883137483448021534372309124250280047);
|
||||
zs<RealType>[92] = BOOST_MATH_TEST_VALUE(RealType, 1625288.799999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[92] = BOOST_MATH_TEST_VALUE(RealType, 11.83051395862415209457082318977971516657969184941726425523617075901029866766828046681793457310563883);
|
||||
zs<RealType>[93] = BOOST_MATH_TEST_VALUE(RealType, 1625289.299999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[93] = BOOST_MATH_TEST_VALUE(RealType, 11.83051424228471092157568395260197960555928287686416745291625975894259102434581858031780382895984480);
|
||||
zs<RealType>[94] = BOOST_MATH_TEST_VALUE(RealType, 1625289.799999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[94] = BOOST_MATH_TEST_VALUE(RealType, 11.83051452594518301404831336917713066668156156528094910312372347647232811359765848597839160347350790);
|
||||
zs<RealType>[95] = BOOST_MATH_TEST_VALUE(RealType, 1625290.299999999988358467817306518554687500000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[95] = BOOST_MATH_TEST_VALUE(RealType, 11.83051480960556837204189148713503938528677530351797077101569714537002853052165595070586086051268476);
|
||||
zs<RealType>[96] = BOOST_MATH_TEST_VALUE(RealType, 3250581.099999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[96] = BOOST_MATH_TEST_VALUE(RealType, 12.47094296296818886963926120402441135953658337315101944303084986533714570937576415675358344893956724);
|
||||
zs<RealType>[97] = BOOST_MATH_TEST_VALUE(RealType, 3250581.599999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[97] = BOOST_MATH_TEST_VALUE(RealType, 12.47094310536827791354684005276581162972597260940308218544073416384666193653508004167640448380153389);
|
||||
zs<RealType>[98] = BOOST_MATH_TEST_VALUE(RealType, 3250582.099999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[98] = BOOST_MATH_TEST_VALUE(RealType, 12.47094324776834517437426924689730750513918775389042001111365883776867938003401942562632403665303867);
|
||||
zs<RealType>[99] = BOOST_MATH_TEST_VALUE(RealType, 3250582.599999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[99] = BOOST_MATH_TEST_VALUE(RealType, 12.47094339016839065212822905567651460418204106065566910956134121802725695306834966790193342511971825);
|
||||
zs<RealType>[100] = BOOST_MATH_TEST_VALUE(RealType, 3250583.099999999976716935634613037109375000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[100] = BOOST_MATH_TEST_VALUE(RealType, 12.47094353256841434681539974528531469757660901993281429423438578866652694560046559516127568892277702);
|
||||
zs<RealType>[101] = BOOST_MATH_TEST_VALUE(RealType, 6501166.699999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[101] = BOOST_MATH_TEST_VALUE(RealType, 13.11382518009820116753812472043031659983277915902361747977758246698818963218870351102587174635468138);
|
||||
zs<RealType>[102] = BOOST_MATH_TEST_VALUE(RealType, 6501167.199999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[102] = BOOST_MATH_TEST_VALUE(RealType, 13.11382525155825542039438232302300244148043560690215658478061719482590950005701713995387903749679862);
|
||||
zs<RealType>[103] = BOOST_MATH_TEST_VALUE(RealType, 6501167.699999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[103] = BOOST_MATH_TEST_VALUE(RealType, 13.11382532301830420490055394669714665225378812412907655382308789130810346826183238238494205026247934);
|
||||
zs<RealType>[104] = BOOST_MATH_TEST_VALUE(RealType, 6501168.199999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[104] = BOOST_MATH_TEST_VALUE(RealType, 13.11382539447834752105747833428094533284492363009218919720913636223924531666313533113069940376003390);
|
||||
zs<RealType>[105] = BOOST_MATH_TEST_VALUE(RealType, 6501168.699999999953433871269226074218750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[105] = BOOST_MATH_TEST_VALUE(RealType, 13.11382546593838536886599422840946554656689837543146085874754543863703505630372640720269904462657597);
|
||||
zs<RealType>[106] = BOOST_MATH_TEST_VALUE(RealType, 13002337.89999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[106] = BOOST_MATH_TEST_VALUE(RealType, 13.75895020161120780671931348674820949097896740529525960699598966308825998645623474235280989608207426);
|
||||
zs<RealType>[107] = BOOST_MATH_TEST_VALUE(RealType, 13002338.39999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[107] = BOOST_MATH_TEST_VALUE(RealType, 13.75895023746031789528316024226987524061812679192459530422102497447151229457148397431817422821296573);
|
||||
zs<RealType>[108] = BOOST_MATH_TEST_VALUE(RealType, 13002338.89999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[108] = BOOST_MATH_TEST_VALUE(RealType, 13.75895027330942661161180008030275959022186764318551714315248259172940117391346074981407903526666876);
|
||||
zs<RealType>[109] = BOOST_MATH_TEST_VALUE(RealType, 13002339.39999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[109] = BOOST_MATH_TEST_VALUE(RealType, 13.75895030915853395570533826541548036105186387000942779022045956615233350302797407587096919814230872);
|
||||
zs<RealType>[110] = BOOST_MATH_TEST_VALUE(RealType, 13002339.89999999990686774253845214843750000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[110] = BOOST_MATH_TEST_VALUE(RealType, 13.75895034500763992756388006216453398588380356491793568993934227427809822610433476168943506890083264);
|
||||
zs<RealType>[111] = BOOST_MATH_TEST_VALUE(RealType, 26004680.29999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[111] = BOOST_MATH_TEST_VALUE(RealType, 14.40613306792050284417781173963237397180782490395810703112834440216893801894568593170935318229410890);
|
||||
zs<RealType>[112] = BOOST_MATH_TEST_VALUE(RealType, 26004680.79999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[112] = BOOST_MATH_TEST_VALUE(RealType, 14.40613308589978129513196522846261186416164678471600282263899627087138088581441641199768735966026721);
|
||||
zs<RealType>[113] = BOOST_MATH_TEST_VALUE(RealType, 26004681.29999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[113] = BOOST_MATH_TEST_VALUE(RealType, 14.40613310387905940184947896220802688669394773806882218972392634458869861468933663343960564575146049);
|
||||
zs<RealType>[114] = BOOST_MATH_TEST_VALUE(RealType, 26004681.79999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[114] = BOOST_MATH_TEST_VALUE(RealType, 14.40613312185833716433036614707023490965167453502978925783310059180078511451175950772072935073580417);
|
||||
zs<RealType>[115] = BOOST_MATH_TEST_VALUE(RealType, 26004682.29999999981373548507690429687500000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[115] = BOOST_MATH_TEST_VALUE(RealType, 14.40613313983761458257463998925009132119130606601627537868443064669880766892972378195587657468067971);
|
||||
zs<RealType>[116] = BOOST_MATH_TEST_VALUE(RealType, 52009365.09999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[116] = BOOST_MATH_TEST_VALUE(RealType, 15.05521023228726997012482201156518637282193264830919527945406914876568997920242700346221079695380120);
|
||||
zs<RealType>[117] = BOOST_MATH_TEST_VALUE(RealType, 52009365.59999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[117] = BOOST_MATH_TEST_VALUE(RealType, 15.05521024130213601448008511719004686304317399587148372739532783438679535880037848363163034299000680);
|
||||
zs<RealType>[118] = BOOST_MATH_TEST_VALUE(RealType, 52009366.09999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[118] = BOOST_MATH_TEST_VALUE(RealType, 15.05521025031700197250576749203130491372164140425152090159289103953022449076855552216703380049236381);
|
||||
zs<RealType>[119] = BOOST_MATH_TEST_VALUE(RealType, 52009366.59999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[119] = BOOST_MATH_TEST_VALUE(RealType, 15.05521025933186784420187079237695573264884951878394949291027777307830551044730470942903907859985247);
|
||||
zs<RealType>[120] = BOOST_MATH_TEST_VALUE(RealType, 52009367.09999999962747097015380859375000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[120] = BOOST_MATH_TEST_VALUE(RealType, 15.05521026834673362956839667451494683193779819588967935304969871800597790007309597120010839282494067);
|
||||
zs<RealType>[121] = BOOST_MATH_TEST_VALUE(RealType, 104018734.6999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[121] = BOOST_MATH_TEST_VALUE(RealType, 15.70603645611954384988565703849374122026373428508755081783343271665282590664826044624943527766443724);
|
||||
zs<RealType>[122] = BOOST_MATH_TEST_VALUE(RealType, 104018735.1999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[122] = BOOST_MATH_TEST_VALUE(RealType, 15.70603646063864032656975241668975461127107196165116494804371210729046808944447344810561150619338235);
|
||||
zs<RealType>[123] = BOOST_MATH_TEST_VALUE(RealType, 104018735.6999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[123] = BOOST_MATH_TEST_VALUE(RealType, 15.70603646515773678160916860265187423935628996612114399500020977395299556819648453302891654761783891);
|
||||
zs<RealType>[124] = BOOST_MATH_TEST_VALUE(RealType, 104018736.1999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[124] = BOOST_MATH_TEST_VALUE(RealType, 15.70603646967683321500390580404963095388245044851589624040628425347772179453119739096056755672581358);
|
||||
zs<RealType>[125] = BOOST_MATH_TEST_VALUE(RealType, 104018736.6999999992549419403076171875000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[125] = BOOST_MATH_TEST_VALUE(RealType, 15.70603647419592962675396422855255261373445463144900248624737121930916887983366690742461452872492017);
|
||||
zs<RealType>[126] = BOOST_MATH_TEST_VALUE(RealType, 208037473.8999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[126] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223073077299062251727505489121683259009838940921798588655999804611259258002812224135777088225);
|
||||
zs<RealType>[127] = BOOST_MATH_TEST_VALUE(RealType, 208037474.3999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[127] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223299572857263748180340545017346327532474491820120184954137107185953921166019993001720173076);
|
||||
zs<RealType>[128] = BOOST_MATH_TEST_VALUE(RealType, 208037474.8999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[128] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223526068414922688843525885798316030222323873469187325647317943052465221773791004107044449214);
|
||||
zs<RealType>[129] = BOOST_MATH_TEST_VALUE(RealType, 208037475.3999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[129] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223752563972039073719664683805774368875669934675288398977599557153297961083834670781371769393);
|
||||
zs<RealType>[130] = BOOST_MATH_TEST_VALUE(RealType, 208037475.8999999985098838806152343750000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[130] = BOOST_MATH_TEST_VALUE(RealType, 16.35848223979059528612902811360111362158185991940560941697071272367978154194499902342370856607708754);
|
||||
zs<RealType>[131] = BOOST_MATH_TEST_VALUE(RealType, 416074952.2999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[131] = BOOST_MATH_TEST_VALUE(RealType, 17.01243162682130034575873110256608416240774650633244657569787078893008324146198524461655542099298038);
|
||||
zs<RealType>[132] = BOOST_MATH_TEST_VALUE(RealType, 416074952.7999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[132] = BOOST_MATH_TEST_VALUE(RealType, 17.01243162795629150708082853641104106051019632512982699681254455598867301594442867945136512864263362);
|
||||
zs<RealType>[133] = BOOST_MATH_TEST_VALUE(RealType, 416074953.2999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[133] = BOOST_MATH_TEST_VALUE(RealType, 17.01243162909128266704320348800926473937585791237790855606445141461836852095077452961626092636714582);
|
||||
zs<RealType>[134] = BOOST_MATH_TEST_VALUE(RealType, 416074953.7999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[134] = BOOST_MATH_TEST_VALUE(RealType, 17.01243163022627382564585596062316405185836375654028401358545369509940490853717120734831332950839378);
|
||||
zs<RealType>[135] = BOOST_MATH_TEST_VALUE(RealType, 416074954.2999999970197677612304687500000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[135] = BOOST_MATH_TEST_VALUE(RealType, 17.01243163136126498288878595751514783906405969399381198927824453551799680870112429531524827406849599);
|
||||
zs<RealType>[136] = BOOST_MATH_TEST_VALUE(RealType, 832149909.0999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[136] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049214031531812887566464334167360339296689778348663603985291368769599603595003791335301847127);
|
||||
zs<RealType>[137] = BOOST_MATH_TEST_VALUE(RealType, 832149909.5999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[137] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049270898194728430180770507660352501688482825963526508387721596470881802640086432444438183220);
|
||||
zs<RealType>[138] = BOOST_MATH_TEST_VALUE(RealType, 832149910.0999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[138] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049327764857609902322798165858268194375878492382051153135096018706001421025620618302837247343);
|
||||
zs<RealType>[139] = BOOST_MATH_TEST_VALUE(RealType, 832149910.5999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[139] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049384631520457303992588186753608991034689224716778630078855718157314806355505907287211879952);
|
||||
zs<RealType>[140] = BOOST_MATH_TEST_VALUE(RealType, 832149911.0999999940395355224609375000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[140] = BOOST_MATH_TEST_VALUE(RealType, 17.66778049441498183270635190181448338802862077472029294388350982070482138347224074032285443619695132);
|
||||
zs<RealType>[141] = BOOST_MATH_TEST_VALUE(RealType, 1664299822.699999988079071044921875000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[141] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493355098619384682217293063408860906200997313752841900524481309067580120995737616551816092439);
|
||||
zs<RealType>[142] = BOOST_MATH_TEST_VALUE(RealType, 1664299823.199999988079071044921875000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[142] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493383586636729058593564510700968056859723407482295764411091295912034128445270765389474245827);
|
||||
zs<RealType>[143] = BOOST_MATH_TEST_VALUE(RealType, 1664299823.699999988079071044921875000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[143] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493412074654064899329117538024263559388031556198852503241876369903917896474239140595505063322);
|
||||
zs<RealType>[144] = BOOST_MATH_TEST_VALUE(RealType, 1664299824.199999988079071044921875000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[144] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493440562671392204423957266503795757499599462266552348787036107193130165331139452279532396827);
|
||||
zs<RealType>[145] = BOOST_MATH_TEST_VALUE(RealType, 1664299824.699999988079071044921875000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[145] = BOOST_MATH_TEST_VALUE(RealType, 18.32443493469050688710973878088817264608384098178071957390837672366993756271957964256600743216105241);
|
||||
zs<RealType>[146] = BOOST_MATH_TEST_VALUE(RealType, 3328599649.899999976158142089843750000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[146] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003239481891260092191504387611307556374245363459040509191182476364522292852639675828304549626);
|
||||
zs<RealType>[147] = BOOST_MATH_TEST_VALUE(RealType, 3328599650.399999976158142089843750000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[147] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003253751491629227276099735868489913807533078209230206170806009818301507483588395812018180071);
|
||||
zs<RealType>[148] = BOOST_MATH_TEST_VALUE(RealType, 3328599650.899999976158142089843750000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[148] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003268021091996224244869947622441697585814089764491702992369913535253679093973930949506347048);
|
||||
zs<RealType>[149] = BOOST_MATH_TEST_VALUE(RealType, 3328599651.399999976158142089843750000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[149] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003282290692361083097815664339084466388779045270504033488281798754360146784756669433227860478);
|
||||
zs<RealType>[150] = BOOST_MATH_TEST_VALUE(RealType, 3328599651.899999976158142089843750000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[150] = BOOST_MATH_TEST_VALUE(RealType, 18.98231003296560292723803834937527484339490103369072191109295056853780039115858285449484374166727442);
|
||||
zs<RealType>[151] = BOOST_MATH_TEST_VALUE(RealType, 6657199304.299999952316284179687500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[151] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875213179003616975291758951989874401990433758371552185122694920942525627888352145273462707829);
|
||||
zs<RealType>[152] = BOOST_MATH_TEST_VALUE(RealType, 6657199304.799999952316284179687500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[152] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875220325804117690436378168767212426802746287406741611709213764258286377104459764498688864645);
|
||||
zs<RealType>[153] = BOOST_MATH_TEST_VALUE(RealType, 6657199305.299999952316284179687500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[153] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875227472604617870068525483911300930564165365547681598983747537164183343994434536282821758671);
|
||||
zs<RealType>[154] = BOOST_MATH_TEST_VALUE(RealType, 6657199305.799999952316284179687500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[154] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875234619405117514188200977760121223842398566254787219879319150457646967224084449244020129346);
|
||||
zs<RealType>[155] = BOOST_MATH_TEST_VALUE(RealType, 6657199306.299999952316284179687500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[155] = BOOST_MATH_TEST_VALUE(RealType, 19.64132875241766205616622795404730651654599119614988454540132958996734683240549999645255105620924194);
|
||||
zs<RealType>[156] = BOOST_MATH_TEST_VALUE(RealType, 13314398613.09999990463256835937500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[156] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100521655914391255442878301089651369196196103134174539854119020213383927831733183603430177342);
|
||||
zs<RealType>[157] = BOOST_MATH_TEST_VALUE(RealType, 13314398613.59999990463256835937500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[157] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100525234952404035395706360529741527156245298468796715007831095483401537550300887615324478886);
|
||||
zs<RealType>[158] = BOOST_MATH_TEST_VALUE(RealType, 13314398614.09999990463256835937500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[158] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100528813990416681239948722494340433727853716710673987742922492342629617928698493424484032660);
|
||||
zs<RealType>[159] = BOOST_MATH_TEST_VALUE(RealType, 13314398614.59999990463256835937500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[159] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100532393028429192975605397043801464163741054316603439612006945607064743419379856370010506017);
|
||||
zs<RealType>[160] = BOOST_MATH_TEST_VALUE(RealType, 13314398615.09999990463256835937500000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[160] = BOOST_MATH_TEST_VALUE(RealType, 20.30142100535972066441570602676394238477992584177232532005791683216204582260476049842371709123221255);
|
||||
zs<RealType>[161] = BOOST_MATH_TEST_VALUE(RealType, 26628797230.69999980926513671875000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[161] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285249100030290397518601237584604981130278135272151318314970663709603528431386852754379112730);
|
||||
zs<RealType>[162] = BOOST_MATH_TEST_VALUE(RealType, 26628797231.19999980926513671875000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[162] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285250892202655550269280724503656839238502424605070290458403293889858635506895301235328962628);
|
||||
zs<RealType>[163] = BOOST_MATH_TEST_VALUE(RealType, 26628797231.69999980926513671875000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[163] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285252684375020669438704809175058008607738171622380516384350651954854873527952764745960194675);
|
||||
zs<RealType>[164] = BOOST_MATH_TEST_VALUE(RealType, 26628797232.19999980926513671875000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[164] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285254476547385755026873492858475358446577888309438244123935827841754860782205245677270931493);
|
||||
zs<RealType>[165] = BOOST_MATH_TEST_VALUE(RealType, 26628797232.69999980926513671875000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[165] = BOOST_MATH_TEST_VALUE(RealType, 20.96252285256268719750807033786776813575757892712773332275219858225617530315647886304839621190128467);
|
||||
zs<RealType>[166] = BOOST_MATH_TEST_VALUE(RealType, 53257594465.89999961853027343750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[166] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581338519341205251851678920458391270655214844894715960888032707282421057623183584027330480633);
|
||||
zs<RealType>[167] = BOOST_MATH_TEST_VALUE(RealType, 53257594466.39999961853027343750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[167] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581339416678276021956345172476031736610096020431411495093672867810851785199503170153825356689);
|
||||
zs<RealType>[168] = BOOST_MATH_TEST_VALUE(RealType, 53257594466.89999961853027343750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[168] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581340314015346783652970955706237153204994825959199820337645288096708677451415833137778699486);
|
||||
zs<RealType>[169] = BOOST_MATH_TEST_VALUE(RealType, 53257594467.39999961853027343750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[169] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581341211352417536941556270306715209214940104899493615505349319261368609864010882236880736924);
|
||||
zs<RealType>[170] = BOOST_MATH_TEST_VALUE(RealType, 53257594467.89999961853027343750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[170] = BOOST_MATH_TEST_VALUE(RealType, 21.62457581342108689488281822101116435173593410522139124663366619300728455522058827136186640157150006);
|
||||
zs<RealType>[171] = BOOST_MATH_TEST_VALUE(RealType, 106515188936.2999992370605468750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[171] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626920637793567947968920002916518604504482941952960611736969307899126632949710731838314939535);
|
||||
zs<RealType>[172] = BOOST_MATH_TEST_VALUE(RealType, 106515188936.7999992370605468750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[172] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626921087052760828375602269251105477904207815836374209426134525952488796027799984818720270105);
|
||||
zs<RealType>[173] = BOOST_MATH_TEST_VALUE(RealType, 106515188937.2999992370605468750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[173] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626921536311953706677275954356032288516798309826935596847224545105365234647336923162745148650);
|
||||
zs<RealType>[174] = BOOST_MATH_TEST_VALUE(RealType, 106515188937.7999992370605468750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[174] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626921985571146582873941058251041835477955178166028729368533877454281235062918122417686844554);
|
||||
zs<RealType>[175] = BOOST_MATH_TEST_VALUE(RealType, 106515188938.2999992370605468750000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[175] = BOOST_MATH_TEST_VALUE(RealType, 22.28752626922434830339456965597580955876917923101340004236523230885349136854795158825395309771408668);
|
||||
zs<RealType>[176] = BOOST_MATH_TEST_VALUE(RealType, 213030377877.0999984741210937500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[176] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498044370189057193061229322652798069141485425830911821689634860387911575520267236257752886);
|
||||
zs<RealType>[177] = BOOST_MATH_TEST_VALUE(RealType, 213030377877.5999984741210937500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[177] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498269279111869452328160161214112251666554529993600600683165630516488115832469896181046045);
|
||||
zs<RealType>[178] = BOOST_MATH_TEST_VALUE(RealType, 213030377878.0999984741210937500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[178] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498494188034681184635345858036581911693953330207290531058251991996389235617064799550256701);
|
||||
zs<RealType>[179] = BOOST_MATH_TEST_VALUE(RealType, 213030377878.5999984741210937500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[179] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498719096957492389982786415591514868991446226878757600605585200116652511909077437303220322);
|
||||
zs<RealType>[180] = BOOST_MATH_TEST_VALUE(RealType, 213030377879.0999984741210937500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[180] = BOOST_MATH_TEST_VALUE(RealType, 22.95132494498944005880303068370481836350218943309407900398512057690019248825245765368449728229683978);
|
||||
zs<RealType>[181] = BOOST_MATH_TEST_VALUE(RealType, 426060755758.6999969482421875000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[181] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645786617198666287725520753845230512592375445890316693635014712570198963226722376898746719788);
|
||||
zs<RealType>[182] = BOOST_MATH_TEST_VALUE(RealType, 426060755759.1999969482421875000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[182] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645786729785413748555882136649105347335405111452573107829620408251494572350634646372518383704);
|
||||
zs<RealType>[183] = BOOST_MATH_TEST_VALUE(RealType, 426060755759.6999969482421875000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[183] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645786842372161209254336341886225886040142987940947830085760720112665756558438930745003988259);
|
||||
zs<RealType>[184] = BOOST_MATH_TEST_VALUE(RealType, 426060755760.1999969482421875000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[184] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645786954958908669820883369556901450401232685427846511608592597720877347644103130699500020980);
|
||||
zs<RealType>[185] = BOOST_MATH_TEST_VALUE(RealType, 426060755760.6999969482421875000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[185] = BOOST_MATH_TEST_VALUE(RealType, 23.61592645787067545656130255523219661441362113316725652002816962722163580709685521423287347532232663);
|
||||
zs<RealType>[186] = BOOST_MATH_TEST_VALUE(RealType, 852121511521.8999938964843750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[186] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222268328128985001144764937331876138884560895942339750264590092000743925470556345687342935);
|
||||
zs<RealType>[187] = BOOST_MATH_TEST_VALUE(RealType, 852121511522.3999938964843750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[187] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222324684237927811409049669410007439237129556446372910358198486719174460302964062617263997);
|
||||
zs<RealType>[188] = BOOST_MATH_TEST_VALUE(RealType, 852121511522.8999938964843750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[188] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222381040346870588656954830537234790758650044870333521914480895767426200215549894604462944);
|
||||
zs<RealType>[189] = BOOST_MATH_TEST_VALUE(RealType, 852121511523.3999938964843750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[189] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222437396455813332888480420752271669125958665876145325130479060260809395708493929658437074);
|
||||
zs<RealType>[190] = BOOST_MATH_TEST_VALUE(RealType, 852121511523.8999938964843750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[190] = BOOST_MATH_TEST_VALUE(RealType, 24.28128892222493752564756044103626440093831550015823616066865071071416085939189362440560522437633662);
|
||||
zs<RealType>[191] = BOOST_MATH_TEST_VALUE(RealType, 1704243023048.299987792968750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[191] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360307934242599198887438952878908310927656184464570761925753018240286868931047379101991192915);
|
||||
zs<RealType>[192] = BOOST_MATH_TEST_VALUE(RealType, 1704243023048.799987792968750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[192] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360307962450443999814141844483539218897580562586948087460916859526796854661158129821949554554);
|
||||
zs<RealType>[193] = BOOST_MATH_TEST_VALUE(RealType, 1704243023049.299987792968750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[193] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360307990658288800732581258578292473970863909517564631259029126397702972526621236324413898654);
|
||||
zs<RealType>[194] = BOOST_MATH_TEST_VALUE(RealType, 1704243023049.799987792968750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[194] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360308018866133601642757195163172921046426642186059476077116782502974396487792107071563852968);
|
||||
zs<RealType>[195] = BOOST_MATH_TEST_VALUE(RealType, 1704243023050.299987792968750000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[195] = BOOST_MATH_TEST_VALUE(RealType, 24.94737360308047073978402544669654238185405023189173260158888945690205253434326923773189194023738864);
|
||||
zs<RealType>[196] = BOOST_MATH_TEST_VALUE(RealType, 3408486046101.099975585937500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[196] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111548947260493867878972043152010342814420318471604738869697286844100478961752318507519036);
|
||||
zs<RealType>[197] = BOOST_MATH_TEST_VALUE(RealType, 3408486046101.599975585937500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[197] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111563065346677642310736687968026218525976239525273457263820521539063299775063487387395491);
|
||||
zs<RealType>[198] = BOOST_MATH_TEST_VALUE(RealType, 3408486046102.099975585937500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[198] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111577183432861414674405116970646776101208949311878694889082271860331380169436692589290008);
|
||||
zs<RealType>[199] = BOOST_MATH_TEST_VALUE(RealType, 3408486046102.599975585937500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[199] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111591301519045184969977330160478305423319389187668123911964696321646253276250725578473047);
|
||||
zs<RealType>[200] = BOOST_MATH_TEST_VALUE(RealType, 3408486046103.099975585937500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[200] = BOOST_MATH_TEST_VALUE(RealType, 25.61414461111605419605228953197453327538127096375508233833690347792194785120108760652931053928666785);
|
||||
zs<RealType>[201] = BOOST_MATH_TEST_VALUE(RealType, 6816972092206.699951171875000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[201] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336777149103602875189240858590017172273907420428241974657782598001971183829692697893931030);
|
||||
zs<RealType>[202] = BOOST_MATH_TEST_VALUE(RealType, 6816972092207.199951171875000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[202] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336784214888845714766036358708919247411311945160997461946071687776487761293647943181961882);
|
||||
zs<RealType>[203] = BOOST_MATH_TEST_VALUE(RealType, 6816972092207.699951171875000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[203] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336791280674088553825278629338313564287800253072882363885000489322789589683564459399860775);
|
||||
zs<RealType>[204] = BOOST_MATH_TEST_VALUE(RealType, 6816972092208.199951171875000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[204] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336798346459331392366967670478275989571118963232699709422043712865525671390927105068828991);
|
||||
zs<RealType>[205] = BOOST_MATH_TEST_VALUE(RealType, 6816972092208.699951171875000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[205] = BOOST_MATH_TEST_VALUE(RealType, 26.28156863336805412244574230391103482128882389929014678023920695547828528484685657699485259769208741);
|
||||
zs<RealType>[206] = BOOST_MATH_TEST_VALUE(RealType, 13633944184417.89990234375000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[206] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479482406519801256975073261795345435020419867463744516732345674294492529228061805959732327);
|
||||
zs<RealType>[207] = BOOST_MATH_TEST_VALUE(RealType, 13633944184418.39990234375000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[207] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479485942625415366326146401152634296784764225669862897123975110273521017330868675363150448);
|
||||
zs<RealType>[208] = BOOST_MATH_TEST_VALUE(RealType, 13633944184418.89990234375000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[208] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479489478731029475547705331300159611152098923590641458690234001429707091782045185453438171);
|
||||
zs<RealType>[209] = BOOST_MATH_TEST_VALUE(RealType, 13633944184419.39990234375000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[209] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479493014836643584639750052237930871016343368359473040533580595453533790563068986805724019);
|
||||
zs<RealType>[210] = BOOST_MATH_TEST_VALUE(RealType, 13633944184419.89990234375000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[210] = BOOST_MATH_TEST_VALUE(RealType, 26.94961469479496550942257693602280563965957569271416966065840246264353271487273203593602827136860754);
|
||||
zs<RealType>[211] = BOOST_MATH_TEST_VALUE(RealType, 27267888368840.29980468750000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[211] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658132365321120256576467284757880630504909781214698429280000692432972722344046738139460516);
|
||||
zs<RealType>[212] = BOOST_MATH_TEST_VALUE(RealType, 27267888368840.79980468750000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[212] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658134134906748186542924183870772699960645627424489223278978300139646551878816289033156892);
|
||||
zs<RealType>[213] = BOOST_MATH_TEST_VALUE(RealType, 27267888368841.29980468750000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[213] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658135904492376116476972541669907157102168356799570843777496579434166012376207829201011287);
|
||||
zs<RealType>[214] = BOOST_MATH_TEST_VALUE(RealType, 27267888368841.79980468750000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[214] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658137674078004046378612358155285189678948212439453829367032310042341489097274555293104964);
|
||||
zs<RealType>[215] = BOOST_MATH_TEST_VALUE(RealType, 27267888368842.29980468750000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[215] = BOOST_MATH_TEST_VALUE(RealType, 27.61825394658139443663631976247843633326907985440455437378340280356184152787821056110486626668344188);
|
||||
zs<RealType>[216] = BOOST_MATH_TEST_VALUE(RealType, 54535776737685.09960937500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[216] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768658520727223095526336163825405277084208702812195528505679434221769385747727596125338626);
|
||||
zs<RealType>[217] = BOOST_MATH_TEST_VALUE(RealType, 54535776737685.59960937500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[217] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768659406252057469058839388454672293394318546730557386127002114050381424035876354103192624);
|
||||
zs<RealType>[218] = BOOST_MATH_TEST_VALUE(RealType, 54535776737686.09960937500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[218] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768660291776891842583233326734639195028174391562886488418853280961627679416432912568037643);
|
||||
zs<RealType>[219] = BOOST_MATH_TEST_VALUE(RealType, 54535776737686.59960937500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[219] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768661177301726216099517978665306130590007248679624798101760603565428399982488746458503134);
|
||||
zs<RealType>[220] = BOOST_MATH_TEST_VALUE(RealType, 54535776737687.09960937500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[220] = BOOST_MATH_TEST_VALUE(RealType, 28.28745947768662062826560589607693344246673248684048129447128687164847423418296378412381527867603611);
|
||||
zs<RealType>[221] = BOOST_MATH_TEST_VALUE(RealType, 109071553475374.6992187500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[221] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666117150245004622760057983418314410522200232704276775862146736266761022246497551058785007);
|
||||
zs<RealType>[222] = BOOST_MATH_TEST_VALUE(RealType, 109071553475375.1992187500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[222] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666117593357355743548739761689791124679984859813361369105181180764744313352061153147051630);
|
||||
zs<RealType>[223] = BOOST_MATH_TEST_VALUE(RealType, 109071553475375.6992187500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[223] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666118036469706864335392511390934879372874136387705864492100434790697368864211343956938842);
|
||||
zs<RealType>[224] = BOOST_MATH_TEST_VALUE(RealType, 109071553475376.1992187500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[224] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666118479582057985120016232521745693192563248069260165217440327859683071396461341530343065);
|
||||
zs<RealType>[225] = BOOST_MATH_TEST_VALUE(RealType, 109071553475376.6992187500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[225] = BOOST_MATH_TEST_VALUE(RealType, 28.95720614666118922694409105902610925082223584730747380499718597765232850574002390696473010380772407);
|
||||
zs<RealType>[226] = BOOST_MATH_TEST_VALUE(RealType, 218143106950753.8984375000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[226] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118774188445791042660254784305836995418567274505820949514291909017768623167600827442630858);
|
||||
zs<RealType>[227] = BOOST_MATH_TEST_VALUE(RealType, 218143106950754.3984375000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[227] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118774410169407734916144601996690190995667210727468326746331358762853812415838063247614151);
|
||||
zs<RealType>[228] = BOOST_MATH_TEST_VALUE(RealType, 218143106950754.8984375000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[228] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118774631893024427171526754670674911118564686113352807043233143508066106374847716587931185);
|
||||
zs<RealType>[229] = BOOST_MATH_TEST_VALUE(RealType, 218143106950755.3984375000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[229] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118774853616641119426401242327791158113151699337805013921071479703774514043229472570138003);
|
||||
zs<RealType>[230] = BOOST_MATH_TEST_VALUE(RealType, 218143106950755.8984375000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[230] = BOOST_MATH_TEST_VALUE(RealType, 29.62747043118775075340257811680768064968038934305320249075139583789870247295334960013555124352240919);
|
||||
zs<RealType>[231] = BOOST_MATH_TEST_VALUE(RealType, 436286213901512.2968750000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[231] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507210180178060183512748657385641403633979025174401415202721913219462712200443246592017);
|
||||
zs<RealType>[232] = BOOST_MATH_TEST_VALUE(RealType, 436286213901512.7968750000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[232] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507321122179075661323950744341840810124864190846957886463039301370908060223378776053761);
|
||||
zs<RealType>[233] = BOOST_MATH_TEST_VALUE(RealType, 436286213901513.2968750000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[233] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507432064180091139008139023924952729670215908087118481612362461688278748768609693129214);
|
||||
zs<RealType>[234] = BOOST_MATH_TEST_VALUE(RealType, 436286213901513.7968750000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[234] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507543006181106616565313496134977453237197516164536262012622641950793744512740976903471);
|
||||
zs<RealType>[235] = BOOST_MATH_TEST_VALUE(RealType, 436286213901514.2968750000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[235] = BOOST_MATH_TEST_VALUE(RealType, 30.29823029316507653948182122093995474160971915271792972354347864284901025700020408100899889264653839);
|
||||
zs<RealType>[236] = BOOST_MATH_TEST_VALUE(RealType, 872572427803029.0937500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[236] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926454870573870105381204121080031682700579571979417608023815834802026646642551756529303);
|
||||
zs<RealType>[237] = BOOST_MATH_TEST_VALUE(RealType, 872572427803029.5937500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[237] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926510380014769927740975753101903356685400661074674057071774744000291503524870439239858);
|
||||
zs<RealType>[238] = BOOST_MATH_TEST_VALUE(RealType, 872572427803030.0937500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[238] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926565889455669750068970579501127050404305753044873046035266500692837850798788777465676);
|
||||
zs<RealType>[239] = BOOST_MATH_TEST_VALUE(RealType, 872572427803030.5937500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[239] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926621398896569572365188600277702800255782702903047591596266870263378125202082655252570);
|
||||
zs<RealType>[240] = BOOST_MATH_TEST_VALUE(RealType, 872572427803031.0937500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[240] = BOOST_MATH_TEST_VALUE(RealType, 30.96946505745926676908337469394629629815431630642638319365662168161753441065238424482444892944732090);
|
||||
zs<RealType>[241] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606062.687500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[241] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368555045568380920065773046212688909377117164466588005747217968807471779219205518025563);
|
||||
zs<RealType>[242] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606063.187500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[242] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368582818730773733152774326033355552322481669720170248660524963440150598888428761058290);
|
||||
zs<RealType>[243] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606063.687500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[243] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368610591893166546231825808704138452046802967409474774871621840817874673003149159950917);
|
||||
zs<RealType>[244] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606064.187500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[244] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368638365055559359302927494225037613103195710423753246607554009944184530654853462065205);
|
||||
zs<RealType>[245] = BOOST_MATH_TEST_VALUE(RealType, 1745144855606064.687500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[245] = BOOST_MATH_TEST_VALUE(RealType, 31.64115530270368666138217952172366079382596053040044774551652253413904860066772832705321064573507936);
|
||||
zs<RealType>[246] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212129.875000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[246] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725912255296233554695621993095527834620867411002883617418802445848848920754168937963900);
|
||||
zs<RealType>[247] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212130.375000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[247] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725926150732198502036790376252498771483422694718006966861906633408209207371317438042436);
|
||||
zs<RealType>[248] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212130.875000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[248] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725940046168163449375969968196897954449339669242357827673003495386979661882340839494652);
|
||||
zs<RealType>[249] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212131.375000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[249] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725953941604128396713160768928725384088153564235657069057463593847925585888659769685682);
|
||||
zs<RealType>[250] = BOOST_MATH_TEST_VALUE(RealType, 3490289711212131.875000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[250] = BOOST_MATH_TEST_VALUE(RealType, 32.31328276274725967837040093344048362778447981060969399609357625315535190876608557675610677996463049);
|
||||
zs<RealType>[251] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424264.250000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[251] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604679088719826542088155377570542413337629407446260913838808164256711555296996403852860);
|
||||
zs<RealType>[252] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424264.750000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[252] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604686040692677719047881106035406644182281598485405113601440205771668223737335876041818);
|
||||
zs<RealType>[253] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424265.250000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[253] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604692992665528896007109314624214905869648472859408505262279189002691227175712262681487);
|
||||
zs<RealType>[254] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424265.750000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[254] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604699944638380072965840003336967198470969416928902364624408970718516308377862696183264);
|
||||
zs<RealType>[255] = BOOST_MATH_TEST_VALUE(RealType, 6980579422424266.250000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[255] = BOOST_MATH_TEST_VALUE(RealType, 32.98583023753604706896611231249924073172173663522057483817054517952187667696583584412183600018203736);
|
||||
zs<RealType>[256] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848533.00000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[256] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097095124298518143702077667858405885409410230992311053881919684167704487215990113228857);
|
||||
zs<RealType>[257] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848533.50000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[257] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097098602331016061647350048233624732159922625861798362865689925616857240391773797386011);
|
||||
zs<RealType>[258] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848534.00000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[258] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097102080363513979592497971278809664223503486445169932919366667254889157695575939580298);
|
||||
zs<RealType>[259] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848534.50000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[259] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097105558396011897537521436993960681609063435549611864140613496327710388308960838614952);
|
||||
zs<RealType>[260] = BOOST_MATH_TEST_VALUE(RealType, 13961158844848535.00000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[260] = BOOST_MATH_TEST_VALUE(RealType, 33.65878151237097109036428509815482420445379077784325513095982310255670016959177612483326392564338403);
|
||||
zs<RealType>[261] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697070.50000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[261] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954182192055400546316699688336088176596379963232567718408755304304153654131361648983188);
|
||||
zs<RealType>[262] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697071.00000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[262] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954183932056272117319130023138040040443817185436738411951668715588692235416442685371045);
|
||||
zs<RealType>[263] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697071.50000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[263] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954185672057143688321529225011483876409341147922608312437009263576524224673465664622416);
|
||||
zs<RealType>[264] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697072.00000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[264] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954187412058015259323897293956419684494066363206316215367067849034858025290827895879418);
|
||||
zs<RealType>[265] = BOOST_MATH_TEST_VALUE(RealType, 27922317689697072.50000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[265] = BOOST_MATH_TEST_VALUE(RealType, 34.33212128461954189152058886830326234229972847464699107343804000916184280580506932042040723667339789);
|
||||
zs<RealType>[266] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394145.50000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[266] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518695935331739482145723160151536139963974678105921205914075721658873691195091665811270);
|
||||
zs<RealType>[267] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394146.00000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[267] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518696805806331425691633367772960837479285214203859766210400707178436995199558318407295);
|
||||
zs<RealType>[268] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394146.50000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[268] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518697676280923369237535787688894919552843836080956969078417834382970920191457114876432);
|
||||
zs<RealType>[269] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394147.00000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[269] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518698546755515312783430419899338386184789940110157674808234768343577335618132616959765);
|
||||
zs<RealType>[270] = BOOST_MATH_TEST_VALUE(RealType, 55844635379394147.50000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[270] = BOOST_MATH_TEST_VALUE(RealType, 35.00583509707518699417230107256329317264404291237375262922664406743686215997702269925047177260404215);
|
||||
zs<RealType>[271] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788295.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[271] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728324006370419405415632798743326857723995400791753575138185111578870305633556551072352);
|
||||
zs<RealType>[272] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788296.0000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[272] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728324441836204273681992689740132873188907673425746295594512007334247458414132014763631);
|
||||
zs<RealType>[273] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788296.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[273] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728324877301989141948350632733717201783214881466640664746188099504650620747906266396850);
|
||||
zs<RealType>[274] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788297.0000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[274] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728325312767774010214706627724079843506934459363078248730870402916016710439865808348504);
|
||||
zs<RealType>[275] = BOOST_MATH_TEST_VALUE(RealType, 111689270758788297.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[275] = BOOST_MATH_TEST_VALUE(RealType, 35.67990927725728325748233558878481060674711220798360083841563700613685981848455744088126373390197417);
|
||||
zs<RealType>[276] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576595.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[276] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076284552001564306302504927318242547212268948185919007001226970738285875013148048139909);
|
||||
zs<RealType>[277] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576596.0000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[277] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076284769844633707581493482388002617376992599930776877134475450868721982023076025880187);
|
||||
zs<RealType>[278] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576596.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[278] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076284987687703108860481550197556889556172047264008790594215563414633410406449425201228);
|
||||
zs<RealType>[279] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576597.0000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[279] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076285205530772510139469130746905363749809470683776684452160660198665349883658913823376);
|
||||
zs<RealType>[280] = BOOST_MATH_TEST_VALUE(RealType, 223378541517576597.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[280] = BOOST_MATH_TEST_VALUE(RealType, 36.35433088203076285423373841911418456224036048039957907050688242495780009454648985107688288289511577);
|
||||
zs<RealType>[281] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153195.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[281] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400134712267319905290193660562118300513507830516933879565438304668183143470276536696);
|
||||
zs<RealType>[282] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153196.0000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[282] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400243686962505878682539242575730874103256160022984465712010716817361916571773853546);
|
||||
zs<RealType>[283] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153196.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[283] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400352661657691852074762947010360082635121697561514628341391528501142658520743630365);
|
||||
zs<RealType>[284] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153197.0000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[284] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400461636352877825466864773866005926109377149011203944059666845076630112677861392210);
|
||||
zs<RealType>[285] = BOOST_MATH_TEST_VALUE(RealType, 446757083035153197.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[285] = BOOST_MATH_TEST_VALUE(RealType, 37.02908764699829400570611048063798858844723142668404526295220250731989472007381590773195282652560254);
|
||||
zs<RealType>[286] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306395.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[286] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555320136342385675657230684506000440195815556999407621228993843426869578896616407720);
|
||||
zs<RealType>[287] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306396.0000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[287] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555374649355515368083078169249852645520316613216452931331516160499635557395351284563);
|
||||
zs<RealType>[288] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306396.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[288] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555429162368645060508895169517366721864271816097307727758099155612982661657855356471);
|
||||
zs<RealType>[289] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306397.0000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[289] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555483675381774752934681685308542669227715271188344812250649110477219885655515210238);
|
||||
zs<RealType>[290] = BOOST_MATH_TEST_VALUE(RealType, 893514166070306397.5000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[290] = BOOST_MATH_TEST_VALUE(RealType, 37.70416794018226555538188394904445360437716623380487610681084035936986551015065343719767859121005169);
|
||||
zs<RealType>[291] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612795.500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[291] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972598482293827813436342029687218073991385854219392107138609564999755336816382782882);
|
||||
zs<RealType>[292] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612796.000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[292] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972625751198813595667063367232609526061670475810039080545891532051379509177129548620);
|
||||
zs<RealType>[293] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612796.500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[293] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972653020103799377897777080019019814937016569594146159440469991463659659940941732350);
|
||||
zs<RealType>[294] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612797.000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[294] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972680289008785160128483168046448940617428400853168904877026810016036680752500851451);
|
||||
zs<RealType>[295] = BOOST_MATH_TEST_VALUE(RealType, 1787028332140612797.500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[295] = BOOST_MATH_TEST_VALUE(RealType, 38.37956071956958972707557913770942359181631314896903102910234868562877910240275114213945213826099662);
|
||||
zs<RealType>[296] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225595.500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[296] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357397288405889113661262090376242531189140228166174913957175516846453031303867939318);
|
||||
zs<RealType>[297] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225596.000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[297] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357410928851167839535330306428730324674240848562357412341096307490721136888569495897);
|
||||
zs<RealType>[298] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225596.500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[298] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357424569296446565409396615412474444985847532731674289519382422208292858248536499652);
|
||||
zs<RealType>[299] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225597.000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[299] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357438209741725291283461017327474892123960814086338854298164097945903007554014878729);
|
||||
zs<RealType>[300] = BOOST_MATH_TEST_VALUE(RealType, 3574056664281225597.500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[300] = BOOST_MATH_TEST_VALUE(RealType, 39.05525549414090357451850187004017157523512173731666088581226038564415483571347831884995089329885967);
|
||||
zs<RealType>[301] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451195.500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[301] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727783498401939051909927376255844770721021129458386841998457593172268879366938255929);
|
||||
zs<RealType>[302] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451196.000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[302] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727790321522786904454299244826066833347409818515980037701571602976213801388272915974);
|
||||
zs<RealType>[303] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451196.500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[303] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727797144643634756998670636416712076247668418626969651461616512047870718042117101998);
|
||||
zs<RealType>[304] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451197.000000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[304] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727803967764482609543041551027780499421796996498319224892410706675338130329932555167);
|
||||
zs<RealType>[305] = BOOST_MATH_TEST_VALUE(RealType, 7148113328562451197.500000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[305] = BOOST_MATH_TEST_VALUE(RealType, 39.73124228804812727810790885330462087411988659272102869795618836992299607772559151572452093096440915);
|
||||
zs<RealType>[306] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902395.50000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[306] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677831479038829047423830224736434558035742829431520714244678484344822558100019565300);
|
||||
zs<RealType>[307] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902396.00000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[307] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677834892001619303911408381392078589832744493031890002310138573922908458466967872121);
|
||||
zs<RealType>[308] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902396.50000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[308] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677838304964409560398986418751480292907711652892277321787302547236270065870054677767);
|
||||
zs<RealType>[309] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902397.00000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[309] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677841717927199816886564336814639667260644317354730947215019219733421649211897790576);
|
||||
zs<RealType>[310] = BOOST_MATH_TEST_VALUE(RealType, 14296226657124902397.50000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[310] = BOOST_MATH_TEST_VALUE(RealType, 40.40751160764139677845130889990073374142135581556712891542494761299153132137405987788970971812438268);
|
||||
zs<RealType>[311] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804795.50000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[311] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601512650396438190311342038447614710861375772179966198427428166270594434592188846742);
|
||||
zs<RealType>[312] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804796.00000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[312] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601514357556751058240524595848620754197445685531919168072376579651061145028382528801);
|
||||
zs<RealType>[313] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804796.50000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[313] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601516064717063926169707123413145503282985377893953090450589428836799851249587190162);
|
||||
zs<RealType>[314] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804797.00000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[314] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601517771877376794098889621141188958117994850309268653710559007455198782311971328872);
|
||||
zs<RealType>[315] = BOOST_MATH_TEST_VALUE(RealType, 28592453314249804797.50000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[315] = BOOST_MATH_TEST_VALUE(RealType, 41.08405441107886601519479037689662028072089032751118702474103821066546000777609078929437453810254475);
|
||||
zs<RealType>[316] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609595.50000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[316] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568641375217383589970289192285524027455320442791145685452599382947676049441268469929);
|
||||
zs<RealType>[317] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609596.00000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[317] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568642229126383956807166540537938630285140147251930665093550545985675206920712567685);
|
||||
zs<RealType>[318] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609596.50000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[318] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568643083035384323644043881328226871966400896425186789096638830671067070738275427294);
|
||||
zs<RealType>[319] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609597.00000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[319] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568643936944384690480921214656388752499102690441367931200542104387248813871592477758);
|
||||
zs<RealType>[320] = BOOST_MATH_TEST_VALUE(RealType, 57184906628499609597.50000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[320] = BOOST_MATH_TEST_VALUE(RealType, 41.76086208028139568644790853385057317798540522424271883245529430927965143938234514196380710928511911);
|
||||
zs<RealType>[321] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219195.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[321] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322372868984974754605356116106151045232696170539516224623515519078402644518190519926);
|
||||
zs<RealType>[322] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219196.0000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[322] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322373296098832611092973985577032241411056103015380922288812869321261489035558578068);
|
||||
zs<RealType>[323] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219196.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[323] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322373723212690467580591853181653964600305518073422329365062099792146842039711851587);
|
||||
zs<RealType>[324] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219197.0000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[324] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322374150326548324068209718920016214800444415729953689875272821439439139550720636184);
|
||||
zs<RealType>[325] = BOOST_MATH_TEST_VALUE(RealType, 114369813256999219197.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[325] = BOOST_MATH_TEST_VALUE(RealType, 42.43792639501924322374577440406180555827582792118992011472796001288247842454645211304904107994414835);
|
||||
zs<RealType>[326] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438395.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[326] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669327806140448370484701263856771509543516859403088443747042918192039960542776140113);
|
||||
zs<RealType>[327] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438396.0000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[327] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669328019774638303987145009950720434908964235203327796824314750703851313533491796197);
|
||||
zs<RealType>[328] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438396.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[328] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669328233408828237489588755577928156076930831411008263669948642260552727690669574065);
|
||||
zs<RealType>[329] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438397.0000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[329] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669328447043018170992032500738394673047416648028169788047545599558661614805384499252);
|
||||
zs<RealType>[330] = BOOST_MATH_TEST_VALUE(RealType, 228739626513998438397.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[330] = BOOST_MATH_TEST_VALUE(RealType, 43.11523950893999669328660677208104494476245432119985820421685056852313720706629294682011828585641323);
|
||||
zs<RealType>[331] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876795.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[331] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193606989766502723445979048572229231465829706451573324407857444527395822448178986007);
|
||||
zs<RealType>[332] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876796.0000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[332] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193607096621073065351333846093585545869129269708118665210449739974464793810457198837);
|
||||
zs<RealType>[333] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876796.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[333] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193607203475643407256688643498213820013963448351011348495071834636284671248086199837);
|
||||
zs<RealType>[334] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876797.0000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[334] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193607310330213749162043440786114053900332242380506462727521879656021426226958496105);
|
||||
zs<RealType>[335] = BOOST_MATH_TEST_VALUE(RealType, 457479253027996876797.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[335] = BOOST_MATH_TEST_VALUE(RealType, 43.79279392736654193607417184784091067398237957286247528235651796859096373598026176840193967666274999);
|
||||
zs<RealType>[336] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753595.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[336] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941120173207718823699817102786625650029939710664855583164086060137262356501253929);
|
||||
zs<RealType>[337] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753596.0000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[337] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941173618678344688398957490049536600533594487394087848036718134980749301722731352);
|
||||
zs<RealType>[338] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753596.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[338] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941227064148970553098097848120073848954722626642651975773633390627303626978835838);
|
||||
zs<RealType>[339] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753597.0000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[339] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941280509619596417797238176998237395293324128442445599007428498582436405251992611);
|
||||
zs<RealType>[340] = BOOST_MATH_TEST_VALUE(RealType, 914958506055993753597.5000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[340] = BOOST_MATH_TEST_VALUE(RealType, 44.47058248671115033941333955090222282496378476684027239549398992825366350370700130351606424938744046);
|
||||
zs<RealType>[341] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507195.500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[341] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965056513946129162668050892446138815518047627051292293694179480812556619549313064);
|
||||
zs<RealType>[342] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507196.000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[342] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965083245509992947480958471611883906387208610588018636449042232643595158517689720);
|
||||
zs<RealType>[343] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507196.500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[343] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965109977073856732293866043477021415438855308555056542965567216193304047624510243);
|
||||
zs<RealType>[344] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507197.000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[344] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965136708637720517106773608041551342672987720956394620826737050999033807936751171);
|
||||
zs<RealType>[345] = BOOST_MATH_TEST_VALUE(RealType, 1829917012111987507197.500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[345] = BOOST_MATH_TEST_VALUE(RealType, 45.14859833536711018965163440201584301919681165305473688089605847796021477615534356598131691567620401);
|
||||
zs<RealType>[346] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014395.500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[346] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485628384441561575887407603040339098125590070863967384748247436205190625734118932);
|
||||
zs<RealType>[347] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014396.000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[347] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485641754511313063272748535532950445484624262655288217284652009573499125927466059);
|
||||
zs<RealType>[348] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014396.500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[348] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485655124581064550658089466199799712956218289431848176597105298416189805067325255);
|
||||
zs<RealType>[349] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014397.000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[349] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485668494650816038043430395040886900540372151194146008896781208120907682446939362);
|
||||
zs<RealType>[350] = BOOST_MATH_TEST_VALUE(RealType, 3659834024223975014397.500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[350] = BOOST_MATH_TEST_VALUE(RealType, 45.82683491595294384485681864720567525428771322056212008237085847942680460394853644075297572979160046);
|
||||
zs<RealType>[351] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028795.500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[351] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126393241245457792327323285439769210757132628000124992150426204283421914567175062);
|
||||
zs<RealType>[352] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028796.000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[352] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126399928363674654174459322702292762434851831465004062253014895509105956594317070);
|
||||
zs<RealType>[353] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028796.500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[353] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126406615481891516021595359508227640114777678096555406499545632733378131414467863);
|
||||
zs<RealType>[354] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028797.000000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[354] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126413302600108377868731395857573843796910167894841388830471951540349934300433290);
|
||||
zs<RealType>[355] = BOOST_MATH_TEST_VALUE(RealType, 7319668048447950028797.500000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[355] = BOOST_MATH_TEST_VALUE(RealType, 46.50528594879636847126419989718325239715867431750331373481249300859924373186247387514132847746950458);
|
||||
zs<RealType>[356] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057595.50000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[356] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726859251633008985542795093110678176543525265373739682696782954566791223497853278);
|
||||
zs<RealType>[357] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057596.00000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[357] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726862596204760125343156619941158006313108818081160492017518779133670783309629777);
|
||||
zs<RealType>[358] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057596.50000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[358] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726865940776511265143518146657454680704151512746306706865464848189500564360309989);
|
||||
zs<RealType>[359] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057597.00000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[359] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726869285348262404943879673259568199716653349369186125242127832914687715856217447);
|
||||
zs<RealType>[360] = BOOST_MATH_TEST_VALUE(RealType, 14639336096895900057597.50000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[360] = BOOST_MATH_TEST_VALUE(RealType, 47.18394541655595353726872629920013544744241199747498563350614327949806545149014404489639386204785740);
|
||||
zs<RealType>[361] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115195.50000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[361] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869898641897124874506124538863135227082696257498669984107495807372390982964298765);
|
||||
zs<RealType>[362] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115196.00000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[362] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869900314675402022865409817077027470411443725892317844329022583627504362168195643);
|
||||
zs<RealType>[363] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115196.50000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[363] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869901987453679171224695095262365180124915574419262646462548365901592461409111822);
|
||||
zs<RealType>[364] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115197.00000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[364] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869903660231956319583980373419148356223111803079505365563012583778554165327574562);
|
||||
zs<RealType>[365] = BOOST_MATH_TEST_VALUE(RealType, 29278672193791800115197.50000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[365] = BOOST_MATH_TEST_VALUE(RealType, 47.86280754988806283869905333010233467943265651547376998706032411873046976685354666842288358514164676);
|
||||
zs<RealType>[366] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230395.50000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[366] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135559278566008113536709515501428437696966434378641333376283319594991159197529021);
|
||||
zs<RealType>[367] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230396.00000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[367] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135560115194668751765523308763717061100258732052320085375724211692206634017417835);
|
||||
zs<RealType>[368] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230396.50000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[368] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135560951823329389994337102018864925304218198091079593677878710603131163142362874);
|
||||
zs<RealType>[369] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230397.00000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[369] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135561788451990028223150895266872030308844832494919980201645683875988736222168974);
|
||||
zs<RealType>[370] = BOOST_MATH_TEST_VALUE(RealType, 58557344387583600230397.50000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[370] = BOOST_MATH_TEST_VALUE(RealType, 48.54186681407528073135562625080650666451964688507738376114138635263841366865923999059003342903518356);
|
||||
zs<RealType>[371] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460795.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[371] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917393998803300413713566990752077661423207867413014717692257524895032484088002638);
|
||||
zs<RealType>[372] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460796.0000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[372] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917394417234185551157598495411034248495095320790548697334562191650844059041476016);
|
||||
zs<RealType>[373] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460796.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[373] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917394835665070688601630000068205128804849669368418438086966818342794853392747975);
|
||||
zs<RealType>[374] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460797.0000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[374] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917395254095955826045661504723590302352470913146623955193835326180329431243220210);
|
||||
zs<RealType>[375] = BOOST_MATH_TEST_VALUE(RealType, 117114688775167200460797.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[375] = BOOST_MATH_TEST_VALUE(RealType, 49.22111789654023166917395672526840963489693009377189769137959052125165263899531636372892356694099191);
|
||||
zs<RealType>[376] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921595.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[376] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066060297122022964231700635525977853025814596096151371140753421576539605970700861);
|
||||
zs<RealType>[377] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921596.0000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[377] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066060506394202934831808914814125072797602761455168951650504013758145865501313880);
|
||||
zs<RealType>[378] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921596.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[378] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066060715666382905431917194101825740114881990816754906595137018341539085351050643);
|
||||
zs<RealType>[379] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921597.0000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[379] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066060924938562876032025473389079854977652284180909237880745343386717050876814609);
|
||||
zs<RealType>[380] = BOOST_MATH_TEST_VALUE(RealType, 234229377550334400921597.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[380] = BOOST_MATH_TEST_VALUE(RealType, 49.90055569517561383066061134210742846632133752675887417385913641547631947413421896953677547435497030);
|
||||
zs<RealType>[381] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843195.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[381] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561317487206707303802427632079894747824628285067346330316982070607470750276538);
|
||||
zs<RealType>[382] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843196.0000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[382] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561422150925313668179339445554345979082699726978571301972512528171705027852141);
|
||||
zs<RealType>[383] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843196.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[383] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561526814643920032556251258917128490508500217173303906663500224210793499988710);
|
||||
zs<RealType>[384] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843197.0000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[384] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561631478362526396933163072168242282102029755651544382718152403729363436471691);
|
||||
zs<RealType>[385] = BOOST_MATH_TEST_VALUE(RealType, 468458755100668801843197.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[385] = BOOST_MATH_TEST_VALUE(RealType, 50.58017530742747300164561736142081132761310074885307687353863288342413292968464676311732042107085768);
|
||||
zs<RealType>[386] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686395.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[386] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650352849612123815153250964411406464644865827787863050268704653756510450468474031);
|
||||
zs<RealType>[387] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686396.0000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[387] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650352901957441589305691661161083072884708823213628905949128284896989478240192251);
|
||||
zs<RealType>[388] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686396.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[388] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650352954302759363458132357910731756493593984931372662548695557807862606879386793);
|
||||
zs<RealType>[389] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686397.0000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[389] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650353006648077137610573054660352515471521312941094320097205602449555540058022069);
|
||||
zs<RealType>[390] = BOOST_MATH_TEST_VALUE(RealType, 936917510201337603686397.5000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[390] = BOOST_MATH_TEST_VALUE(RealType, 51.25997202007432193650353058993394911763013751409945349818490807242793878624457548782493981448062444);
|
||||
zs<RealType>[391] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372795.500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[391] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394011661732720227488151829956542922851698538021522622862634588975916535124465);
|
||||
zs<RealType>[392] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372796.000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[392] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394037840949666263721928778536979472743471765062641780884974428552475054902084);
|
||||
zs<RealType>[393] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372796.500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[393] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394064020166612299955705727110433050351349588454562078192850302725642051437996);
|
||||
zs<RealType>[394] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372797.000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[394] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394090199383558336189482675676903655675332008197283518512140013107034885992383);
|
||||
zs<RealType>[395] = BOOST_MATH_TEST_VALUE(RealType, 1873835020402675207372797.500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[395] = BOOST_MATH_TEST_VALUE(RealType, 51.93994129964973319883394116378600504372423259624236391288715419024290806105568721361308270919825427);
|
||||
zs<RealType>[396] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745595.500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[396] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780063098329226609433897361719442410811576805026853884099017649824976199940727);
|
||||
zs<RealType>[397] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745596.000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[397] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780076191134345038026463351561571010291457420668319272155773248903735412098606);
|
||||
zs<RealType>[398] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745596.500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[398] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780089283939463466619029341401953424656920848830320946683691731827935418315374);
|
||||
zs<RealType>[399] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745597.000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[399] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780102376744581895211595331240589653907967089512858908148627964024886502244786);
|
||||
zs<RealType>[400] = BOOST_MATH_TEST_VALUE(RealType, 3747670040805350414745597.500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[400] = BOOST_MATH_TEST_VALUE(RealType, 52.62007878346056146247780115469549700323804161321077479698044596142715933157016436810921898947540595);
|
||||
zs<RealType>[401] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491195.500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[401] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472014163526750381732629683760414977652728398062761064036427478928134573151026);
|
||||
zs<RealType>[402] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491196.000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[402] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472020711487963758347144588443668839144673170417842073148009181357862290045625);
|
||||
zs<RealType>[403] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491196.500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[403] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472027259449177134961659493126486046636359084837495933357183600363141237458038);
|
||||
zs<RealType>[404] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491197.000000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[404] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472033807410390511576174397808866600127786141321722644722197229302630959626241);
|
||||
zs<RealType>[405] = BOOST_MATH_TEST_VALUE(RealType, 7495340081610700829491197.500000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[405] = BOOST_MATH_TEST_VALUE(RealType, 53.30038027115703847068472040355371603888190689302490810499618954339870522207301296561534991000788215);
|
||||
zs<RealType>[406] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982395.50000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[406] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159106988030207256464803953686021292403364974364396941211684129467560225025844);
|
||||
zs<RealType>[407] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982396.00000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[407] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159110262771031569979287106207337111164630527719599256075269757642116173324604);
|
||||
zs<RealType>[408] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982396.50000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[408] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159113537511855883493770258728543740166820971925093788175661756375535881272212);
|
||||
zs<RealType>[409] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982397.00000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[409] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159116812252680197008253411249641179409936306980880537520142720731872132566761);
|
||||
zs<RealType>[410] = BOOST_MATH_TEST_VALUE(RealType, 14990680163221401658982397.50000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[410] = BOOST_MATH_TEST_VALUE(RealType, 53.98084171681467787755159120086993504510522736563770629428893976532886959504115995245775177710906343);
|
||||
zs<RealType>[411] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964795.50000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[411] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966829050076057809819624810698856060190684715860519885138243117049542515690575);
|
||||
zs<RealType>[412] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964796.00000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[412] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966830687817369095124791690640312773832665397033630245360990420711923237519040);
|
||||
zs<RealType>[413] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964796.50000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[413] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966832325558680380429958570581742183631816048451505614209676496718115749779207);
|
||||
zs<RealType>[414] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964797.00000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[414] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966833963299991665735125450523144289588136670114145991685211886837782686269634);
|
||||
zs<RealType>[415] = BOOST_MATH_TEST_VALUE(RealType, 29981360326442803317964797.50000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[415] = BOOST_MATH_TEST_VALUE(RealType, 54.66145922149126997883966835601041302951040292330464519091701627262021551377788507132840586680788883);
|
||||
zs<RealType>[416] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929595.50000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[416] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082008163468252474529527756164189713179328516307078639643598839828067574841328);
|
||||
zs<RealType>[417] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929596.00000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[417] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082008982519917191333658353569747274840211384876036940931564577326778739937441);
|
||||
zs<RealType>[418] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929596.50000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[418] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082009801571581908137788950975298008978578466315835299634785170757312736330548);
|
||||
zs<RealType>[419] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929597.00000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[419] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082010620623246624941919548380841915594429760626473715753374464347315926011244);
|
||||
zs<RealType>[420] = BOOST_MATH_TEST_VALUE(RealType, 59962720652885606635929597.50000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[420] = BOOST_MATH_TEST_VALUE(RealType, 55.34222902622527492285082011439674911341746050145786378994687765267807952189287446302324434670970122);
|
||||
zs<RealType>[421] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859195.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[421] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005744109529240544406880337828236840721418957676877238000505091488001795651201);
|
||||
zs<RealType>[422] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859196.0000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[422] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005744519143435523841317719330604019896557212385538515430219236320724445839119);
|
||||
zs<RealType>[423] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859196.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[423] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005744928757630503275755100832969491810004678229237746659550758636675578428967);
|
||||
zs<RealType>[424] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859197.0000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[424] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005745338371825482710192482335333256461761355207974931688513892197266161560978);
|
||||
zs<RealType>[425] = BOOST_MATH_TEST_VALUE(RealType, 119925441305771213271859197.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[425] = BOOST_MATH_TEST_VALUE(RealType, 56.02314750544467013866005745747986020462144629863837695313851827243321750070517122870763907163375388);
|
||||
zs<RealType>[426] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718395.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[426] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574964727179808543930859767697217112818536350797368921774672172293682473225055);
|
||||
zs<RealType>[427] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718396.0000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[427] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574964932030053738025902058853016475070045198068571647010983824313512015423280);
|
||||
zs<RealType>[428] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718396.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[428] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574965136880298932120944350008815410413130287269798806862098501994253827046627);
|
||||
zs<RealType>[429] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718397.0000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[429] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574965341730544126215986641164613918847791618401050401328017984950518641062487);
|
||||
zs<RealType>[430] = BOOST_MATH_TEST_VALUE(RealType, 239850882611542426543718397.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[430] = BOOST_MATH_TEST_VALUE(RealType, 56.70421116075780244670574965546580789320311028932320412000374029191462326430408744052796917190438247);
|
||||
zs<RealType>[431] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436795.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[431] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531277886245290205731446363101869106286487064764410271386990754234755642855);
|
||||
zs<RealType>[432] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436796.0000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[432] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531380332442757645839844021552846525681769285188952591218983091633569244771);
|
||||
zs<RealType>[433] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436796.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[433] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531482778640225085948241680003717195267123172907693535943393631252233528007);
|
||||
zs<RealType>[434] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436797.0000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[434] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531585224837692526056639338454481115042548727920633105560444873053490520850);
|
||||
zs<RealType>[435] = BOOST_MATH_TEST_VALUE(RealType, 479701765223084853087436797.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[435] = BOOST_MATH_TEST_VALUE(RealType, 57.38541661510006336367991531687671035159966165036996905138285008045950227771300070359317000082251587);
|
||||
zs<RealType>[436] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873595.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[436] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554057973484251633179872231742522867479304887734423959008177810507929372980502);
|
||||
zs<RealType>[437] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873596.0000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[437] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554058024717646818581642633527555088229229848978856650264562082058837873668151);
|
||||
zs<RealType>[438] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873596.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[438] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554058075951042003983413035312587282286158171800872330936800027595921615283052);
|
||||
zs<RealType>[439] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873597.0000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[439] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554058127184437189385183437097619449650089856200471001024891674937552098289649);
|
||||
zs<RealType>[440] = BOOST_MATH_TEST_VALUE(RealType, 959403530446169706174873597.5000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[440] = BOOST_MATH_TEST_VALUE(RealType, 58.06676060721227034055554058178417832374786953838882651590321024902177652660528837051902100823152388);
|
||||
zs<RealType>[441] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747195.500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[441] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363299726206609746705489474024632685397908027036826962303868666955918111538);
|
||||
zs<RealType>[442] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747196.000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[442] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363325347935999834589083288276642972035197649807101708168936227006895175343);
|
||||
zs<RealType>[443] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747196.500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[443] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363350969665389922472677102528646584069120432472031910137509227273894302196);
|
||||
zs<RealType>[444] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747197.000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[444] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363376591394780010356270916780643521499676375031617568209591145770868885078);
|
||||
zs<RealType>[445] = BOOST_MATH_TEST_VALUE(RealType, 1918807060892339412349747197.500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[445] = BOOST_MATH_TEST_VALUE(RealType, 58.74823998642851741200079363402213124170098239864731032633784326865477485858682385185460511772316968);
|
||||
zs<RealType>[446] = BOOST_MATH_TEST_VALUE(RealType, 3837614121784678824699494395.500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[446] = BOOST_MATH_TEST_VALUE(RealType, 59.42985170775297409538727174934638672334406646723725983740951105026349221807009071850919012663041550);
|
||||
zs<RealType>[447] = BOOST_MATH_TEST_VALUE(RealType, 3837614121784678824699494396.000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[447] = BOOST_MATH_TEST_VALUE(RealType, 59.42985170775297409538727174947451996655623151231730299282486521387670139214046503255303771865999613);
|
||||
zs<RealType>[448] = BOOST_MATH_TEST_VALUE(RealType, 3837614121784678824699494396.500000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[448] = BOOST_MATH_TEST_VALUE(RealType, 59.42985170775297409538727174960265320976839655739734614822352956044016003363242954851814317386540390);
|
||||
zs<RealType>[449] = BOOST_MATH_TEST_VALUE(RealType, 3837614121784678824699494397.000000000000000000000000000000000000000000000000000000000000000000000000);
|
||||
ws<RealType>[449] = BOOST_MATH_TEST_VALUE(RealType, 59.42985170775297409538727174973078645298056160247738930360550408995386814254598426640885488605351946);
|
||||
};
|
||||
// End of lambert_w_mp_high_values.ipp
|
||||
236
test/lambert_w_low_reference_values.ipp
Normal file
@@ -0,0 +1,236 @@
|
||||
|
||||
// A collection of Lambert W test values computed using 100 decimal digits precision.
|
||||
// C++ floating-point type is RealType.
|
||||
|
||||
// Written by lambert_w_mp_test_values.cpp Tue Oct 10 14:35:08 2017
|
||||
|
||||
// Copyright Paul A. Bristow 2017.
|
||||
// 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)
|
||||
|
||||
// Size of arrays of arguments z and Lambert W
|
||||
static const unsigned int noof_tests = 100;
|
||||
// Declare arrays of arguments z and Lambert W(z)
|
||||
// The values are defined using the macro BOOST_MATH_TEST_VALUE to ensure
|
||||
// that both built-in and multiprecision types are correctly initialiased with full precision.
|
||||
// built-in types like double require a floating-point literal like 3.14,
|
||||
// but multiprecision types require a decimal digit string like "3.14".
|
||||
|
||||
|
||||
template <typename RealType>
|
||||
static RealType zs[100];
|
||||
|
||||
template <typename RealType>
|
||||
static RealType ws[100];
|
||||
|
||||
template <typename RealType>
|
||||
void init_zs()
|
||||
{
|
||||
zs<RealType>[0] = BOOST_MATH_TEST_VALUE(RealType, -0.35);
|
||||
zs<RealType>[1] = BOOST_MATH_TEST_VALUE(RealType, -0.34);
|
||||
zs<RealType>[2] = BOOST_MATH_TEST_VALUE(RealType, -0.33);
|
||||
zs<RealType>[3] = BOOST_MATH_TEST_VALUE(RealType, -0.32);
|
||||
zs<RealType>[4] = BOOST_MATH_TEST_VALUE(RealType, -0.31);
|
||||
zs<RealType>[5] = BOOST_MATH_TEST_VALUE(RealType, -0.3);
|
||||
zs<RealType>[6] = BOOST_MATH_TEST_VALUE(RealType, -0.29);
|
||||
zs<RealType>[7] = BOOST_MATH_TEST_VALUE(RealType, -0.28);
|
||||
zs<RealType>[8] = BOOST_MATH_TEST_VALUE(RealType, -0.27);
|
||||
zs<RealType>[9] = BOOST_MATH_TEST_VALUE(RealType, -0.26);
|
||||
zs<RealType>[10] = BOOST_MATH_TEST_VALUE(RealType, -0.25);
|
||||
zs<RealType>[11] = BOOST_MATH_TEST_VALUE(RealType, -0.24);
|
||||
zs<RealType>[12] = BOOST_MATH_TEST_VALUE(RealType, -0.23);
|
||||
zs<RealType>[13] = BOOST_MATH_TEST_VALUE(RealType, -0.22);
|
||||
zs<RealType>[14] = BOOST_MATH_TEST_VALUE(RealType, -0.21);
|
||||
zs<RealType>[15] = BOOST_MATH_TEST_VALUE(RealType, -0.2);
|
||||
zs<RealType>[16] = BOOST_MATH_TEST_VALUE(RealType, -0.19);
|
||||
zs<RealType>[17] = BOOST_MATH_TEST_VALUE(RealType, -0.18);
|
||||
zs<RealType>[18] = BOOST_MATH_TEST_VALUE(RealType, -0.17);
|
||||
zs<RealType>[19] = BOOST_MATH_TEST_VALUE(RealType, -0.16);
|
||||
zs<RealType>[20] = BOOST_MATH_TEST_VALUE(RealType, -0.15);
|
||||
zs<RealType>[21] = BOOST_MATH_TEST_VALUE(RealType, -0.14);
|
||||
zs<RealType>[22] = BOOST_MATH_TEST_VALUE(RealType, -0.13);
|
||||
zs<RealType>[23] = BOOST_MATH_TEST_VALUE(RealType, -0.12);
|
||||
zs<RealType>[24] = BOOST_MATH_TEST_VALUE(RealType, -0.11);
|
||||
zs<RealType>[25] = BOOST_MATH_TEST_VALUE(RealType, -0.1);
|
||||
zs<RealType>[26] = BOOST_MATH_TEST_VALUE(RealType, -0.09);
|
||||
zs<RealType>[27] = BOOST_MATH_TEST_VALUE(RealType, -0.08);
|
||||
zs<RealType>[28] = BOOST_MATH_TEST_VALUE(RealType, -0.07);
|
||||
zs<RealType>[29] = BOOST_MATH_TEST_VALUE(RealType, -0.06);
|
||||
zs<RealType>[30] = BOOST_MATH_TEST_VALUE(RealType, -0.05);
|
||||
zs<RealType>[31] = BOOST_MATH_TEST_VALUE(RealType, -0.04);
|
||||
zs<RealType>[32] = BOOST_MATH_TEST_VALUE(RealType, -0.03);
|
||||
zs<RealType>[33] = BOOST_MATH_TEST_VALUE(RealType, -0.02);
|
||||
zs<RealType>[34] = BOOST_MATH_TEST_VALUE(RealType, -0.01);
|
||||
zs<RealType>[35] = BOOST_MATH_TEST_VALUE(RealType, 0);
|
||||
zs<RealType>[36] = BOOST_MATH_TEST_VALUE(RealType, 0.01);
|
||||
zs<RealType>[37] = BOOST_MATH_TEST_VALUE(RealType, 0.02);
|
||||
zs<RealType>[38] = BOOST_MATH_TEST_VALUE(RealType, 0.03);
|
||||
zs<RealType>[39] = BOOST_MATH_TEST_VALUE(RealType, 0.04);
|
||||
zs<RealType>[40] = BOOST_MATH_TEST_VALUE(RealType, 0.05);
|
||||
zs<RealType>[41] = BOOST_MATH_TEST_VALUE(RealType, 0.06);
|
||||
zs<RealType>[42] = BOOST_MATH_TEST_VALUE(RealType, 0.07);
|
||||
zs<RealType>[43] = BOOST_MATH_TEST_VALUE(RealType, 0.08);
|
||||
zs<RealType>[44] = BOOST_MATH_TEST_VALUE(RealType, 0.09);
|
||||
zs<RealType>[45] = BOOST_MATH_TEST_VALUE(RealType, 0.1);
|
||||
zs<RealType>[46] = BOOST_MATH_TEST_VALUE(RealType, 0.11);
|
||||
zs<RealType>[47] = BOOST_MATH_TEST_VALUE(RealType, 0.12);
|
||||
zs<RealType>[48] = BOOST_MATH_TEST_VALUE(RealType, 0.13);
|
||||
zs<RealType>[49] = BOOST_MATH_TEST_VALUE(RealType, 0.14);
|
||||
zs<RealType>[50] = BOOST_MATH_TEST_VALUE(RealType, 0.15);
|
||||
zs<RealType>[51] = BOOST_MATH_TEST_VALUE(RealType, 0.16);
|
||||
zs<RealType>[52] = BOOST_MATH_TEST_VALUE(RealType, 0.17);
|
||||
zs<RealType>[53] = BOOST_MATH_TEST_VALUE(RealType, 0.18);
|
||||
zs<RealType>[54] = BOOST_MATH_TEST_VALUE(RealType, 0.19);
|
||||
zs<RealType>[55] = BOOST_MATH_TEST_VALUE(RealType, 0.2);
|
||||
zs<RealType>[56] = BOOST_MATH_TEST_VALUE(RealType, 0.21);
|
||||
zs<RealType>[57] = BOOST_MATH_TEST_VALUE(RealType, 0.22);
|
||||
zs<RealType>[58] = BOOST_MATH_TEST_VALUE(RealType, 0.23);
|
||||
zs<RealType>[59] = BOOST_MATH_TEST_VALUE(RealType, 0.24);
|
||||
zs<RealType>[60] = BOOST_MATH_TEST_VALUE(RealType, 0.25);
|
||||
zs<RealType>[61] = BOOST_MATH_TEST_VALUE(RealType, 0.26);
|
||||
zs<RealType>[62] = BOOST_MATH_TEST_VALUE(RealType, 0.27);
|
||||
zs<RealType>[63] = BOOST_MATH_TEST_VALUE(RealType, 0.28);
|
||||
zs<RealType>[64] = BOOST_MATH_TEST_VALUE(RealType, 0.29);
|
||||
zs<RealType>[65] = BOOST_MATH_TEST_VALUE(RealType, 0.3);
|
||||
zs<RealType>[66] = BOOST_MATH_TEST_VALUE(RealType, 0.31);
|
||||
zs<RealType>[67] = BOOST_MATH_TEST_VALUE(RealType, 0.32);
|
||||
zs<RealType>[68] = BOOST_MATH_TEST_VALUE(RealType, 0.33);
|
||||
zs<RealType>[69] = BOOST_MATH_TEST_VALUE(RealType, 0.34);
|
||||
zs<RealType>[70] = BOOST_MATH_TEST_VALUE(RealType, 0.35);
|
||||
zs<RealType>[71] = BOOST_MATH_TEST_VALUE(RealType, 0.36);
|
||||
zs<RealType>[72] = BOOST_MATH_TEST_VALUE(RealType, 0.37);
|
||||
zs<RealType>[73] = BOOST_MATH_TEST_VALUE(RealType, 0.38);
|
||||
zs<RealType>[74] = BOOST_MATH_TEST_VALUE(RealType, 0.39);
|
||||
zs<RealType>[75] = BOOST_MATH_TEST_VALUE(RealType, 0.4);
|
||||
zs<RealType>[76] = BOOST_MATH_TEST_VALUE(RealType, 0.41);
|
||||
zs<RealType>[77] = BOOST_MATH_TEST_VALUE(RealType, 0.42);
|
||||
zs<RealType>[78] = BOOST_MATH_TEST_VALUE(RealType, 0.43);
|
||||
zs<RealType>[79] = BOOST_MATH_TEST_VALUE(RealType, 0.44);
|
||||
zs<RealType>[80] = BOOST_MATH_TEST_VALUE(RealType, 0.45);
|
||||
zs<RealType>[81] = BOOST_MATH_TEST_VALUE(RealType, 0.46);
|
||||
zs<RealType>[82] = BOOST_MATH_TEST_VALUE(RealType, 0.47);
|
||||
zs<RealType>[83] = BOOST_MATH_TEST_VALUE(RealType, 0.48);
|
||||
zs<RealType>[84] = BOOST_MATH_TEST_VALUE(RealType, 0.49);
|
||||
zs<RealType>[85] = BOOST_MATH_TEST_VALUE(RealType, 0.5);
|
||||
zs<RealType>[86] = BOOST_MATH_TEST_VALUE(RealType, 0.51);
|
||||
zs<RealType>[87] = BOOST_MATH_TEST_VALUE(RealType, 0.52);
|
||||
zs<RealType>[88] = BOOST_MATH_TEST_VALUE(RealType, 0.53);
|
||||
zs<RealType>[89] = BOOST_MATH_TEST_VALUE(RealType, 0.54);
|
||||
zs<RealType>[90] = BOOST_MATH_TEST_VALUE(RealType, 0.55);
|
||||
zs<RealType>[91] = BOOST_MATH_TEST_VALUE(RealType, 0.56);
|
||||
zs<RealType>[92] = BOOST_MATH_TEST_VALUE(RealType, 0.57);
|
||||
zs<RealType>[93] = BOOST_MATH_TEST_VALUE(RealType, 0.58);
|
||||
zs<RealType>[94] = BOOST_MATH_TEST_VALUE(RealType, 0.59);
|
||||
zs<RealType>[95] = BOOST_MATH_TEST_VALUE(RealType, 0.6);
|
||||
zs<RealType>[96] = BOOST_MATH_TEST_VALUE(RealType, 0.61);
|
||||
zs<RealType>[97] = BOOST_MATH_TEST_VALUE(RealType, 0.62);
|
||||
zs<RealType>[98] = BOOST_MATH_TEST_VALUE(RealType, 0.63);
|
||||
zs<RealType>[99] = BOOST_MATH_TEST_VALUE(RealType, 0.64);
|
||||
};
|
||||
|
||||
template <typename RealType>
|
||||
void init_ws()
|
||||
{
|
||||
ws<RealType>[0] = BOOST_MATH_TEST_VALUE(RealType, -0.7166388164560746087024558456707254694384568520557269136746931098892793788395047380759438025387884858);
|
||||
ws<RealType>[1] = BOOST_MATH_TEST_VALUE(RealType, -0.6536945012690894831597997531138338843162464994103594824433758069038214520742337992347211610550053984);
|
||||
ws<RealType>[2] = BOOST_MATH_TEST_VALUE(RealType, -0.6032666497551330505290050177510626805198672833479939253720127109209527349195161224268802996274136747);
|
||||
ws<RealType>[3] = BOOST_MATH_TEST_VALUE(RealType, -0.5604894830784555743634840504116545657018790664887527536558909385182231717303278501957297352008893216);
|
||||
ws<RealType>[4] = BOOST_MATH_TEST_VALUE(RealType, -0.5229899496273203531021836240814670901286300106249589336522580913925382314180343142582930298688973328);
|
||||
ws<RealType>[5] = BOOST_MATH_TEST_VALUE(RealType, -0.4894022271802149690362312519962933689234100060163590345114659679736814083816206187318524147462752111);
|
||||
ws<RealType>[6] = BOOST_MATH_TEST_VALUE(RealType, -0.4588564134818020881945707413259267147702798410198651247860751590059996177594865393191440343561489497);
|
||||
ws<RealType>[7] = BOOST_MATH_TEST_VALUE(RealType, -0.430758874527112757916530656841372138819645982270515538512158436501726397121990576271580205308878207);
|
||||
ws<RealType>[8] = BOOST_MATH_TEST_VALUE(RealType, -0.4046836216050718653643250056478665857931866093242449366197023952738694255086107304901218425119878285);
|
||||
ws<RealType>[9] = BOOST_MATH_TEST_VALUE(RealType, -0.3803130203301711158303965355878156301369877394562403253806911002545713191362049178479001390543005669);
|
||||
ws<RealType>[10] = BOOST_MATH_TEST_VALUE(RealType, -0.3574029561813889030688111040559047533165905550760120436276204485896714025961457962896168513444411851);
|
||||
ws<RealType>[11] = BOOST_MATH_TEST_VALUE(RealType, -0.3357611647889027517286807582305262236620547459507665934563718789670705154001183482511605249232725262);
|
||||
ws<RealType>[12] = BOOST_MATH_TEST_VALUE(RealType, -0.3152331201461386435765969738874032981030054464637097661705367708887648429131963353376761780892891198);
|
||||
ws<RealType>[13] = BOOST_MATH_TEST_VALUE(RealType, -0.2956924930138396731882414803341009766267402363327831485839773479792571341845506001421908939342687003);
|
||||
ws<RealType>[14] = BOOST_MATH_TEST_VALUE(RealType, -0.2770344936961942277405408649408688233196542455843784252217943010706466317584602777484953020015260171);
|
||||
ws<RealType>[15] = BOOST_MATH_TEST_VALUE(RealType, -0.2591711018190737450566519502154067057135883397008937032218391275127128217957580326598838960236799743);
|
||||
ws<RealType>[16] = BOOST_MATH_TEST_VALUE(RealType, -0.2420275690015187377858338945726638068700099098394765251572836145818480355482127963663852628850474365);
|
||||
ws<RealType>[17] = BOOST_MATH_TEST_VALUE(RealType, -0.2255398031589208520522477564458058214947250100630471825833168970061295445194143654537283079293631882);
|
||||
ws<RealType>[18] = BOOST_MATH_TEST_VALUE(RealType, -0.2096523776773757526854110454922591821172341338912795099236642246474810661153254626268152915502654464);
|
||||
ws<RealType>[19] = BOOST_MATH_TEST_VALUE(RealType, -0.1943169925501295306267806518866699513042867279514786976609290465447683131164947042462416733465191705);
|
||||
ws<RealType>[20] = BOOST_MATH_TEST_VALUE(RealType, -0.1794912683479847336169956193772297997551233686606176679348345166799006378410748708389238307302596092);
|
||||
ws<RealType>[21] = BOOST_MATH_TEST_VALUE(RealType, -0.1651377892669526609846674769813353453533631060975171667664202096550705187268670901310309631101894252);
|
||||
ws<RealType>[22] = BOOST_MATH_TEST_VALUE(RealType, -0.1512233352864070831284495817823327538270829682666487244093315171463780635423561100568377622135186516);
|
||||
ws<RealType>[23] = BOOST_MATH_TEST_VALUE(RealType, -0.1377182597958957974485081647284122921614575977782346246206306428239556449434198032928042029722138321);
|
||||
ws<RealType>[24] = BOOST_MATH_TEST_VALUE(RealType, -0.1245959804557266577566667196210790531357931527107938915216224185712652948438844608688497767379885997);
|
||||
ws<RealType>[25] = BOOST_MATH_TEST_VALUE(RealType, -0.1118325591589629648335694568202658422726453622912658633296897727621943319600088273854870109175450158);
|
||||
ws<RealType>[26] = BOOST_MATH_TEST_VALUE(RealType, -0.09940635280454481474353567186786621057820625354936552021878311951478746295439312235429098520600693655);
|
||||
ws<RealType>[27] = BOOST_MATH_TEST_VALUE(RealType, -0.0872977208615799240409197586602731399264877335001009828544494658243661146551788411188719365040631665);
|
||||
ws<RealType>[28] = BOOST_MATH_TEST_VALUE(RealType, -0.07548877886579220591933915955796681153524932228333916508394604171275936228487984352484617277876166196);
|
||||
ws<RealType>[29] = BOOST_MATH_TEST_VALUE(RealType, -0.06396318935617251019529498180168867456392641049371161867095248726275828927462089387234209569688498636);
|
||||
ws<RealType>[30] = BOOST_MATH_TEST_VALUE(RealType, -0.05270598355154634795995650617915721289427674396592395159861151190218069285705994080638064249535030165);
|
||||
ws<RealType>[31] = BOOST_MATH_TEST_VALUE(RealType, -0.0417034084364844738987273381255397678625601003793974576012640697941798897037109744906565096871084505);
|
||||
ws<RealType>[32] = BOOST_MATH_TEST_VALUE(RealType, -0.03094279498284817939791038065611524917275896960162863310717850085820789123932160879579380708946724763);
|
||||
ws<RealType>[33] = BOOST_MATH_TEST_VALUE(RealType, -0.02041244405580766725973605390749548004158612495647388221129868845283704895545337928376001388096747673);
|
||||
ws<RealType>[34] = BOOST_MATH_TEST_VALUE(RealType, -0.01010152719853875327292018767138623973670903993475235877290726369225412969738704722202330440072213641);
|
||||
ws<RealType>[35] = BOOST_MATH_TEST_VALUE(RealType, 0);
|
||||
ws<RealType>[36] = BOOST_MATH_TEST_VALUE(RealType, 0.009901473843595011885336326816570107953627746494917415482611387085655068978243229360100010886171970918);
|
||||
ws<RealType>[37] = BOOST_MATH_TEST_VALUE(RealType, 0.01961158933740562729168248268298370977812129423409093067066057185151403434315590894008191205649296367);
|
||||
ws<RealType>[38] = BOOST_MATH_TEST_VALUE(RealType, 0.02913845916787001265458568152535395243296458501852019787733534716701300947181963767753439648797667795);
|
||||
ws<RealType>[39] = BOOST_MATH_TEST_VALUE(RealType, 0.03848966594197856933287598180923987047561124099417969473653441752849562865576161248185402614815991005);
|
||||
ws<RealType>[40] = BOOST_MATH_TEST_VALUE(RealType, 0.04767230860012937472638890051416087074706296593389050213640962398757901310991378849253401839554247932);
|
||||
ws<RealType>[41] = BOOST_MATH_TEST_VALUE(RealType, 0.05669304377414432493107872588796066666126335321712197451058496819855703149168243802045469883952188552);
|
||||
ws<RealType>[42] = BOOST_MATH_TEST_VALUE(RealType, 0.06555812274442272075701853672870305774479404911034476570035450491724937359575494857058381868464932454);
|
||||
ws<RealType>[43] = BOOST_MATH_TEST_VALUE(RealType, 0.07427342455278083997072135190143718509109109085324108067398934333182382982634706320903236612485848405);
|
||||
ws<RealType>[44] = BOOST_MATH_TEST_VALUE(RealType, 0.08284448574644162210327285639805993759142367414790119841318433362329213386156887296335560991622282284);
|
||||
ws<RealType>[45] = BOOST_MATH_TEST_VALUE(RealType, 0.0912765271608622642998957214231795686531192240514720326483083946071722462544175516502066459299560671);
|
||||
ws<RealType>[46] = BOOST_MATH_TEST_VALUE(RealType, 0.09957447809219979168181062315832233980460887841902355310769435168948823854831388504977465633939682845);
|
||||
ws<RealType>[47] = BOOST_MATH_TEST_VALUE(RealType, 0.1077429981622769541092028233904076346257727607117049788632909974125087436037688769621472372382338589);
|
||||
ws<RealType>[48] = BOOST_MATH_TEST_VALUE(RealType, 0.1157864971383620420455904585908175984070719832012079215609230219591260309061070611295890797209058613);
|
||||
ws<RealType>[49] = BOOST_MATH_TEST_VALUE(RealType, 0.123709152935653268637225082319130933018353939077412845800247462273779701933149651969922416814563643);
|
||||
ws<RealType>[50] = BOOST_MATH_TEST_VALUE(RealType, 0.1315149280010344580474416667366241780127651069693569916108339146599686985542850094826506230355645206);
|
||||
ws<RealType>[51] = BOOST_MATH_TEST_VALUE(RealType, 0.1392075842516055911219563262364716100580324132271864711438857091601938661529783118284822918918762012);
|
||||
ws<RealType>[52] = BOOST_MATH_TEST_VALUE(RealType, 0.1467906967200019429098356045334600022599041243103780089713630524471411698742480890410424556292186252);
|
||||
ws<RealType>[53] = BOOST_MATH_TEST_VALUE(RealType, 0.1542676660400332595939671017213220881360827710416946348345860549372631184130438485651715394816551156);
|
||||
ws<RealType>[54] = BOOST_MATH_TEST_VALUE(RealType, 0.1616417298902320361099923668622409534689583622433205732144762283241135493479959458637574220609547663);
|
||||
ws<RealType>[55] = BOOST_MATH_TEST_VALUE(RealType, 0.1689159734991095651164749037058183987284469135107297553319388783258832067427865597883933228919370041);
|
||||
ws<RealType>[56] = BOOST_MATH_TEST_VALUE(RealType, 0.176093339303957105084240207040480028792877878787501699026158171529756555902997254667356047116441788);
|
||||
ws<RealType>[57] = BOOST_MATH_TEST_VALUE(RealType, 0.1831766358446274967063002214815526159126266889851598585852904605011653998837614409160807673866997377);
|
||||
ws<RealType>[58] = BOOST_MATH_TEST_VALUE(RealType, 0.1901685459646637418459898415362480836632528245228542609994635862866965513625128722227696305198415266);
|
||||
ws<RealType>[59] = BOOST_MATH_TEST_VALUE(RealType, 0.1970716343842153356374997203517126469395880032764377549805749691269132085609349859323881542196582345);
|
||||
ws<RealType>[60] = BOOST_MATH_TEST_VALUE(RealType, 0.2038883547022401644431818313271398701493524772101596349734062600818193640670940526181645713107956088);
|
||||
ws<RealType>[61] = BOOST_MATH_TEST_VALUE(RealType, 0.2106210558793939073502149913441295543358575322967676769367700683562463350885767192666542957075712751);
|
||||
ws<RealType>[62] = BOOST_MATH_TEST_VALUE(RealType, 0.2172719882476450310112829333455034301692311490231843772189917487700633677693451679449281229277444);
|
||||
ws<RealType>[63] = BOOST_MATH_TEST_VALUE(RealType, 0.2238433090879237484082608989533539628744637740613473368794338628306680030796510487992807280960350863);
|
||||
ws<RealType>[64] = BOOST_MATH_TEST_VALUE(RealType, 0.230337087812934212569787581174413102713202565273940246146535096101718965948694383449116272546328387);
|
||||
ws<RealType>[65] = BOOST_MATH_TEST_VALUE(RealType, 0.2367553107885593168713669913131022529850076068942822776500825494062035956449035725319106127888967252);
|
||||
ws<RealType>[66] = BOOST_MATH_TEST_VALUE(RealType, 0.2430998858240055404991486201117080426760827615791233989777935602839590601547710113790997280209616842);
|
||||
ws<RealType>[67] = BOOST_MATH_TEST_VALUE(RealType, 0.2493726463579186824703694885450067240777490681347030220353778714445393581714407422015446216089384764);
|
||||
ws<RealType>[68] = BOOST_MATH_TEST_VALUE(RealType, 0.255575355365104731122377747221405406075211883935782315620283025379607560268766005462481341306785098);
|
||||
ws<RealType>[69] = BOOST_MATH_TEST_VALUE(RealType, 0.2617097090061743695408970492873886795528577990555646770473973759567281587373896180370074675102853899);
|
||||
ws<RealType>[70] = BOOST_MATH_TEST_VALUE(RealType, 0.2677773400403608426926161268075028522173112518463765933864820650709836250445193581155036917009299903);
|
||||
ws<RealType>[71] = BOOST_MATH_TEST_VALUE(RealType, 0.2737798210199097285877692071254930326690991310905656381739509847292712940678493744834592887738653624);
|
||||
ws<RealType>[72] = BOOST_MATH_TEST_VALUE(RealType, 0.279718667282780030688985330053563938014151152536888220220066424808617200267097125397004630221318648);
|
||||
ws<RealType>[73] = BOOST_MATH_TEST_VALUE(RealType, 0.2855953397589067078034135225526038434573251024673070045734211311120835242005964286865861813715576376);
|
||||
ws<RealType>[74] = BOOST_MATH_TEST_VALUE(RealType, 0.2914112476039358811079401653518892721830457004248980213382598417991951999360380881350324421536041991);
|
||||
ws<RealType>[75] = BOOST_MATH_TEST_VALUE(RealType, 0.2971677506731385467797269622470213419044581015501274519083671027242648030351552074110959032585686367);
|
||||
ws<RealType>[76] = BOOST_MATH_TEST_VALUE(RealType, 0.3028661618471218240709788492447379933660682925225029587250796959940885465093714030223793579774677182);
|
||||
ws<RealType>[77] = BOOST_MATH_TEST_VALUE(RealType, 0.3085077492199755507560853270193391876750205224915338763730055720866605941218639559241097041425718389);
|
||||
ws<RealType>[78] = BOOST_MATH_TEST_VALUE(RealType, 0.3140937381596049465307653625755662577673424859113972924301418900103932566506643308363685842713510345);
|
||||
ws<RealType>[79] = BOOST_MATH_TEST_VALUE(RealType, 0.3196253132491970154264844863020982117371468405067770401175599100299218378827848337045090472924417639);
|
||||
ws<RealType>[80] = BOOST_MATH_TEST_VALUE(RealType, 0.3251036201180404567925882149866539513803608104758008850889564944127408970111984388784259876569696298);
|
||||
ws<RealType>[81] = BOOST_MATH_TEST_VALUE(RealType, 0.3305297671692582446013104792754623176896333299898173620545327652833709938789531370957735854140619173);
|
||||
ws<RealType>[82] = BOOST_MATH_TEST_VALUE(RealType, 0.3359048272114117659741549735010360281170238179628782075568249283432891398635686044147614597227718316);
|
||||
ws<RealType>[83] = BOOST_MATH_TEST_VALUE(RealType, 0.3412298390003893228052121236143338755316388573531939840892239102731223392510954828680280968924289841);
|
||||
ws<RealType>[84] = BOOST_MATH_TEST_VALUE(RealType, 0.3465058086974944293540338951489158955895910665452626949454054191729967933634547552073491283786892473);
|
||||
ws<RealType>[85] = BOOST_MATH_TEST_VALUE(RealType, 0.3517337112491958260249093009299510651714642155171118040466438461099606107203387108968323038321915693);
|
||||
ws<RealType>[86] = BOOST_MATH_TEST_VALUE(RealType, 0.356914491693587151869424246256045038549439930737927770357941686970717473161840668532896372614750844);
|
||||
ws<RealType>[87] = BOOST_MATH_TEST_VALUE(RealType, 0.3620490663982259224347136211795537282192272992052648623722265772196673697387836128745005565051134501);
|
||||
ws<RealType>[88] = BOOST_MATH_TEST_VALUE(RealType, 0.3671383242336754065717073384163048245222026534654156361188807018443753849870522240862625069431927886);
|
||||
ws<RealType>[89] = BOOST_MATH_TEST_VALUE(RealType, 0.3721831276867561125667772461128588424710274544378039645877124572815833807252348818205119412993474916);
|
||||
ws<RealType>[90] = BOOST_MATH_TEST_VALUE(RealType, 0.3771843139172231305654429202753334704233212269643890432815783280355585518582574589199227373679397234);
|
||||
ws<RealType>[91] = BOOST_MATH_TEST_VALUE(RealType, 0.3821426957613190709393551341272838157890329391308789323327108090412283903082231991030667000296469447);
|
||||
ws<RealType>[92] = BOOST_MATH_TEST_VALUE(RealType, 0.3870590626854075768406867666899001946809584949146574272916930955076684732166306691825829034241158645);
|
||||
ws<RealType>[93] = BOOST_MATH_TEST_VALUE(RealType, 0.3919341816926673886247930427095007681691393368820432019135743979557612444151495005378394686508979365);
|
||||
ws<RealType>[94] = BOOST_MATH_TEST_VALUE(RealType, 0.3967687981856199130952904028742195107327166899059243534847812692294320278426834780185947685265825165);
|
||||
ws<RealType>[95] = BOOST_MATH_TEST_VALUE(RealType, 0.4015636367870725946626664537946836866230027160063511402379921560604975325206585381386527082762303647);
|
||||
ws<RealType>[96] = BOOST_MATH_TEST_VALUE(RealType, 0.4063194021218846501705479426913810870863608030934864938423596576756863248859417057476841165663966806);
|
||||
ws<RealType>[97] = BOOST_MATH_TEST_VALUE(RealType, 0.4110367795617996075205416204209832162005305795083946929235957810141140813392726029732502982435129093);
|
||||
ws<RealType>[98] = BOOST_MATH_TEST_VALUE(RealType, 0.4157164359354393999190647189307900734531788488207389484153095921329397217223528187979110265697876198);
|
||||
ws<RealType>[99] = BOOST_MATH_TEST_VALUE(RealType, 0.4203590202054164452305419772022302902943227646223432518640399730485379665439298245520857153666787776);
|
||||
};
|
||||
// End of lambert_w_mp_values.ipp
|
||||
@@ -14,8 +14,9 @@
|
||||
|
||||
// To add new constants, add a function that calculates the value of the constant to
|
||||
// boost/math/constants/calculate_constants.hpp
|
||||
// See http://www.boost.org/doc/libs/release/libs/math/doc/html/math_toolkit/new_const.html
|
||||
|
||||
#include <boost/math/constants/generate.hpp>
|
||||
#include <boost/math/constants/generate.hpp> // Requires /modular-boost/libs/math/include_private in search path.
|
||||
#include <boost/math/constants/calculate_constants.hpp>
|
||||
|
||||
int main()
|
||||
@@ -26,6 +27,7 @@ int main()
|
||||
BOOST_CONSTANTS_GENERATE(twothirds);
|
||||
BOOST_CONSTANTS_GENERATE(two_thirds);
|
||||
BOOST_CONSTANTS_GENERATE(three_quarters);
|
||||
BOOST_CONSTANTS_GENERATE(sixth);
|
||||
// two and related.
|
||||
BOOST_CONSTANTS_GENERATE(root_two);
|
||||
BOOST_CONSTANTS_GENERATE(root_three);
|
||||
@@ -69,6 +71,7 @@ int main()
|
||||
// Euler's e and related.
|
||||
BOOST_CONSTANTS_GENERATE(e);
|
||||
BOOST_CONSTANTS_GENERATE(exp_minus_half);
|
||||
BOOST_CONSTANTS_GENERATE(exp_minus_one);
|
||||
|
||||
BOOST_CONSTANTS_GENERATE(e_pow_pi);
|
||||
BOOST_CONSTANTS_GENERATE(root_e);
|
||||
|
||||
@@ -157,6 +157,8 @@ void test_spots(RealType)
|
||||
BOOST_CHECK_CLOSE_FRACTION(0.333333333333333333333333333333333333333L, third<RealType>(), tolerance);
|
||||
BOOST_CHECK_CLOSE_FRACTION(0.666666666666666666666666666666666666667L, two_thirds<RealType>(), tolerance);
|
||||
BOOST_CHECK_CLOSE_FRACTION(0.75L, three_quarters<RealType>(), tolerance);
|
||||
BOOST_CHECK_CLOSE_FRACTION(0.1666666666666666666666666666666666666667L, sixth<RealType>(), tolerance);
|
||||
|
||||
// Two and related.
|
||||
BOOST_CHECK_CLOSE_FRACTION(sqrt(2.L), root_two<RealType>(), tolerance);
|
||||
BOOST_CHECK_CLOSE_FRACTION(sqrt(3.L), root_three<RealType>(), tolerance);
|
||||
@@ -195,8 +197,8 @@ void test_spots(RealType)
|
||||
|
||||
// Euler
|
||||
BOOST_CHECK_CLOSE_FRACTION(2.71828182845904523536028747135266249775724709369995L, e<RealType>(), tolerance);
|
||||
|
||||
//BOOST_CHECK_CLOSE_FRACTION(exp(-0.5L), exp_minus_half<RealType>(), tolerance); // See above.
|
||||
BOOST_CHECK_CLOSE_FRACTION(exp(-1.L), exp_minus_one<RealType>(), tolerance);
|
||||
BOOST_CHECK_CLOSE_FRACTION(pow(e<RealType>(), pi<RealType>()), e_pow_pi<RealType>(), tolerance); // See also above.
|
||||
BOOST_CHECK_CLOSE_FRACTION(sqrt(e<RealType>()), root_e<RealType>(), tolerance);
|
||||
BOOST_CHECK_CLOSE_FRACTION(log10(e<RealType>()), log10_e<RealType>(), tolerance);
|
||||
|
||||
1145
test/test_lambert_w.cpp
Normal file
124
test/test_lambert_w_derivative.cpp
Normal file
@@ -0,0 +1,124 @@
|
||||
// Copyright Paul A. Bristow 2016, 2017, 2018.
|
||||
// Copyright John Maddock 2016.
|
||||
|
||||
// Use, modification and distribution are subject to 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)
|
||||
|
||||
// test_lambert_w.cpp
|
||||
//! \brief Basic sanity tests for Lambert W derivative.
|
||||
|
||||
#ifdef BOOST_MATH_TEST_FLOAT128
|
||||
#include <boost/cstdfloat.hpp> // For float_64_t, float128_t. Must be first include!
|
||||
#endif // #ifdef #ifdef BOOST_MATH_TEST_FLOAT128
|
||||
// Needs gnu++17 for BOOST_HAS_FLOAT128
|
||||
#include <boost/config.hpp> // for BOOST_MSVC definition etc.
|
||||
#include <boost/version.hpp> // for BOOST_MSVC versions.
|
||||
|
||||
// Boost macros
|
||||
#define BOOST_TEST_MAIN
|
||||
#define BOOST_LIB_DIAGNOSTIC "on" // Report library file details.
|
||||
#include <boost/test/included/unit_test.hpp> // Boost.Test
|
||||
// #include <boost/test/unit_test.hpp> // Boost.Test
|
||||
#include <boost/test/floating_point_comparison.hpp>
|
||||
|
||||
#include <boost/array.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/type_traits/is_constructible.hpp>
|
||||
|
||||
#ifdef BOOST_MATH_TEST_MULTIPRECISION
|
||||
#include <boost/multiprecision/cpp_dec_float.hpp> // boost::multiprecision::cpp_dec_float_50
|
||||
using boost::multiprecision::cpp_dec_float_50;
|
||||
|
||||
#include <boost/multiprecision/cpp_bin_float.hpp>
|
||||
using boost::multiprecision::cpp_bin_float_quad;
|
||||
|
||||
#ifdef BOOST_MATH_TEST_FLOAT128
|
||||
|
||||
#ifdef BOOST_HAS_FLOAT128
|
||||
// Including this header below without float128 triggers:
|
||||
// fatal error C1189: #error: "Sorry compiler is neither GCC, not Intel, don't know how to configure this header."
|
||||
#include <boost/multiprecision/float128.hpp>
|
||||
using boost::multiprecision::float128;
|
||||
#endif // ifdef BOOST_HAS_FLOAT128
|
||||
#endif // #ifdef #ifdef BOOST_MATH_TEST_FLOAT128
|
||||
|
||||
#endif // #ifdef BOOST_MATH_TEST_MULTIPRECISION
|
||||
|
||||
//#include <boost/fixed_point/fixed_point.hpp> // If available.
|
||||
|
||||
#include <boost/math/concepts/real_concept.hpp> // for real_concept tests.
|
||||
#include <boost/math/special_functions/fpclassify.hpp> // isnan, ifinite.
|
||||
#include <boost/math/special_functions/next.hpp> // float_next, float_prior
|
||||
using boost::math::float_next;
|
||||
using boost::math::float_prior;
|
||||
#include <boost/math/special_functions/ulp.hpp> // ulp
|
||||
|
||||
#include <boost/math/tools/test_value.hpp> // for create_test_value and macro BOOST_MATH_TEST_VALUE.
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
#include <boost/math/special_functions/lambert_w.hpp> // For Lambert W lambert_w function.
|
||||
using boost::math::lambert_wm1;
|
||||
using boost::math::lambert_w0;
|
||||
|
||||
#include <limits>
|
||||
#include <cmath>
|
||||
#include <typeinfo>
|
||||
#include <iostream>
|
||||
#include <exception>
|
||||
|
||||
std::string show_versions(void);
|
||||
|
||||
BOOST_AUTO_TEST_CASE( Derivatives_of_lambert_w )
|
||||
{
|
||||
std::cout << "Macro BOOST_MATH_LAMBERT_W_DERIVATIVES to test 1st derivatives is defined." << std::endl;
|
||||
BOOST_TEST_MESSAGE("\nTest Lambert W function 1st differentials.");
|
||||
|
||||
using boost::math::constants::exp_minus_one;
|
||||
using boost::math::lambert_w0_prime;
|
||||
using boost::math::lambert_wm1_prime;
|
||||
|
||||
// Derivatives
|
||||
// https://www.wolframalpha.com/input/?i=derivative+of+productlog(0,+x)
|
||||
// d/dx(W_0(x)) = W(x)/(x W(x) + x)
|
||||
// https://www.wolframalpha.com/input/?i=derivative+of+productlog(-1,+x)
|
||||
// d/dx(W_(-1)(x)) = (W_(-1)(x))/(x W_(-1)(x) + x)
|
||||
|
||||
// 55 decimal digit values added to allow future testing using multiprecision.
|
||||
|
||||
typedef double RealType;
|
||||
|
||||
int epsilons = 1;
|
||||
RealType tolerance = boost::math::tools::epsilon<RealType>() * epsilons; // 2 eps as a fraction.
|
||||
|
||||
// derivative of productlog(-1, x) at x = -0.1 == -13.8803
|
||||
// (derivative of productlog(-1, x) ) at x = N[-0.1, 55] - but the result disappears!
|
||||
// (derivative of N[productlog(-1, x), 55] ) at x = N[-0.1, 55]
|
||||
|
||||
// W0 branch
|
||||
BOOST_CHECK_CLOSE_FRACTION(lambert_w0_prime(BOOST_MATH_TEST_VALUE(RealType, -0.2)),
|
||||
// BOOST_MATH_TEST_VALUE(RealType, 1.7491967609218355),
|
||||
BOOST_MATH_TEST_VALUE(RealType, 1.7491967609218358355273514903396335693828167746571404),
|
||||
tolerance); // 1.7491967609218358355273514903396335693828167746571404
|
||||
|
||||
BOOST_CHECK_CLOSE_FRACTION(lambert_w0_prime(BOOST_MATH_TEST_VALUE(RealType, 10.)),
|
||||
BOOST_MATH_TEST_VALUE(RealType, 0.063577133469345105142021311010780887641928338458371618),
|
||||
tolerance);
|
||||
|
||||
// W-1 branch
|
||||
BOOST_CHECK_CLOSE_FRACTION(lambert_wm1_prime(BOOST_MATH_TEST_VALUE(RealType, -0.1)),
|
||||
BOOST_MATH_TEST_VALUE(RealType, -13.880252213229780748699361486619519025203815492277715),
|
||||
tolerance);
|
||||
// Lambert W_prime -13.880252213229780748699361486619519025203815492277715, double -13.880252213229781
|
||||
|
||||
BOOST_CHECK_CLOSE_FRACTION(lambert_wm1_prime(BOOST_MATH_TEST_VALUE(RealType, -0.2)),
|
||||
BOOST_MATH_TEST_VALUE(RealType, -8.2411940564179044961885598641955579728547896392013239),
|
||||
tolerance);
|
||||
// Lambert W_prime -8.2411940564179044961885598641955579728547896392013239, double -8.2411940564179051
|
||||
|
||||
// Lambert W_prime 0.063577133469345105142021311010780887641928338458371618, double 0.063577133469345098
|
||||
}; // BOOST_AUTO_TEST_CASE("Derivatives of lambert_w")
|
||||
|
||||
|
||||
266
test/test_lambert_w_integrals_double.cpp
Normal file
@@ -0,0 +1,266 @@
|
||||
// Copyright Paul A. Bristow 2016, 2017, 2018.
|
||||
// Copyright John Maddock 2016.
|
||||
|
||||
// Use, modification and distribution are subject to 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)
|
||||
|
||||
// test_lambert_w_integrals.cpp
|
||||
//! \brief quadrature tests that cover the whole range of the Lambert W0 function.
|
||||
|
||||
#include <boost/config.hpp> // for BOOST_MSVC definition etc.
|
||||
#include <boost/version.hpp> // for BOOST_MSVC versions.
|
||||
|
||||
// Boost macros
|
||||
#define BOOST_TEST_MAIN
|
||||
#define BOOST_LIB_DIAGNOSTIC "on" // Report library file details.
|
||||
#include <boost/test/included/unit_test.hpp> // Boost.Test
|
||||
// #include <boost/test/unit_test.hpp> // Boost.Test
|
||||
#include <boost/test/floating_point_comparison.hpp>
|
||||
|
||||
#include <boost/array.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/type_traits/is_constructible.hpp>
|
||||
#include <boost/math/special_functions/fpclassify.hpp> // isnan, ifinite.
|
||||
#include <boost/math/special_functions/next.hpp> // float_next, float_prior
|
||||
using boost::math::float_next;
|
||||
using boost::math::float_prior;
|
||||
#include <boost/math/special_functions/ulp.hpp> // ulp
|
||||
|
||||
#include <boost/math/tools/test_value.hpp> // for create_test_value and macro BOOST_MATH_TEST_VALUE.
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
#include <boost/math/special_functions/lambert_w.hpp> // For Lambert W lambert_w function.
|
||||
using boost::math::lambert_wm1;
|
||||
using boost::math::lambert_w0;
|
||||
|
||||
#include <limits>
|
||||
#include <cmath>
|
||||
#include <typeinfo>
|
||||
#include <iostream>
|
||||
#include <type_traits>
|
||||
#include <exception>
|
||||
|
||||
std::string show_versions(void);
|
||||
|
||||
// Added code and test for Integral of the Lambert W function: by Nick Thompson.
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function#Definite_integrals
|
||||
|
||||
#include <boost/math/constants/constants.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/tanh_sinh.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/exp_sinh.hpp> // for integral tests.
|
||||
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
// Assumes that function has a throw policy, for example:
|
||||
// NOT lambert_w0<T>(1 / (x * x), no_throw_policy());
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
template <typename T>
|
||||
T debug_integration_proc(T x)
|
||||
{
|
||||
T result; // warning C4701: potentially uninitialized local variable 'result' used
|
||||
// T result = 0 ; // But result may not be assigned below?
|
||||
try
|
||||
{
|
||||
// Assign function call to result in here...
|
||||
if (x <= sqrt(boost::math::tools::min_value<T>()) )
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = lambert_w0<T>(1 / (x * x));
|
||||
}
|
||||
// result = lambert_w0<T>(1 / (x * x), no_throw_policy()); // Bad idea, less helpful diagnostic message is:
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
|
||||
} // try
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
std::cout << "Exception " << e.what() << std::endl;
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected exception thrown in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
if (!std::isfinite(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
if (std::isnan(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
} // catch
|
||||
return result;
|
||||
} // T debug_integration_proc(T x)
|
||||
|
||||
template<class Real>
|
||||
void test_integrals()
|
||||
{
|
||||
// Integral of the Lambert W function:
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function
|
||||
using boost::math::quadrature::tanh_sinh;
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
// file:///I:/modular-boost/libs/math/doc/html/math_toolkit/quadrature/double_exponential/de_tanh_sinh.html
|
||||
using std::sqrt;
|
||||
|
||||
std::cout << "Integration of type " << typeid(Real).name() << std::endl;
|
||||
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
{ // // Integrate for function lambert_W0(z);
|
||||
tanh_sinh<Real> ts;
|
||||
Real a = 0;
|
||||
Real b = boost::math::constants::e<Real>();
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z);
|
||||
};
|
||||
Real z = ts.integrate(f, a, b); // OK without any decltype(f)
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::e<Real>() - 1, tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(z/(z sqrt(z)).
|
||||
exp_sinh<Real> es;
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z)/(z * sqrt(z));
|
||||
};
|
||||
Real z = es.integrate(f); // OK
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, 2 * boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(1/z^2).
|
||||
exp_sinh<Real> es;
|
||||
//const Real sqrt_min = sqrt(boost::math::tools::min_value<Real>()); // 1.08420217e-19 fo 32-bit float.
|
||||
// error C3493: 'sqrt_min' cannot be implicitly captured because no default capture mode has been specified
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
if (z <= sqrt(boost::math::tools::min_value<Real>()) )
|
||||
{ // Too small would underflow z * z and divide by zero to overflow 1/z^2 for lambert_w0 z parameter.
|
||||
return static_cast<Real>(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return lambert_w0<Real>(1 / (z * z)); // warning C4756: overflow in constant arithmetic, even though cannot happen.
|
||||
}
|
||||
};
|
||||
Real z = es.integrate(f);
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
} // template<class Real> void test_integrals()
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE( integrals )
|
||||
{
|
||||
std::cout << "Macro BOOST_MATH_LAMBERT_W0_INTEGRALS is defined." << std::endl;
|
||||
BOOST_TEST_MESSAGE("\nTest Lambert W0 integrals.");
|
||||
try
|
||||
{
|
||||
// using statements needed to change precision policy.
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
using boost::math::policies::precision;
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
/*
|
||||
// Experiment with better diagnostics.
|
||||
typedef float Real;
|
||||
|
||||
Real inf = std::numeric_limits<Real>::infinity();
|
||||
Real max = (std::numeric_limits<Real>::max)();
|
||||
std::cout.precision(std::numeric_limits<Real>::max_digits10);
|
||||
//std::cout << "lambert_w0(inf) = " << lambert_w0(inf) << std::endl; // lambert_w0(inf) = 1.79769e+308
|
||||
std::cout << "lambert_w0(inf, throw_policy()) = " << lambert_w0(inf, no_throw_policy()) << std::endl; // inf
|
||||
std::cout << "lambert_w0(max) = " << lambert_w0(max) << std::endl; // lambert_w0(max) = 703.227
|
||||
//std::cout << lambert_w0(inf) << std::endl; // inf - will throw.
|
||||
std::cout << "lambert_w0(0) = " << lambert_w0(0.) << std::endl; // 0
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::denorm_min()) = " << lambert_w0(std::numeric_limits<Real>::denorm_min()) << std::endl; // 4.94066e-324
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::min()) = " << lambert_w0((std::numeric_limits<Real>::min)()) << std::endl; // 2.22507e-308
|
||||
|
||||
// Approximate the largest lambert_w you can get for type T?
|
||||
float max_w_f = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<float>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max_f " << max_w_f << std::endl; // 84.2879
|
||||
Real max_w = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<Real>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max " << max_w << std::endl; // 703.227
|
||||
|
||||
std::cout << "lambert_w0(7.2416706213544837e-163) = " << lambert_w0(7.2416706213544837e-163) << std::endl; //
|
||||
std::cout << "test integral 1/z^2" << std::endl;
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1e-10, policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<11> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "epsilon = " << std::numeric_limits<Real>::epsilon() << std::endl; //
|
||||
std::cout << "sqrt(max) = " << sqrt(boost::math::tools::max_value<float>() ) << std::endl; // sqrt(max) = 1.8446742974197924e+19
|
||||
std::cout << "sqrt(min) = " << sqrt(boost::math::tools::min_value<float>() ) << std::endl; // sqrt(min) = 1.0842021724855044e-19
|
||||
|
||||
|
||||
|
||||
// Demo debug version.
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
Real x;
|
||||
{
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
exp_sinh<Real> es;
|
||||
// Function to be integrated, lambert_w0(1/z^2).
|
||||
|
||||
//auto f = [](Real z)->Real
|
||||
//{ // Naive - no protection against underflow and subsequent divide by zero.
|
||||
// return lambert_w0<Real>(1 / (z * z));
|
||||
//};
|
||||
// Diagnostic is:
|
||||
// Error in function boost::math::lambert_w0<Real>: Expected a finite value but got inf
|
||||
|
||||
auto f = [](Real z)->Real
|
||||
{ // Debug with diagnostics for underflow and subsequent divide by zero and other bad things.
|
||||
return debug_integration_proc(z);
|
||||
};
|
||||
// Exception Error in function boost::math::lambert_w0<double>: Expected a finite value but got inf.
|
||||
|
||||
// Unexpected exception thrown in integration code at abscissa: 7.2416706213544837e-163.
|
||||
// Unexpected exception thrown in integration code at abscissa (x): 3.478765835953569e-23.
|
||||
x = es.integrate(f);
|
||||
std::cout << "es.integrate(f) = " << x << std::endl;
|
||||
BOOST_CHECK_CLOSE_FRACTION(x, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
// root_two_pi<double = 2.506628274631000502
|
||||
}
|
||||
*/
|
||||
|
||||
test_integrals<double>();
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
266
test/test_lambert_w_integrals_float.cpp
Normal file
@@ -0,0 +1,266 @@
|
||||
// Copyright Paul A. Bristow 2016, 2017, 2018.
|
||||
// Copyright John Maddock 2016.
|
||||
|
||||
// Use, modification and distribution are subject to 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)
|
||||
|
||||
// test_lambert_w_integrals.cpp
|
||||
//! \brief quadrature tests that cover the whole range of the Lambert W0 function.
|
||||
|
||||
#include <boost/config.hpp> // for BOOST_MSVC definition etc.
|
||||
#include <boost/version.hpp> // for BOOST_MSVC versions.
|
||||
|
||||
// Boost macros
|
||||
#define BOOST_TEST_MAIN
|
||||
#define BOOST_LIB_DIAGNOSTIC "on" // Report library file details.
|
||||
#include <boost/test/included/unit_test.hpp> // Boost.Test
|
||||
// #include <boost/test/unit_test.hpp> // Boost.Test
|
||||
#include <boost/test/floating_point_comparison.hpp>
|
||||
|
||||
#include <boost/array.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/type_traits/is_constructible.hpp>
|
||||
#include <boost/math/special_functions/fpclassify.hpp> // isnan, ifinite.
|
||||
#include <boost/math/special_functions/next.hpp> // float_next, float_prior
|
||||
using boost::math::float_next;
|
||||
using boost::math::float_prior;
|
||||
#include <boost/math/special_functions/ulp.hpp> // ulp
|
||||
|
||||
#include <boost/math/tools/test_value.hpp> // for create_test_value and macro BOOST_MATH_TEST_VALUE.
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
#include <boost/math/special_functions/lambert_w.hpp> // For Lambert W lambert_w function.
|
||||
using boost::math::lambert_wm1;
|
||||
using boost::math::lambert_w0;
|
||||
|
||||
#include <limits>
|
||||
#include <cmath>
|
||||
#include <typeinfo>
|
||||
#include <iostream>
|
||||
#include <type_traits>
|
||||
#include <exception>
|
||||
|
||||
std::string show_versions(void);
|
||||
|
||||
// Added code and test for Integral of the Lambert W function: by Nick Thompson.
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function#Definite_integrals
|
||||
|
||||
#include <boost/math/constants/constants.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/tanh_sinh.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/exp_sinh.hpp> // for integral tests.
|
||||
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
// Assumes that function has a throw policy, for example:
|
||||
// NOT lambert_w0<T>(1 / (x * x), no_throw_policy());
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
template <typename T>
|
||||
T debug_integration_proc(T x)
|
||||
{
|
||||
T result; // warning C4701: potentially uninitialized local variable 'result' used
|
||||
// T result = 0 ; // But result may not be assigned below?
|
||||
try
|
||||
{
|
||||
// Assign function call to result in here...
|
||||
if (x <= sqrt(boost::math::tools::min_value<T>()) )
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = lambert_w0<T>(1 / (x * x));
|
||||
}
|
||||
// result = lambert_w0<T>(1 / (x * x), no_throw_policy()); // Bad idea, less helpful diagnostic message is:
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
|
||||
} // try
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
std::cout << "Exception " << e.what() << std::endl;
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected exception thrown in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
if (!std::isfinite(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
if (std::isnan(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
} // catch
|
||||
return result;
|
||||
} // T debug_integration_proc(T x)
|
||||
|
||||
template<class Real>
|
||||
void test_integrals()
|
||||
{
|
||||
// Integral of the Lambert W function:
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function
|
||||
using boost::math::quadrature::tanh_sinh;
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
// file:///I:/modular-boost/libs/math/doc/html/math_toolkit/quadrature/double_exponential/de_tanh_sinh.html
|
||||
using std::sqrt;
|
||||
|
||||
std::cout << "Integration of type " << typeid(Real).name() << std::endl;
|
||||
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
{ // // Integrate for function lambert_W0(z);
|
||||
tanh_sinh<Real> ts;
|
||||
Real a = 0;
|
||||
Real b = boost::math::constants::e<Real>();
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z);
|
||||
};
|
||||
Real z = ts.integrate(f, a, b); // OK without any decltype(f)
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::e<Real>() - 1, tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(z/(z sqrt(z)).
|
||||
exp_sinh<Real> es;
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z)/(z * sqrt(z));
|
||||
};
|
||||
Real z = es.integrate(f); // OK
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, 2 * boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(1/z^2).
|
||||
exp_sinh<Real> es;
|
||||
//const Real sqrt_min = sqrt(boost::math::tools::min_value<Real>()); // 1.08420217e-19 fo 32-bit float.
|
||||
// error C3493: 'sqrt_min' cannot be implicitly captured because no default capture mode has been specified
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
if (z <= sqrt(boost::math::tools::min_value<Real>()) )
|
||||
{ // Too small would underflow z * z and divide by zero to overflow 1/z^2 for lambert_w0 z parameter.
|
||||
return static_cast<Real>(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return lambert_w0<Real>(1 / (z * z)); // warning C4756: overflow in constant arithmetic, even though cannot happen.
|
||||
}
|
||||
};
|
||||
Real z = es.integrate(f);
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
} // template<class Real> void test_integrals()
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE( integrals )
|
||||
{
|
||||
std::cout << "Macro BOOST_MATH_LAMBERT_W0_INTEGRALS is defined." << std::endl;
|
||||
BOOST_TEST_MESSAGE("\nTest Lambert W0 integrals.");
|
||||
try
|
||||
{
|
||||
// using statements needed to change precision policy.
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
using boost::math::policies::precision;
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
/*
|
||||
// Experiment with better diagnostics.
|
||||
typedef float Real;
|
||||
|
||||
Real inf = std::numeric_limits<Real>::infinity();
|
||||
Real max = (std::numeric_limits<Real>::max)();
|
||||
std::cout.precision(std::numeric_limits<Real>::max_digits10);
|
||||
//std::cout << "lambert_w0(inf) = " << lambert_w0(inf) << std::endl; // lambert_w0(inf) = 1.79769e+308
|
||||
std::cout << "lambert_w0(inf, throw_policy()) = " << lambert_w0(inf, no_throw_policy()) << std::endl; // inf
|
||||
std::cout << "lambert_w0(max) = " << lambert_w0(max) << std::endl; // lambert_w0(max) = 703.227
|
||||
//std::cout << lambert_w0(inf) << std::endl; // inf - will throw.
|
||||
std::cout << "lambert_w0(0) = " << lambert_w0(0.) << std::endl; // 0
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::denorm_min()) = " << lambert_w0(std::numeric_limits<Real>::denorm_min()) << std::endl; // 4.94066e-324
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::min()) = " << lambert_w0((std::numeric_limits<Real>::min)()) << std::endl; // 2.22507e-308
|
||||
|
||||
// Approximate the largest lambert_w you can get for type T?
|
||||
float max_w_f = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<float>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max_f " << max_w_f << std::endl; // 84.2879
|
||||
Real max_w = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<Real>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max " << max_w << std::endl; // 703.227
|
||||
|
||||
std::cout << "lambert_w0(7.2416706213544837e-163) = " << lambert_w0(7.2416706213544837e-163) << std::endl; //
|
||||
std::cout << "test integral 1/z^2" << std::endl;
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1e-10, policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<11> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "epsilon = " << std::numeric_limits<Real>::epsilon() << std::endl; //
|
||||
std::cout << "sqrt(max) = " << sqrt(boost::math::tools::max_value<float>() ) << std::endl; // sqrt(max) = 1.8446742974197924e+19
|
||||
std::cout << "sqrt(min) = " << sqrt(boost::math::tools::min_value<float>() ) << std::endl; // sqrt(min) = 1.0842021724855044e-19
|
||||
|
||||
|
||||
|
||||
// Demo debug version.
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
Real x;
|
||||
{
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
exp_sinh<Real> es;
|
||||
// Function to be integrated, lambert_w0(1/z^2).
|
||||
|
||||
//auto f = [](Real z)->Real
|
||||
//{ // Naive - no protection against underflow and subsequent divide by zero.
|
||||
// return lambert_w0<Real>(1 / (z * z));
|
||||
//};
|
||||
// Diagnostic is:
|
||||
// Error in function boost::math::lambert_w0<Real>: Expected a finite value but got inf
|
||||
|
||||
auto f = [](Real z)->Real
|
||||
{ // Debug with diagnostics for underflow and subsequent divide by zero and other bad things.
|
||||
return debug_integration_proc(z);
|
||||
};
|
||||
// Exception Error in function boost::math::lambert_w0<double>: Expected a finite value but got inf.
|
||||
|
||||
// Unexpected exception thrown in integration code at abscissa: 7.2416706213544837e-163.
|
||||
// Unexpected exception thrown in integration code at abscissa (x): 3.478765835953569e-23.
|
||||
x = es.integrate(f);
|
||||
std::cout << "es.integrate(f) = " << x << std::endl;
|
||||
BOOST_CHECK_CLOSE_FRACTION(x, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
// root_two_pi<double = 2.506628274631000502
|
||||
}
|
||||
*/
|
||||
|
||||
test_integrals<float>();
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
276
test/test_lambert_w_integrals_float128.cpp
Normal file
@@ -0,0 +1,276 @@
|
||||
// Copyright Paul A. Bristow 2016, 2017, 2018.
|
||||
// Copyright John Maddock 2016.
|
||||
|
||||
// Use, modification and distribution are subject to 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)
|
||||
|
||||
// test_lambert_w_integrals.cpp
|
||||
//! \brief quadrature tests that cover the whole range of the Lambert W0 function.
|
||||
|
||||
#include <boost/config.hpp> // for BOOST_MSVC definition etc.
|
||||
#include <boost/version.hpp> // for BOOST_MSVC versions.
|
||||
|
||||
#ifdef BOOST_HAS_FLOAT128
|
||||
|
||||
// Boost macros
|
||||
#define BOOST_TEST_MAIN
|
||||
#define BOOST_LIB_DIAGNOSTIC "on" // Report library file details.
|
||||
#include <boost/test/included/unit_test.hpp> // Boost.Test
|
||||
// #include <boost/test/unit_test.hpp> // Boost.Test
|
||||
#include <boost/test/floating_point_comparison.hpp>
|
||||
|
||||
#include <boost/array.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/type_traits/is_constructible.hpp>
|
||||
|
||||
#include <boost/multiprecision/float128.hpp>
|
||||
|
||||
#include <boost/math/special_functions/fpclassify.hpp> // isnan, ifinite.
|
||||
#include <boost/math/special_functions/next.hpp> // float_next, float_prior
|
||||
using boost::math::float_next;
|
||||
using boost::math::float_prior;
|
||||
#include <boost/math/special_functions/ulp.hpp> // ulp
|
||||
|
||||
#include <boost/math/tools/test_value.hpp> // for create_test_value and macro BOOST_MATH_TEST_VALUE.
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
#include <boost/math/special_functions/lambert_w.hpp> // For Lambert W lambert_w function.
|
||||
using boost::math::lambert_wm1;
|
||||
using boost::math::lambert_w0;
|
||||
|
||||
#include <limits>
|
||||
#include <cmath>
|
||||
#include <typeinfo>
|
||||
#include <iostream>
|
||||
#include <type_traits>
|
||||
#include <exception>
|
||||
|
||||
std::string show_versions(void);
|
||||
|
||||
// Added code and test for Integral of the Lambert W function: by Nick Thompson.
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function#Definite_integrals
|
||||
|
||||
#include <boost/math/constants/constants.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/tanh_sinh.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/exp_sinh.hpp> // for integral tests.
|
||||
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
// Assumes that function has a throw policy, for example:
|
||||
// NOT lambert_w0<T>(1 / (x * x), no_throw_policy());
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
template <typename T>
|
||||
T debug_integration_proc(T x)
|
||||
{
|
||||
T result; // warning C4701: potentially uninitialized local variable 'result' used
|
||||
// T result = 0 ; // But result may not be assigned below?
|
||||
try
|
||||
{
|
||||
// Assign function call to result in here...
|
||||
if (x <= sqrt(boost::math::tools::min_value<T>()) )
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = lambert_w0<T>(1 / (x * x));
|
||||
}
|
||||
// result = lambert_w0<T>(1 / (x * x), no_throw_policy()); // Bad idea, less helpful diagnostic message is:
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
|
||||
} // try
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
std::cout << "Exception " << e.what() << std::endl;
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected exception thrown in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
if (!std::isfinite(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
if (std::isnan(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
} // catch
|
||||
return result;
|
||||
} // T debug_integration_proc(T x)
|
||||
|
||||
template<class Real>
|
||||
void test_integrals()
|
||||
{
|
||||
// Integral of the Lambert W function:
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function
|
||||
using boost::math::quadrature::tanh_sinh;
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
// file:///I:/modular-boost/libs/math/doc/html/math_toolkit/quadrature/double_exponential/de_tanh_sinh.html
|
||||
using std::sqrt;
|
||||
|
||||
std::cout << "Integration of type " << typeid(Real).name() << std::endl;
|
||||
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
{ // // Integrate for function lambert_W0(z);
|
||||
tanh_sinh<Real> ts;
|
||||
Real a = 0;
|
||||
Real b = boost::math::constants::e<Real>();
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z);
|
||||
};
|
||||
Real z = ts.integrate(f, a, b); // OK without any decltype(f)
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::e<Real>() - 1, tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(z/(z sqrt(z)).
|
||||
exp_sinh<Real> es;
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z)/(z * sqrt(z));
|
||||
};
|
||||
Real z = es.integrate(f); // OK
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, 2 * boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(1/z^2).
|
||||
exp_sinh<Real> es;
|
||||
//const Real sqrt_min = sqrt(boost::math::tools::min_value<Real>()); // 1.08420217e-19 fo 32-bit float.
|
||||
// error C3493: 'sqrt_min' cannot be implicitly captured because no default capture mode has been specified
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
if (z <= sqrt(boost::math::tools::min_value<Real>()) )
|
||||
{ // Too small would underflow z * z and divide by zero to overflow 1/z^2 for lambert_w0 z parameter.
|
||||
return static_cast<Real>(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return lambert_w0<Real>(1 / (z * z)); // warning C4756: overflow in constant arithmetic, even though cannot happen.
|
||||
}
|
||||
};
|
||||
Real z = es.integrate(f);
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
} // template<class Real> void test_integrals()
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE( integrals )
|
||||
{
|
||||
std::cout << "Macro BOOST_MATH_LAMBERT_W0_INTEGRALS is defined." << std::endl;
|
||||
BOOST_TEST_MESSAGE("\nTest Lambert W0 integrals.");
|
||||
try
|
||||
{
|
||||
// using statements needed to change precision policy.
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
using boost::math::policies::precision;
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
/*
|
||||
// Experiment with better diagnostics.
|
||||
typedef float Real;
|
||||
|
||||
Real inf = std::numeric_limits<Real>::infinity();
|
||||
Real max = (std::numeric_limits<Real>::max)();
|
||||
std::cout.precision(std::numeric_limits<Real>::max_digits10);
|
||||
//std::cout << "lambert_w0(inf) = " << lambert_w0(inf) << std::endl; // lambert_w0(inf) = 1.79769e+308
|
||||
std::cout << "lambert_w0(inf, throw_policy()) = " << lambert_w0(inf, no_throw_policy()) << std::endl; // inf
|
||||
std::cout << "lambert_w0(max) = " << lambert_w0(max) << std::endl; // lambert_w0(max) = 703.227
|
||||
//std::cout << lambert_w0(inf) << std::endl; // inf - will throw.
|
||||
std::cout << "lambert_w0(0) = " << lambert_w0(0.) << std::endl; // 0
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::denorm_min()) = " << lambert_w0(std::numeric_limits<Real>::denorm_min()) << std::endl; // 4.94066e-324
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::min()) = " << lambert_w0((std::numeric_limits<Real>::min)()) << std::endl; // 2.22507e-308
|
||||
|
||||
// Approximate the largest lambert_w you can get for type T?
|
||||
float max_w_f = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<float>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max_f " << max_w_f << std::endl; // 84.2879
|
||||
Real max_w = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<Real>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max " << max_w << std::endl; // 703.227
|
||||
|
||||
std::cout << "lambert_w0(7.2416706213544837e-163) = " << lambert_w0(7.2416706213544837e-163) << std::endl; //
|
||||
std::cout << "test integral 1/z^2" << std::endl;
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1e-10, policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<11> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "epsilon = " << std::numeric_limits<Real>::epsilon() << std::endl; //
|
||||
std::cout << "sqrt(max) = " << sqrt(boost::math::tools::max_value<float>() ) << std::endl; // sqrt(max) = 1.8446742974197924e+19
|
||||
std::cout << "sqrt(min) = " << sqrt(boost::math::tools::min_value<float>() ) << std::endl; // sqrt(min) = 1.0842021724855044e-19
|
||||
|
||||
|
||||
|
||||
// Demo debug version.
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
Real x;
|
||||
{
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
exp_sinh<Real> es;
|
||||
// Function to be integrated, lambert_w0(1/z^2).
|
||||
|
||||
//auto f = [](Real z)->Real
|
||||
//{ // Naive - no protection against underflow and subsequent divide by zero.
|
||||
// return lambert_w0<Real>(1 / (z * z));
|
||||
//};
|
||||
// Diagnostic is:
|
||||
// Error in function boost::math::lambert_w0<Real>: Expected a finite value but got inf
|
||||
|
||||
auto f = [](Real z)->Real
|
||||
{ // Debug with diagnostics for underflow and subsequent divide by zero and other bad things.
|
||||
return debug_integration_proc(z);
|
||||
};
|
||||
// Exception Error in function boost::math::lambert_w0<double>: Expected a finite value but got inf.
|
||||
|
||||
// Unexpected exception thrown in integration code at abscissa: 7.2416706213544837e-163.
|
||||
// Unexpected exception thrown in integration code at abscissa (x): 3.478765835953569e-23.
|
||||
x = es.integrate(f);
|
||||
std::cout << "es.integrate(f) = " << x << std::endl;
|
||||
BOOST_CHECK_CLOSE_FRACTION(x, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
// root_two_pi<double = 2.506628274631000502
|
||||
}
|
||||
*/
|
||||
|
||||
test_integrals<boost::multiprecision::float128>();
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int main() { return 0; }
|
||||
|
||||
#endif
|
||||
266
test/test_lambert_w_integrals_long_double.cpp
Normal file
@@ -0,0 +1,266 @@
|
||||
// Copyright Paul A. Bristow 2016, 2017, 2018.
|
||||
// Copyright John Maddock 2016.
|
||||
|
||||
// Use, modification and distribution are subject to 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)
|
||||
|
||||
// test_lambert_w_integrals.cpp
|
||||
//! \brief quadrature tests that cover the whole range of the Lambert W0 function.
|
||||
|
||||
#include <boost/config.hpp> // for BOOST_MSVC definition etc.
|
||||
#include <boost/version.hpp> // for BOOST_MSVC versions.
|
||||
|
||||
// Boost macros
|
||||
#define BOOST_TEST_MAIN
|
||||
#define BOOST_LIB_DIAGNOSTIC "on" // Report library file details.
|
||||
#include <boost/test/included/unit_test.hpp> // Boost.Test
|
||||
// #include <boost/test/unit_test.hpp> // Boost.Test
|
||||
#include <boost/test/floating_point_comparison.hpp>
|
||||
|
||||
#include <boost/array.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/type_traits/is_constructible.hpp>
|
||||
#include <boost/math/special_functions/fpclassify.hpp> // isnan, ifinite.
|
||||
#include <boost/math/special_functions/next.hpp> // float_next, float_prior
|
||||
using boost::math::float_next;
|
||||
using boost::math::float_prior;
|
||||
#include <boost/math/special_functions/ulp.hpp> // ulp
|
||||
|
||||
#include <boost/math/tools/test_value.hpp> // for create_test_value and macro BOOST_MATH_TEST_VALUE.
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
#include <boost/math/special_functions/lambert_w.hpp> // For Lambert W lambert_w function.
|
||||
using boost::math::lambert_wm1;
|
||||
using boost::math::lambert_w0;
|
||||
|
||||
#include <limits>
|
||||
#include <cmath>
|
||||
#include <typeinfo>
|
||||
#include <iostream>
|
||||
#include <type_traits>
|
||||
#include <exception>
|
||||
|
||||
std::string show_versions(void);
|
||||
|
||||
// Added code and test for Integral of the Lambert W function: by Nick Thompson.
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function#Definite_integrals
|
||||
|
||||
#include <boost/math/constants/constants.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/tanh_sinh.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/exp_sinh.hpp> // for integral tests.
|
||||
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
// Assumes that function has a throw policy, for example:
|
||||
// NOT lambert_w0<T>(1 / (x * x), no_throw_policy());
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
template <typename T>
|
||||
T debug_integration_proc(T x)
|
||||
{
|
||||
T result; // warning C4701: potentially uninitialized local variable 'result' used
|
||||
// T result = 0 ; // But result may not be assigned below?
|
||||
try
|
||||
{
|
||||
// Assign function call to result in here...
|
||||
if (x <= sqrt(boost::math::tools::min_value<T>()) )
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = lambert_w0<T>(1 / (x * x));
|
||||
}
|
||||
// result = lambert_w0<T>(1 / (x * x), no_throw_policy()); // Bad idea, less helpful diagnostic message is:
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
|
||||
} // try
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
std::cout << "Exception " << e.what() << std::endl;
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected exception thrown in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
if (!std::isfinite(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
if (std::isnan(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
} // catch
|
||||
return result;
|
||||
} // T debug_integration_proc(T x)
|
||||
|
||||
template<class Real>
|
||||
void test_integrals()
|
||||
{
|
||||
// Integral of the Lambert W function:
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function
|
||||
using boost::math::quadrature::tanh_sinh;
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
// file:///I:/modular-boost/libs/math/doc/html/math_toolkit/quadrature/double_exponential/de_tanh_sinh.html
|
||||
using std::sqrt;
|
||||
|
||||
std::cout << "Integration of type " << typeid(Real).name() << std::endl;
|
||||
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
{ // // Integrate for function lambert_W0(z);
|
||||
tanh_sinh<Real> ts;
|
||||
Real a = 0;
|
||||
Real b = boost::math::constants::e<Real>();
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z);
|
||||
};
|
||||
Real z = ts.integrate(f, a, b); // OK without any decltype(f)
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::e<Real>() - 1, tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(z/(z sqrt(z)).
|
||||
exp_sinh<Real> es;
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z)/(z * sqrt(z));
|
||||
};
|
||||
Real z = es.integrate(f); // OK
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, 2 * boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(1/z^2).
|
||||
exp_sinh<Real> es;
|
||||
//const Real sqrt_min = sqrt(boost::math::tools::min_value<Real>()); // 1.08420217e-19 fo 32-bit float.
|
||||
// error C3493: 'sqrt_min' cannot be implicitly captured because no default capture mode has been specified
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
if (z <= sqrt(boost::math::tools::min_value<Real>()) )
|
||||
{ // Too small would underflow z * z and divide by zero to overflow 1/z^2 for lambert_w0 z parameter.
|
||||
return static_cast<Real>(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return lambert_w0<Real>(1 / (z * z)); // warning C4756: overflow in constant arithmetic, even though cannot happen.
|
||||
}
|
||||
};
|
||||
Real z = es.integrate(f);
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
} // template<class Real> void test_integrals()
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE( integrals )
|
||||
{
|
||||
std::cout << "Macro BOOST_MATH_LAMBERT_W0_INTEGRALS is defined." << std::endl;
|
||||
BOOST_TEST_MESSAGE("\nTest Lambert W0 integrals.");
|
||||
try
|
||||
{
|
||||
// using statements needed to change precision policy.
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
using boost::math::policies::precision;
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
/*
|
||||
// Experiment with better diagnostics.
|
||||
typedef float Real;
|
||||
|
||||
Real inf = std::numeric_limits<Real>::infinity();
|
||||
Real max = (std::numeric_limits<Real>::max)();
|
||||
std::cout.precision(std::numeric_limits<Real>::max_digits10);
|
||||
//std::cout << "lambert_w0(inf) = " << lambert_w0(inf) << std::endl; // lambert_w0(inf) = 1.79769e+308
|
||||
std::cout << "lambert_w0(inf, throw_policy()) = " << lambert_w0(inf, no_throw_policy()) << std::endl; // inf
|
||||
std::cout << "lambert_w0(max) = " << lambert_w0(max) << std::endl; // lambert_w0(max) = 703.227
|
||||
//std::cout << lambert_w0(inf) << std::endl; // inf - will throw.
|
||||
std::cout << "lambert_w0(0) = " << lambert_w0(0.) << std::endl; // 0
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::denorm_min()) = " << lambert_w0(std::numeric_limits<Real>::denorm_min()) << std::endl; // 4.94066e-324
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::min()) = " << lambert_w0((std::numeric_limits<Real>::min)()) << std::endl; // 2.22507e-308
|
||||
|
||||
// Approximate the largest lambert_w you can get for type T?
|
||||
float max_w_f = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<float>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max_f " << max_w_f << std::endl; // 84.2879
|
||||
Real max_w = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<Real>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max " << max_w << std::endl; // 703.227
|
||||
|
||||
std::cout << "lambert_w0(7.2416706213544837e-163) = " << lambert_w0(7.2416706213544837e-163) << std::endl; //
|
||||
std::cout << "test integral 1/z^2" << std::endl;
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1e-10, policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<11> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "epsilon = " << std::numeric_limits<Real>::epsilon() << std::endl; //
|
||||
std::cout << "sqrt(max) = " << sqrt(boost::math::tools::max_value<float>() ) << std::endl; // sqrt(max) = 1.8446742974197924e+19
|
||||
std::cout << "sqrt(min) = " << sqrt(boost::math::tools::min_value<float>() ) << std::endl; // sqrt(min) = 1.0842021724855044e-19
|
||||
|
||||
|
||||
|
||||
// Demo debug version.
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
Real x;
|
||||
{
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
exp_sinh<Real> es;
|
||||
// Function to be integrated, lambert_w0(1/z^2).
|
||||
|
||||
//auto f = [](Real z)->Real
|
||||
//{ // Naive - no protection against underflow and subsequent divide by zero.
|
||||
// return lambert_w0<Real>(1 / (z * z));
|
||||
//};
|
||||
// Diagnostic is:
|
||||
// Error in function boost::math::lambert_w0<Real>: Expected a finite value but got inf
|
||||
|
||||
auto f = [](Real z)->Real
|
||||
{ // Debug with diagnostics for underflow and subsequent divide by zero and other bad things.
|
||||
return debug_integration_proc(z);
|
||||
};
|
||||
// Exception Error in function boost::math::lambert_w0<double>: Expected a finite value but got inf.
|
||||
|
||||
// Unexpected exception thrown in integration code at abscissa: 7.2416706213544837e-163.
|
||||
// Unexpected exception thrown in integration code at abscissa (x): 3.478765835953569e-23.
|
||||
x = es.integrate(f);
|
||||
std::cout << "es.integrate(f) = " << x << std::endl;
|
||||
BOOST_CHECK_CLOSE_FRACTION(x, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
// root_two_pi<double = 2.506628274631000502
|
||||
}
|
||||
*/
|
||||
|
||||
test_integrals<long double>();
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
269
test/test_lambert_w_integrals_quad.cpp
Normal file
@@ -0,0 +1,269 @@
|
||||
// Copyright Paul A. Bristow 2016, 2017, 2018.
|
||||
// Copyright John Maddock 2016.
|
||||
|
||||
// Use, modification and distribution are subject to 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)
|
||||
|
||||
// test_lambert_w_integrals.cpp
|
||||
//! \brief quadrature tests that cover the whole range of the Lambert W0 function.
|
||||
|
||||
#include <boost/config.hpp> // for BOOST_MSVC definition etc.
|
||||
#include <boost/version.hpp> // for BOOST_MSVC versions.
|
||||
|
||||
// Boost macros
|
||||
#define BOOST_TEST_MAIN
|
||||
#define BOOST_LIB_DIAGNOSTIC "on" // Report library file details.
|
||||
#include <boost/test/included/unit_test.hpp> // Boost.Test
|
||||
// #include <boost/test/unit_test.hpp> // Boost.Test
|
||||
#include <boost/test/floating_point_comparison.hpp>
|
||||
|
||||
#include <boost/array.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/type_traits/is_constructible.hpp>
|
||||
#include <boost/multiprecision/cpp_bin_float.hpp>
|
||||
using boost::multiprecision::cpp_bin_float_quad;
|
||||
|
||||
#include <boost/math/special_functions/fpclassify.hpp> // isnan, ifinite.
|
||||
#include <boost/math/special_functions/next.hpp> // float_next, float_prior
|
||||
using boost::math::float_next;
|
||||
using boost::math::float_prior;
|
||||
#include <boost/math/special_functions/ulp.hpp> // ulp
|
||||
|
||||
#include <boost/math/tools/test_value.hpp> // for create_test_value and macro BOOST_MATH_TEST_VALUE.
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
#include <boost/math/special_functions/lambert_w.hpp> // For Lambert W lambert_w function.
|
||||
using boost::math::lambert_wm1;
|
||||
using boost::math::lambert_w0;
|
||||
|
||||
#include <limits>
|
||||
#include <cmath>
|
||||
#include <typeinfo>
|
||||
#include <iostream>
|
||||
#include <type_traits>
|
||||
#include <exception>
|
||||
|
||||
std::string show_versions(void);
|
||||
|
||||
// Added code and test for Integral of the Lambert W function: by Nick Thompson.
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function#Definite_integrals
|
||||
|
||||
#include <boost/math/constants/constants.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/tanh_sinh.hpp> // for integral tests.
|
||||
#include <boost/math/quadrature/exp_sinh.hpp> // for integral tests.
|
||||
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
// Assumes that function has a throw policy, for example:
|
||||
// NOT lambert_w0<T>(1 / (x * x), no_throw_policy());
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
template <typename T>
|
||||
T debug_integration_proc(T x)
|
||||
{
|
||||
T result; // warning C4701: potentially uninitialized local variable 'result' used
|
||||
// T result = 0 ; // But result may not be assigned below?
|
||||
try
|
||||
{
|
||||
// Assign function call to result in here...
|
||||
if (x <= sqrt(boost::math::tools::min_value<T>()) )
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = lambert_w0<T>(1 / (x * x));
|
||||
}
|
||||
// result = lambert_w0<T>(1 / (x * x), no_throw_policy()); // Bad idea, less helpful diagnostic message is:
|
||||
// Error in function boost::math::quadrature::exp_sinh<double>::integrate:
|
||||
// The exp_sinh quadrature evaluated your function at a singular point and resulted in inf.
|
||||
// Please ensure your function evaluates to a finite number of its entire domain.
|
||||
|
||||
} // try
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
std::cout << "Exception " << e.what() << std::endl;
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected exception thrown in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
if (!std::isfinite(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
if (std::isnan(result))
|
||||
{
|
||||
// set breakpoint here:
|
||||
std::cout << "Unexpected non-finite result in integration code at abscissa (x): " << x << "." << std::endl;
|
||||
}
|
||||
} // catch
|
||||
return result;
|
||||
} // T debug_integration_proc(T x)
|
||||
|
||||
template<class Real>
|
||||
void test_integrals()
|
||||
{
|
||||
// Integral of the Lambert W function:
|
||||
// https://en.wikipedia.org/wiki/Lambert_W_function
|
||||
using boost::math::quadrature::tanh_sinh;
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
// file:///I:/modular-boost/libs/math/doc/html/math_toolkit/quadrature/double_exponential/de_tanh_sinh.html
|
||||
using std::sqrt;
|
||||
|
||||
std::cout << "Integration of type " << typeid(Real).name() << std::endl;
|
||||
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
{ // // Integrate for function lambert_W0(z);
|
||||
tanh_sinh<Real> ts;
|
||||
Real a = 0;
|
||||
Real b = boost::math::constants::e<Real>();
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z);
|
||||
};
|
||||
Real z = ts.integrate(f, a, b); // OK without any decltype(f)
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::e<Real>() - 1, tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(z/(z sqrt(z)).
|
||||
exp_sinh<Real> es;
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
return lambert_w0<Real>(z)/(z * sqrt(z));
|
||||
};
|
||||
Real z = es.integrate(f); // OK
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, 2 * boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
{
|
||||
// Integrate for function lambert_W0(1/z^2).
|
||||
exp_sinh<Real> es;
|
||||
//const Real sqrt_min = sqrt(boost::math::tools::min_value<Real>()); // 1.08420217e-19 fo 32-bit float.
|
||||
// error C3493: 'sqrt_min' cannot be implicitly captured because no default capture mode has been specified
|
||||
auto f = [](Real z)->Real
|
||||
{
|
||||
if (z <= sqrt(boost::math::tools::min_value<Real>()) )
|
||||
{ // Too small would underflow z * z and divide by zero to overflow 1/z^2 for lambert_w0 z parameter.
|
||||
return static_cast<Real>(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return lambert_w0<Real>(1 / (z * z)); // warning C4756: overflow in constant arithmetic, even though cannot happen.
|
||||
}
|
||||
};
|
||||
Real z = es.integrate(f);
|
||||
BOOST_CHECK_CLOSE_FRACTION(z, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
}
|
||||
} // template<class Real> void test_integrals()
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE( integrals )
|
||||
{
|
||||
std::cout << "Macro BOOST_MATH_LAMBERT_W0_INTEGRALS is defined." << std::endl;
|
||||
BOOST_TEST_MESSAGE("\nTest Lambert W0 integrals.");
|
||||
try
|
||||
{
|
||||
// using statements needed to change precision policy.
|
||||
using boost::math::policies::policy;
|
||||
using boost::math::policies::make_policy;
|
||||
using boost::math::policies::precision;
|
||||
using boost::math::policies::digits2;
|
||||
using boost::math::policies::digits10;
|
||||
|
||||
// using statements needed for changing error handling policy.
|
||||
using boost::math::policies::evaluation_error;
|
||||
using boost::math::policies::domain_error;
|
||||
using boost::math::policies::overflow_error;
|
||||
using boost::math::policies::ignore_error;
|
||||
using boost::math::policies::throw_on_error;
|
||||
|
||||
typedef policy<
|
||||
domain_error<throw_on_error>,
|
||||
overflow_error<ignore_error>
|
||||
> no_throw_policy;
|
||||
|
||||
/*
|
||||
// Experiment with better diagnostics.
|
||||
typedef float Real;
|
||||
|
||||
Real inf = std::numeric_limits<Real>::infinity();
|
||||
Real max = (std::numeric_limits<Real>::max)();
|
||||
std::cout.precision(std::numeric_limits<Real>::max_digits10);
|
||||
//std::cout << "lambert_w0(inf) = " << lambert_w0(inf) << std::endl; // lambert_w0(inf) = 1.79769e+308
|
||||
std::cout << "lambert_w0(inf, throw_policy()) = " << lambert_w0(inf, no_throw_policy()) << std::endl; // inf
|
||||
std::cout << "lambert_w0(max) = " << lambert_w0(max) << std::endl; // lambert_w0(max) = 703.227
|
||||
//std::cout << lambert_w0(inf) << std::endl; // inf - will throw.
|
||||
std::cout << "lambert_w0(0) = " << lambert_w0(0.) << std::endl; // 0
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::denorm_min()) = " << lambert_w0(std::numeric_limits<Real>::denorm_min()) << std::endl; // 4.94066e-324
|
||||
std::cout << "lambert_w0(std::numeric_limits<Real>::min()) = " << lambert_w0((std::numeric_limits<Real>::min)()) << std::endl; // 2.22507e-308
|
||||
|
||||
// Approximate the largest lambert_w you can get for type T?
|
||||
float max_w_f = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<float>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max_f " << max_w_f << std::endl; // 84.2879
|
||||
Real max_w = boost::math::lambert_w_detail::lambert_w0_approx((std::numeric_limits<Real>::max)()); // Corless equation 4.19, page 349, and Chapeau-Blondeau equation 20, page 2162.
|
||||
std::cout << "w max " << max_w << std::endl; // 703.227
|
||||
|
||||
std::cout << "lambert_w0(7.2416706213544837e-163) = " << lambert_w0(7.2416706213544837e-163) << std::endl; //
|
||||
std::cout << "test integral 1/z^2" << std::endl;
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1e-10, policy<digits2<> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "ULP = " << boost::math::ulp(1., policy<digits2<11> >()) << std::endl; // ULP = 2.2204460492503131e-16
|
||||
std::cout << "epsilon = " << std::numeric_limits<Real>::epsilon() << std::endl; //
|
||||
std::cout << "sqrt(max) = " << sqrt(boost::math::tools::max_value<float>() ) << std::endl; // sqrt(max) = 1.8446742974197924e+19
|
||||
std::cout << "sqrt(min) = " << sqrt(boost::math::tools::min_value<float>() ) << std::endl; // sqrt(min) = 1.0842021724855044e-19
|
||||
|
||||
|
||||
|
||||
// Demo debug version.
|
||||
Real tol = std::numeric_limits<Real>::epsilon();
|
||||
Real x;
|
||||
{
|
||||
using boost::math::quadrature::exp_sinh;
|
||||
exp_sinh<Real> es;
|
||||
// Function to be integrated, lambert_w0(1/z^2).
|
||||
|
||||
//auto f = [](Real z)->Real
|
||||
//{ // Naive - no protection against underflow and subsequent divide by zero.
|
||||
// return lambert_w0<Real>(1 / (z * z));
|
||||
//};
|
||||
// Diagnostic is:
|
||||
// Error in function boost::math::lambert_w0<Real>: Expected a finite value but got inf
|
||||
|
||||
auto f = [](Real z)->Real
|
||||
{ // Debug with diagnostics for underflow and subsequent divide by zero and other bad things.
|
||||
return debug_integration_proc(z);
|
||||
};
|
||||
// Exception Error in function boost::math::lambert_w0<double>: Expected a finite value but got inf.
|
||||
|
||||
// Unexpected exception thrown in integration code at abscissa: 7.2416706213544837e-163.
|
||||
// Unexpected exception thrown in integration code at abscissa (x): 3.478765835953569e-23.
|
||||
x = es.integrate(f);
|
||||
std::cout << "es.integrate(f) = " << x << std::endl;
|
||||
BOOST_CHECK_CLOSE_FRACTION(x, boost::math::constants::root_two_pi<Real>(), tol);
|
||||
// root_two_pi<double = 2.506628274631000502
|
||||
}
|
||||
*/
|
||||
|
||||
test_integrals<cpp_bin_float_quad>();
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << ex.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
182
tools/lambert_w_high_reference_values.cpp
Normal file
@@ -0,0 +1,182 @@
|
||||
// \modular-boost\libs\math\test\lambert_w_high_reference_values.cpp
|
||||
|
||||
// Copyright Paul A. Bristow 2017.
|
||||
// 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)
|
||||
|
||||
// Write a C++ file \lambert_w_mp_hi_values.ipp
|
||||
// containing arrays of z arguments and 100 decimal digit precision lambert_w0(z) reference values.
|
||||
// These can be used in tests of precision of less-precise types like
|
||||
// built-in float, double, long double and quad and cpp_dec_float_50.
|
||||
|
||||
// These cover the range from 0.5 to (std::numeric_limits<>::max)();
|
||||
// The Fukushima algorithm changes from a series function for all z > 0.5.
|
||||
|
||||
// Multiprecision types:
|
||||
//#include <boost/multiprecision/cpp_bin_float.hpp>
|
||||
#include <boost/multiprecision/cpp_dec_float.hpp> // boost::multiprecision::cpp_dec_float_100
|
||||
using boost::multiprecision::cpp_dec_float_100;
|
||||
|
||||
#include <boost/math/special_functions/lambert_w.hpp> //
|
||||
using boost::math::lambert_w0;
|
||||
using boost::math::lambert_wm1;
|
||||
|
||||
#include <iostream>
|
||||
// using std::cout; using std::std::endl; using std::ios; using std::std::cerr;
|
||||
#include <iomanip>
|
||||
using std::setprecision;
|
||||
using std::showpoint;
|
||||
#include <fstream>
|
||||
using std::ofstream;
|
||||
#include <cassert>
|
||||
#include <cfloat> // for DBL_EPS etc
|
||||
#include <limits> // for numeric limits.
|
||||
//#include <ctype>
|
||||
#include <string>
|
||||
|
||||
const long double eps = std::numeric_limits<long double>::epsilon();
|
||||
|
||||
// Creates if no file exists, & uses default overwrite/ ios::replace.
|
||||
const char filename[] = "lambert_w_high_reference_values.ipp"; //
|
||||
std::ofstream fout(filename, std::ios::out);
|
||||
|
||||
typedef cpp_dec_float_100 RealType; // 100 decimal digits for the value fed to macro BOOST_MATH_TEST_VALUE.
|
||||
// Could also use cpp_dec_float_50 or cpp_bin_float types.
|
||||
|
||||
const int no_of_tests = 450; // 500 overflows float.
|
||||
|
||||
static const float min_z = 0.5F; // for element[0]
|
||||
|
||||
int main()
|
||||
{ // Make C++ file containing Lambert W test values.
|
||||
std::cout << filename << " ";
|
||||
std::cout << std::endl;
|
||||
std::cout << "Lambert W0 decimal digit precision values for high z argument values." << std::endl;
|
||||
|
||||
if (!fout.is_open())
|
||||
{ // File failed to open OK.
|
||||
std::cerr << "Open file " << filename << " failed!" << std::endl;
|
||||
std::cerr << "errno " << errno << std::endl;
|
||||
return -1;
|
||||
}
|
||||
try
|
||||
{
|
||||
int output_precision = std::numeric_limits<RealType>::digits10;
|
||||
// cpp_dec_float_100 is ample precision and
|
||||
// has several extra bits internally so max_digits10 are not needed.
|
||||
fout.precision(output_precision);
|
||||
fout << std::showpoint << std::endl; // Do show trailing zeros.
|
||||
|
||||
// Intro for RealType values.
|
||||
std::cout << "Lambert W test values written to file " << filename << std::endl;
|
||||
fout <<
|
||||
"\n"
|
||||
"// A collection of big Lambert W test values computed using "
|
||||
<< output_precision << " decimal digits precision.\n"
|
||||
"// C++ floating-point type is " << "RealType." "\n"
|
||||
"\n"
|
||||
"// Written by " << __FILE__ << " " << __TIMESTAMP__ << "\n"
|
||||
|
||||
"\n"
|
||||
"// Copyright Paul A. Bristow 2017." "\n"
|
||||
"// Distributed under the Boost Software License, Version 1.0." "\n"
|
||||
"// (See accompanying file LICENSE_1_0.txt" "\n"
|
||||
"// or copy at http://www.boost.org/LICENSE_1_0.txt)" "\n"
|
||||
<< std::endl;
|
||||
|
||||
fout << "// Size of arrays of arguments z and Lambert W" << std::endl;
|
||||
fout << "static const unsigned int noof_tests = " << no_of_tests << ";" << std::endl;
|
||||
|
||||
// Declare arrays of z and Lambert W.
|
||||
fout << "\n// Declare arrays of arguments z and Lambert W(z)" << std::endl;
|
||||
fout <<
|
||||
"\n"
|
||||
"template <typename RealType>""\n"
|
||||
"static RealType zs[" << no_of_tests << "];"
|
||||
<< std::endl;
|
||||
|
||||
fout <<
|
||||
"\n"
|
||||
"template <typename RealType>""\n"
|
||||
"static RealType ws[" << no_of_tests << "];"
|
||||
<< std::endl;
|
||||
|
||||
fout << "// The values are defined using the macro BOOST_MATH_TEST_VALUE to ensure\n"
|
||||
"// that both built-in and multiprecision types are correctly initialiased with full precision.\n"
|
||||
"// built-in types like float, double require a floating-point literal like 3.14,\n"
|
||||
"// but multiprecision types require a decimal digit string like \"3.14\".\n"
|
||||
"// Numerical values are chosen to avoid exactly representable values."
|
||||
<< std::endl;
|
||||
|
||||
static const RealType min_z = 0.6; // for element[0]
|
||||
|
||||
const RealType max_z = (std::numeric_limits<float>::max)() / 10; // (std::numeric_limits<float>::max)() to make sure is OK for all floating-point types.
|
||||
// Less a bit as lambert_w0(max) may be inaccurate.
|
||||
const RealType step_size = 0.5F; // Increment step size.
|
||||
const RealType step_factor = 2.f; // Multiple factor, typically 2, 5 or 10.
|
||||
const int step_modulo = 5;
|
||||
|
||||
RealType z = min_z;
|
||||
|
||||
// Output function to initialize array of arguments z and Lambert W.
|
||||
fout <<
|
||||
"\n"
|
||||
<< "template <typename RealType>\n"
|
||||
"void init_zws()\n"
|
||||
"{\n";
|
||||
|
||||
for (size_t index = 0; (index != no_of_tests); index++)
|
||||
{
|
||||
fout
|
||||
<< " zs<RealType>[" << index << "] = BOOST_MATH_TEST_VALUE(RealType, "
|
||||
<< z // Since start with converting a float may get lots of usefully random digits.
|
||||
<< ");"
|
||||
<< std::endl;
|
||||
|
||||
fout
|
||||
<< " ws<RealType>[" << index << "] = BOOST_MATH_TEST_VALUE(RealType, "
|
||||
<< lambert_w0(z)
|
||||
<< ");"
|
||||
<< std::endl;
|
||||
|
||||
if ((index % step_modulo) == 0)
|
||||
{
|
||||
z *= step_factor; //
|
||||
}
|
||||
z += step_size;
|
||||
if (z >= max_z)
|
||||
{ // Don't go over max for float.
|
||||
std::cout << "too big z" << std::endl;
|
||||
break;
|
||||
}
|
||||
} // for index
|
||||
fout << "};" << std::endl;
|
||||
|
||||
fout << "// End of lambert_w_mp_high_values.ipp " << std::endl;
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << "Exception " << ex.what() << std::endl;
|
||||
}
|
||||
|
||||
fout.close();
|
||||
|
||||
std::cout << no_of_tests << " Lambert_w0 values written to files " << __TIMESTAMP__ << std::endl;
|
||||
return 0;
|
||||
} // main
|
||||
|
||||
|
||||
/*
|
||||
A few spot checks again Wolfram:
|
||||
|
||||
zs<RealType>[1] = BOOST_MATH_TEST_VALUE(RealType, 1.6999999999999999555910790149937383830547332763671875);
|
||||
ws<RealType>[1] = BOOST_MATH_TEST_VALUE(RealType, 0.7796011225311008662356536916883580556792500749037209859530390902424444585607630246126725241921761054);
|
||||
Wolfram 0.7796011225311008662356536916883580556792500749037209859530390902424444585607630246126725241921761054
|
||||
|
||||
zs<RealType>[99] = BOOST_MATH_TEST_VALUE(RealType, 3250582.599999999976716935634613037109375);
|
||||
ws<RealType>[99] = BOOST_MATH_TEST_VALUE(RealType, 12.47094339016839065212822905567651460418204106065566910956134121802725695306834966790193342511971825);
|
||||
Wolfram 12.47094339016839065212822905567651460418204106065566910956134121802725695306834966790193342511971825
|
||||
|
||||
*/
|
||||
|
||||
469
tools/lambert_w_lookup_table_generator.cpp
Normal file
@@ -0,0 +1,469 @@
|
||||
// Lambert W lookup table generator lambert_w_lookup_table_generator.cpp
|
||||
|
||||
//! \file
|
||||
//! Output a table of precomputed array values for Lambert W0 and W-1,
|
||||
//! and square roots and halves, and powers of e,
|
||||
// as a .ipp file for use by lambert_w.hpp.
|
||||
|
||||
//! \details Output as long double precision (suffix L) using Boost.Multiprecision
|
||||
//! to 34 decimal digits precision to cater for platforms that have 128-bit long double.
|
||||
//! The function bisection can then use any built-in floating-point type,
|
||||
//! which may have different precision and speed on different platforms.
|
||||
//! The actual builtin floating-point type of the arrays is chosen by a
|
||||
//! typedef in \modular-boost\libs\math\include\boost\math\special_functions\lambert_w.hpp
|
||||
//! by default, for example: typedef double lookup_t;
|
||||
|
||||
|
||||
// This includes lookup tables for both branches W0 and W-1.
|
||||
// Only W-1 is needed by current code that uses JM rational Polynomials,
|
||||
// but W0 is kept (for now) to allow comparison with the previous FKDVPB version
|
||||
// that uses lookup for W0 branch as well as W-1.
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/math/constants/constants.hpp> // For exp_minus_one == 3.67879441171442321595523770161460867e-01.
|
||||
using boost::math::constants::exp_minus_one; // 0.36787944
|
||||
using boost::math::constants::root_e; // 1.64872
|
||||
#include <boost/multiprecision/cpp_bin_float.hpp>
|
||||
using boost::multiprecision::cpp_bin_float_quad;
|
||||
using boost::multiprecision::cpp_bin_float_50;
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <typeinfo>
|
||||
|
||||
/*
|
||||
typedef double lookup_t; // Type for lookup table (double or float?)
|
||||
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_sqrts = 12;
|
||||
BOOST_STATIC_CONSTEXPR lookup_t a[noof_sqrts] = // 0.6065 0.7788, 0.8824 ... 0.9997, sqrt of previous elements.
|
||||
{
|
||||
0.60653065971263342, 0.77880078307140487, 0.8824969025845954, 0.93941306281347579, 0.96923323447634408, 0.98449643700540841,
|
||||
0.99221793826024351, 0.99610136947011749, 0.99804878110747547, 0.99902391418197566, 0.99951183793988937, 0.99975588917489722
|
||||
};
|
||||
BOOST_STATIC_CONSTEXPR lookup_t b[noof_sqrts] = // 0.5 0.25 0.125, 0.0625 ... 0.0002441, halves of previous elements.
|
||||
{ 0.5, 0.25, 0.125, 0.0625, 0.03125, 0.015625, 0.0078125, 0.00390625, 0.001953125, 0.0009765625, 0.00048828125, 0.000244140625 };
|
||||
|
||||
BOOST_STATIC_CONSTEXPR size_t noof_w0zs = 65;
|
||||
BOOST_STATIC_CONSTEXPR lookup_t g[noof_w0zs] = // lambert_w[k] for W0 branch. 0 2.7182 14.77 60.2566 ... 1.445e+29 3.990e+29.
|
||||
{ 0., 2.7182818284590452, 14.7781121978613, 60.256610769563003, 218.39260013257696, 742.06579551288302, 2420.5727609564107, 7676.4321089992102,
|
||||
23847.663896333826, 72927.755348178456, 220264.65794806717, 658615.558867176, 1953057.4970280471, 5751374.0961159665, 16836459.978306875, 49035260.58708166,
|
||||
142177768.32812596, 410634196.81078007, 1181879444.4719492, 3391163718.300558, 9703303908.1958056, 27695130424.147509, 78868082614.895014, 224130479263.72476,
|
||||
635738931116.24334, 1800122483434.6468, 5088969845149.8079, 14365302496248.563, 40495197800161.305, 114008694617177.22, 320594237445733.86,
|
||||
900514339622670.18, 2526814725845782.2, 7083238132935230.1, 19837699245933466., 55510470830970076., 1.5520433569614703e+17, 4.3360826779369662e+17,
|
||||
1.2105254067703227e+18, 3.3771426165357561e+18, 9.4154106734807994e+18, 2.6233583234732253e+19, 7.3049547543861044e+19, 2.032970971338619e+20,
|
||||
5.6547040503180956e+20, 1.5720421975868293e+21, 4.3682149334771265e+21, 1.2132170565093317e+22, 3.3680332378068632e+22, 9.3459982052259885e+22,
|
||||
2.5923527642935362e+23, 7.1876803203773879e+23, 1.99212416037262e+24, 5.5192924995054165e+24, 1.5286067837683347e+25, 4.2321318958281094e+25,
|
||||
1.1713293177672778e+26, 3.2408603996214814e+26, 8.9641258264226028e+26, 2.4787141382364034e+27, 6.8520443388941057e+27, 1.8936217407781711e+28,
|
||||
5.2317811346197018e+28, 1.4450833904658542e+29, 3.9904954117194348e+29
|
||||
};
|
||||
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_wm1zs = 66;
|
||||
BOOST_STATIC_CONSTEXPR lookup_t e[noof_wm1zs] = // lambert_w[k] for W-1 branch. 2.7182 1. 0.3678 0.1353 0.04978 ... 4.359e-28 1.603e-28
|
||||
{
|
||||
2.7182818284590452, 1., 0.36787944117144232, 0.13533528323661269, 0.049787068367863943, 0.01831563888873418, 0.0067379469990854671,
|
||||
0.0024787521766663584, 0.00091188196555451621, 0.00033546262790251184, 0.00012340980408667955, 4.5399929762484852e-05, 1.6701700790245659e-05,
|
||||
6.1442123533282098e-06, 2.2603294069810543e-06, 8.3152871910356788e-07, 3.0590232050182579e-07, 1.1253517471925911e-07, 4.1399377187851667e-08,
|
||||
1.5229979744712628e-08, 5.6027964375372675e-09, 2.0611536224385578e-09, 7.5825604279119067e-10, 2.7894680928689248e-10, 1.026187963170189e-10,
|
||||
3.7751345442790977e-11, 1.3887943864964021e-11, 5.1090890280633247e-12, 1.8795288165390833e-12, 6.914400106940203e-13, 2.5436656473769229e-13,
|
||||
9.3576229688401746e-14, 3.4424771084699765e-14, 1.2664165549094176e-14, 4.6588861451033974e-15, 1.713908431542013e-15, 6.3051167601469894e-16,
|
||||
2.3195228302435694e-16, 8.5330476257440658e-17, 3.1391327920480296e-17, 1.1548224173015786e-17, 4.248354255291589e-18, 1.5628821893349888e-18,
|
||||
5.7495222642935598e-19, 2.1151310375910805e-19, 7.7811322411337965e-20, 2.8625185805493936e-20, 1.0530617357553812e-20, 3.8739976286871871e-21,
|
||||
1.4251640827409351e-21, 5.2428856633634639e-22, 1.9287498479639178e-22, 7.0954741622847041e-23, 2.6102790696677048e-23, 9.602680054508676e-24,
|
||||
3.532628572200807e-24, 1.2995814250075031e-24, 4.7808928838854691e-25, 1.7587922024243116e-25, 6.4702349256454603e-26, 2.3802664086944006e-26,
|
||||
8.7565107626965203e-27, 3.2213402859925161e-27, 1.185064864233981e-27, 4.359610000063081e-28, 1.6038108905486378e-28
|
||||
};
|
||||
|
||||
lambert_w0 version of array from Fukushima
|
||||
|
||||
// lambert_w[k] for W-1 branch. 2.7182 1. 0.3678 0.1353 0.04978 ... 4.359e-28 1.603e-28
|
||||
e: 2.7182818284590452, 1., 0.36787944117144232, 0.13533528323661269, 0.049787068367863943, 0.01831563888873418, 0.0067379469990854671,
|
||||
0.0024787521766663584, 0.00091188196555451621, 0.00033546262790251184, 0.00012340980408667955, 4.5399929762484852e-05, 1.6701700790245659e-05,
|
||||
6.1442123533282098e-06, 2.2603294069810543e-06, 8.3152871910356788e-07, 3.0590232050182579e-07, 1.1253517471925911e-07, 4.1399377187851667e-08,
|
||||
1.5229979744712628e-08, 5.6027964375372675e-09, 2.0611536224385578e-09, 7.5825604279119067e-10, 2.7894680928689248e-10, 1.026187963170189e-10,
|
||||
3.7751345442790977e-11, 1.3887943864964021e-11, 5.1090890280633247e-12, 1.8795288165390833e-12, 6.914400106940203e-13, 2.5436656473769229e-13,
|
||||
9.3576229688401746e-14, 3.4424771084699765e-14, 1.2664165549094176e-14, 4.6588861451033974e-15, 1.713908431542013e-15, 6.3051167601469894e-16,
|
||||
2.3195228302435694e-16, 8.5330476257440658e-17, 3.1391327920480296e-17, 1.1548224173015786e-17, 4.248354255291589e-18, 1.5628821893349888e-18,
|
||||
5.7495222642935598e-19, 2.1151310375910805e-19, 7.7811322411337965e-20, 2.8625185805493936e-20, 1.0530617357553812e-20, 3.8739976286871871e-21,
|
||||
1.4251640827409351e-21, 5.2428856633634639e-22, 1.9287498479639178e-22, 7.0954741622847041e-23, 2.6102790696677048e-23, 9.602680054508676e-24,
|
||||
3.532628572200807e-24, 1.2995814250075031e-24, 4.7808928838854691e-25, 1.7587922024243116e-25, 6.4702349256454603e-26, 2.3802664086944006e-26,
|
||||
8.7565107626965203e-27, 3.2213402859925161e-27, 1.185064864233981e-27, 4.359610000063081e-28, 1.6038108905486378e-28
|
||||
|
||||
// lambert_w[k] for W0 branch. 0 2.7182 14.77 60.2566 ... 1.445e+29 3.990e+29.
|
||||
|
||||
g: 0, 2.7182818284590452, 14.7781121978613, 60.256610769563003, 218.39260013257696, 742.06579551288302, 2420.5727609564107, 7676.4321089992102,
|
||||
23847.663896333826, 72927.755348178456, 220264.65794806717, 658615.558867176, 1953057.4970280471, 5751374.0961159665, 16836459.978306875, 49035260.58708166,
|
||||
142177768.32812596, 410634196.81078007, 1181879444.4719492, 3391163718.300558, 9703303908.1958056, 27695130424.147509, 78868082614.895014, 224130479263.72476,
|
||||
635738931116.24334, 1800122483434.6468, 5088969845149.8079, 14365302496248.563, 40495197800161.305, 114008694617177.22, 320594237445733.86,
|
||||
900514339622670.18, 2526814725845782.2, 7083238132935230.1, 19837699245933466, 55510470830970076, 1.5520433569614703e+17, 4.3360826779369662e+17,
|
||||
1.2105254067703227e+18, 3.3771426165357561e+18, 9.4154106734807994e+18, 2.6233583234732253e+19, 7.3049547543861044e+19, 2.032970971338619e+20,
|
||||
5.6547040503180956e+20, 1.5720421975868293e+21, 4.3682149334771265e+21, 1.2132170565093317e+22, 3.3680332378068632e+22, 9.3459982052259885e+22,
|
||||
2.5923527642935362e+23, 7.1876803203773879e+23, 1.99212416037262e+24, 5.5192924995054165e+24, 1.5286067837683347e+25, 4.2321318958281094e+25,
|
||||
1.1713293177672778e+26, 3.2408603996214814e+26, 8.9641258264226028e+26, 2.4787141382364034e+27, 6.8520443388941057e+27, 1.8936217407781711e+28,
|
||||
5.2317811346197018e+28, 1.4450833904658542e+29, 3.9904954117194348e+29
|
||||
|
||||
|
||||
lambert_wm1 version of arrays from Fukushima
|
||||
e: 2.7182817459106445 7.3890557289123535 20.085535049438477 54.59814453125 148.41314697265625 403.42874145507813 1096.6329345703125 2980.957275390625 8103.08154296875 22026.458984375 59874.12109375 162754.734375 442413.21875 1202603.75 3269015.75 8886106 24154940 65659932 178482192 485164896 1318814848 3584910336 9744796672 26489102336 72004845568 195729457152 532047822848 1446255919104 3931331100672 10686465835008 29048824659968 78962889850880 214643389759488 583461240832000 1586012102852608 4311227773747200 11719131799748608 31855901283450880 86593318145753088 2.3538502982225101e+17 6.398428560008151e+17 1.7392731886358364e+18 4.7278345784949473e+18 1.2851586685678387e+19 3.493423319351296e+19 9.4961089747571704e+19 2.581309902546461e+20 7.0167278463083348e+20 1.9073443887231177e+21 5.1846992652160593e+21 1.4093473476000776e+22 3.831003235981371e+22 1.0413746376682761e+23 2.8307496154307266e+23 7.6947746628514896e+23 2.0916565667371597e+24 5.6857119515524837e+24 1.5455367020327599e+25 4.2012039964445827e+25 1.1420056438012293e+26 3.1042929865047826e+26 8.4383428037470738e+26 2.2937792813113457e+27 6.2351382164292627e+27
|
||||
|
||||
g: -0.36787945032119751 -0.27067059278488159 -0.14936122298240662 -0.073262564837932587 -0.033689741045236588 -0.014872515574097633 -0.0063831745646893978 -0.0026837014593183994 -0.0011106884339824319 -0.00045399941154755652 -0.00018371877376921475 -7.3730567237362266e-05 -2.9384291337919421e-05 -1.1641405762929935e-05 -4.5885362851549871e-06 -1.8005634956352878e-06 -7.0378973759943619e-07 -2.7413975089984888e-07 -1.0645318582191976e-07 -4.122309249510181e-08 -1.5923385277005764e-08 -6.1368328196920174e-09 -2.3602335641470518e-09 -9.0603280433754207e-10 -3.471987974901225e-10 -1.3283640853956058e-10 -5.0747316071575455e-11 -1.9360334516105304e-11 -7.3766357605586919e-12 -2.8072891233854591e-12 -1.0671687058344537e-12 -4.0525363013271809e-13 -1.5374336461045079e-13 -5.8272932648966574e-14 -2.206792725173521e-14 -8.3502896573240185e-15 -3.1572303958374423e-15 -1.192871523299666e-15 -4.5038112940094517e-16 -1.699343306816689e-16 -6.4078234365689933e-17 -2.4148019279880996e-17 -9.095073346605316e-18 -3.4237017961279004e-18 -1.2881348671140216e-18 -4.8440896082993503e-19 -1.8207810463107454e-19 -6.8407959442757565e-20 -2.569017156788846e-20 -9.6437611040447661e-21 -3.6186962678628536e-21 -1.357346940624028e-21 -5.0894276378983633e-22 -1.9076220526102576e-22 -7.1477077345829229e-23 -2.6773039821769189e-23 -1.0025130740057213e-23 -3.7527418826161672e-24 -1.4043593713279384e-24 -5.2539147015754201e-25 -1.9650207139502987e-25 -7.3474141096711539e-26 -2.7465588329293218e-26 -1.0264406957471058e-26
|
||||
|
||||
|
||||
a: 1.6487212181091309 1.2840254306793213 1.1331484317779541 1.0644944906234741 1.0317434072494507 1.0157476663589478 1.007843017578125 1.0039138793945313 1.0019550323486328 1.0009770393371582 1.0004884004592896 1.000244140625
|
||||
|
||||
// These are common to both W0 and W-1
|
||||
b: 0.5 0.25 0.125 0.0625 0.03125 0.015625 0.0078125 0.00390625 0.001953125 0.0009765625 0.00048828125 0.000244140625
|
||||
|
||||
*/
|
||||
|
||||
// Creates if no file exists, & uses default overwrite/ ios::replace.
|
||||
//const char filename[] = // "lambert_w_lookup_table.ipp"; // Write to same folder as generator:
|
||||
//"I:/modular-boost/libs/math/include/boost/math/special_functions/lambert_w_lookup_table.ipp";
|
||||
const char filename[] = "lambert_w_lookup_table.ipp";
|
||||
|
||||
std::ofstream fout(filename, std::ios::out); // File output stream.
|
||||
|
||||
// 128-bit precision type (so that full precision if long double type uses 128-bit).
|
||||
// typedef cpp_bin_float_quad table_lookup_t; // Output using max_digits10 for 37 decimal digit precision.
|
||||
// (This is the precision for the tables output as a C++ program,
|
||||
// not the precision used by the lambert_w.hpp, that defines another typedef lookup_t, default double.
|
||||
|
||||
typedef cpp_bin_float_50 table_lookup_t; // Compute tables to 50 decimla digit precision to avoid slight inaccuracy from repeated multiply.
|
||||
|
||||
// But Output using max_digits10 for 37 decimal digit precision.
|
||||
|
||||
int main()
|
||||
{
|
||||
std::cout << "Lambert W table lookup values." << std::endl;
|
||||
if (!fout.is_open())
|
||||
{ // File failed to open OK.
|
||||
std::cerr << "Open file " << filename << " failed!" << std::endl;
|
||||
std::cerr << "errno " << errno << std::endl;
|
||||
return -1;
|
||||
}
|
||||
try
|
||||
{
|
||||
std::cout << "Lambert W test values writing to file " << filename << std::endl;
|
||||
int output_precision = std::numeric_limits<cpp_bin_float_quad>::max_digits10; // 37 decimal digits.
|
||||
fout.precision(output_precision);
|
||||
fout <<
|
||||
"// Copyright Paul A. Bristow 2017." "\n"
|
||||
"// Distributed under the Boost Software License, Version 1.0." "\n"
|
||||
"// (See accompanying file LICENSE_1_0.txt" "\n"
|
||||
"// or copy at http://www.boost.org/LICENSE_1_0.txt)" "\n"
|
||||
"\n"
|
||||
"// " << filename << "\n\n"
|
||||
"// A collection of 128-bit precision integral z argument Lambert W values computed using "
|
||||
<< output_precision << " decimal digits precision.\n"
|
||||
"// C++ floating-point precision is 128-bit long double.\n"
|
||||
"// Output as "
|
||||
<< std::numeric_limits<table_lookup_t>::max_digits10
|
||||
<< " decimal digits, suffixed L.\n"
|
||||
"\n"
|
||||
"// C++ floating-point type is provided by lambert_w.hpp typedef." "\n"
|
||||
"// For example: typedef lookup_t double; (or float or long double)" "\n"
|
||||
|
||||
"\n"
|
||||
"// Written by " << __FILE__ << " " << __TIMESTAMP__ << "\n"
|
||||
<< std::endl;
|
||||
|
||||
fout << "// Sizes of arrays of z values for Lambert W[0], W[1] ... W[64]"
|
||||
"\"n""and W[-1], W[-2] ... W[-64]." << std::endl;
|
||||
|
||||
fout << "\nnamespace boost {\nnamespace math {\nnamespace lambert_w_detail {\nnamespace lambert_w_lookup\n{ \n";
|
||||
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_sqrts = 12;
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_halves = 12;
|
||||
fout << "BOOST_STATIC_CONSTEXPR std::size_t noof_sqrts = " << noof_sqrts << ";" << std::endl;
|
||||
fout << "BOOST_STATIC_CONSTEXPR std::size_t noof_halves = " << noof_halves << ";" << std::endl; // Common to both branches.
|
||||
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_w0zs = 65; // F[k] 0 <= k <= 64. f[0] = F[0], f[64] = F[64]
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_w0es = 66; // noof_w0zs +1 for gratuitous extra power.
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_wm1zs = 64; // G[k] 1 <= k <= 64. (W-1 = 0 would be z = -infinity, so not stored in array) g[0] == G[1], g[63] = G[64]
|
||||
BOOST_STATIC_CONSTEXPR std::size_t noof_wm1es = 64; //
|
||||
|
||||
fout << "BOOST_STATIC_CONSTEXPR std::size_t noof_w0es = " << noof_w0zs << ";" << std::endl;
|
||||
fout << "BOOST_STATIC_CONSTEXPR std::size_t noof_w0zs = " << noof_w0zs << ";" << std::endl;
|
||||
fout << "BOOST_STATIC_CONSTEXPR std::size_t noof_wm1es = " << noof_wm1zs << ";" << std::endl;
|
||||
fout << "BOOST_STATIC_CONSTEXPR std::size_t noof_wm1zs = " << noof_wm1zs << ";" << std::endl;
|
||||
|
||||
// Defining actual lookup table sqrts of e^k, e^-k = 1/e, etc.
|
||||
table_lookup_t halves[noof_halves]; // 0.5 0.25 0.125, 0.0625 ... 0.0002441, halves of previous elements.
|
||||
table_lookup_t sqrtw0s[noof_sqrts]; // 0.6065 0.7788, 0.8824 ... 0.9997, sqrt of previous elements.
|
||||
table_lookup_t sqrtwm1s[noof_sqrts]; // 1.6487, 1.2840 1.1331 ... 1.00024 , sqrt of previous elements.
|
||||
table_lookup_t w0es[noof_w0es]; // lambert_w[k] for W0 branch. 2.7182, 1, 0.3678, 0.1353, ... 1.6038e-28
|
||||
table_lookup_t w0zs[noof_w0zs]; // lambert_w[k] for W0 branch. 0. , 2.7182, 14.77, 60.2566 ... 1.445e+29, 3.990e+29.
|
||||
table_lookup_t wm1es[noof_wm1es]; // lambert_w[k] for W-1 branch. 2.7182 7.38905 20.085 ... 6.235e+27
|
||||
table_lookup_t wm1zs[noof_wm1zs]; // lambert_w[k] for W-1 branch. -0.3678 ... -1.0264e-26
|
||||
|
||||
// e values lambert_w[k] for W-1 branch. 2.7182 1. 0.3678 0.1353 0.04978 ... 4.359e-28 1.603e-28
|
||||
|
||||
using boost::math::constants::e;
|
||||
using boost::math::constants::exp_minus_one;
|
||||
|
||||
{ // z values for integral W F[k] and powers for W0 branch.
|
||||
table_lookup_t ej = 1; //
|
||||
w0es[0] = e<table_lookup_t>(); // e = 2.7182 exp(-1) - 1/e exp_minus_one = 0.36787944.
|
||||
w0es[1] = 1; // e^0
|
||||
w0zs[0] = 0; // F[0] = 0 or W0 branch.
|
||||
for (int j = 1, jj = 2; jj != noof_w0es; ++jj)
|
||||
{
|
||||
w0es[jj] = w0es[j] * exp_minus_one<table_lookup_t>(); // previous * 0.36787944.
|
||||
ej *= e<table_lookup_t>(); // * 2.7182
|
||||
w0zs[j] = j * ej; // For W0 branch.
|
||||
j = jj; // Previous.
|
||||
} // for
|
||||
}
|
||||
// Checks on accuracy of W0 exponents.
|
||||
|
||||
// Checks on e power w0es
|
||||
|
||||
// w0es[64] = 4.3596100000630809736231248158884615452e-28
|
||||
// N[e ^ -63, 37] = 4.359610000063080973623124815888459643×10^-28
|
||||
// So slight loss at last decimal place.
|
||||
|
||||
// Checks on accuracy of z for integral W0 w0zs
|
||||
// w0zs[0] = 0, z = -infinity expected? but = zero
|
||||
// w0zs[1] = 2.7182818284590452353602874713526623144
|
||||
// w0[2] z = 14.778112197861300454460854921150012956
|
||||
// w0zs[64] = 3.9904954117194348050619127737142022705e+29
|
||||
// N[productlog(0, 3.9904954117194348050619127737142022705 10^+29), 37]
|
||||
// = 63.99999999999999999999999999999999547
|
||||
// = 64.0 to 34 decimal digits, so exact. :-)
|
||||
|
||||
{ // z values for integral powers G[k] and e^-k for W-1 branch.
|
||||
// Fukushima indexing of G (k-1) differs by 1 from(k).
|
||||
// G[0] = -infinity, so his first item in array g[0] is -0.3678 which is G[1]
|
||||
// and last is g[63] = G[64] = 1.026e-26
|
||||
table_lookup_t e1 = 1. / e<table_lookup_t>(); // 1/e = 0.36787944117144233
|
||||
table_lookup_t ej = e1;
|
||||
wm1es[0] = e<table_lookup_t>(); // e = 2.7182
|
||||
wm1zs[0] = -e1; // -1/e = - 0.3678
|
||||
for (int j = 0, jj = 1; jj != noof_wm1zs; ++jj)
|
||||
{
|
||||
ej *= e1; // * 0.3678..
|
||||
wm1es[jj] = wm1es[j] * e<table_lookup_t>();
|
||||
wm1zs[jj] = -(jj + 1) * ej;
|
||||
j = jj; // Previous.
|
||||
} // for
|
||||
}
|
||||
|
||||
// Checks on W-1 branch accuracy wm1es by comparing with Wolfram.
|
||||
// exp powers:
|
||||
// N[e ^ 1, 37] 2.718281828459045235360287471352662498
|
||||
// wm1es[0] = 2.7182818284590452353602874713526623144 - close enough.
|
||||
// N[e ^ 3, 37] 20.08553692318766774092852965458171790
|
||||
// computed wm1es[2] 2.0085536923187667740928529654581712847e+01L OK
|
||||
// e ^ 66 = 4.6071866343312915426773184428060086893349003037096040 × 10^28
|
||||
// N[e ^ 66, 34] = 4.607186634331291542677318442806009 10^28
|
||||
// computed 4.6071866343312915426773184428059867859e+28L
|
||||
// N[e ^ 66, 37] = 4.607186634331291542677318442806008689×10^28
|
||||
// so suffering some loss of precision by repeated multiplication computation.
|
||||
// :-(
|
||||
|
||||
// Repeat with cpp_bin_float_50 and correct to 37th decimal digit.
|
||||
// 4.60718663433129154267731844280600868933490030370929982
|
||||
// output std::cout.precision(std::numeric_limits<cpp_bin_float_quad>::max_digits10) as 37 decimal digits.
|
||||
// 4.6071866343312915426773184428060086893e+28L
|
||||
// N[e ^ 66, 37] = 4.607186634331291542677318442806008689×10^28
|
||||
// Agrees exactly for 37th place, so should be read in to nearest representable value.
|
||||
|
||||
|
||||
// Checks W-1 branch z values wm1zs
|
||||
// W-1[0] = -2.7067056647322538378799898994496883858e-01
|
||||
// w-1[1] = -1.4936120510359182893802724695018536337e-01
|
||||
|
||||
// wm1zs[65] -1.4325445274604020119111357113179868158e-27
|
||||
|
||||
// N[productlog(-1, -1.4325445274604020119111357113179868158* 10^-27), 37]
|
||||
// = -65.99999999999999999999999999999999955
|
||||
// = -66 accurately, so this is OK.
|
||||
// z = 66 * e^66 =
|
||||
// =N[-66*e ^ -66, 37]
|
||||
// -1.432544527460402011911135711317986177×10^-27
|
||||
// wm1zs[65] -1.4325445274604020119111357113179868158e-27
|
||||
// which agrees well enough to 34 decimal digits.
|
||||
// last wm1zs[65] = 0 is unused.
|
||||
|
||||
// Halves, common to both W0 and W-1.
|
||||
halves[0] = static_cast<table_lookup_t>(0.5); // Exactly representable.
|
||||
for (int j = 0; j != noof_sqrts -1; ++j)
|
||||
{
|
||||
halves[j+1] = halves[j] / 2; // Half previous element (/2 will be optimised better?).
|
||||
} // for j
|
||||
|
||||
// W0 sqrts
|
||||
sqrtw0s[0] = static_cast<table_lookup_t>(0.606530659712633423603799534991180453441918135487186955682L);
|
||||
for (int j = 0; j != noof_sqrts -1; ++j)
|
||||
{
|
||||
sqrtw0s[j+1] = sqrt(sqrtw0s[j]); // Sqrt of previous element. sqrt(1/e), sqrt(sqrt(1/e)) ...
|
||||
} // for j
|
||||
|
||||
// W-1 sqrts
|
||||
sqrtwm1s[0] = root_e<table_lookup_t>();
|
||||
for (int j = 0; j != noof_sqrts -1; ++j)
|
||||
{
|
||||
sqrtwm1s[j+1] = sqrt(sqrtwm1s[j]); // Sqrt of previous element. sqrt(1/e), sqrt(sqrt(1/e)) ...
|
||||
} // for j
|
||||
|
||||
// Output values as C++ arrays,
|
||||
// using BOOST_STATIC_CONSTEXPR as static and constexpr as possible for platform.
|
||||
fout << std::noshowpoint; // Do show NOT trailing zeros for halves and sqrts values.
|
||||
|
||||
fout <<
|
||||
"\n" "BOOST_STATIC_CONSTEXPR lookup_t halves[noof_halves] = " //
|
||||
"\n" "{ // Common to Lambert W0 and W-1 (and exactly representable)." << "\n ";
|
||||
for (int i = 0; i != noof_halves; i++)
|
||||
{
|
||||
fout << halves[i] << 'L';
|
||||
if (i != noof_halves - 1)
|
||||
{ // Omit trailing comma on last element.
|
||||
fout << ", ";
|
||||
}
|
||||
else
|
||||
{
|
||||
fout << std::endl;
|
||||
}
|
||||
}
|
||||
fout << "}; // halves, 0.5, 0.25, ... 0.000244140625, common to W0 and W-1." << std::endl;
|
||||
|
||||
fout <<
|
||||
"\n" "BOOST_STATIC_CONSTEXPR lookup_t sqrtw0s[noof_sqrts] = " //
|
||||
"\n" "{ // For Lambert W0 only." << "\n ";
|
||||
for (int i = 0; i != noof_sqrts; i++)
|
||||
{
|
||||
fout << sqrtw0s[i] << 'L';
|
||||
if (i != noof_sqrts - 1)
|
||||
{ // Omit trailing comma on last element.
|
||||
fout << ", ";
|
||||
}
|
||||
else
|
||||
{
|
||||
fout << std::endl;
|
||||
}
|
||||
}
|
||||
fout << "}; // sqrtw0s" << std::endl;
|
||||
|
||||
fout <<
|
||||
"\n" "BOOST_STATIC_CONSTEXPR lookup_t sqrtwm1s[noof_sqrts] = " //
|
||||
"\n" "{ // For Lambert W-1 only." << "\n ";
|
||||
for (int i = 0; i != noof_sqrts; i++)
|
||||
{
|
||||
fout << sqrtwm1s[i] << 'L';
|
||||
if (i != noof_sqrts - 1)
|
||||
{ // Omit trailing comma on last element.
|
||||
fout << ", ";
|
||||
}
|
||||
else
|
||||
{
|
||||
fout << std::endl;
|
||||
}
|
||||
}
|
||||
fout << "}; // sqrtwm1s" << std::endl;
|
||||
|
||||
fout << std::scientific // May be needed to avoid very large dddddddddddddddd.ddddddddddddddd output?
|
||||
<< std::showpoint; // Do show trailing zeros for sqrts and halves.
|
||||
|
||||
// Two W0 arrays
|
||||
|
||||
fout << // W0 e values.
|
||||
// Fukushima code generates an extra unused power, but it is not output by using noof_w0zs instead of noof_w0es.
|
||||
"\n" "BOOST_STATIC_CONSTEXPR lookup_t w0es[noof_w0zs] = " //
|
||||
"\n" "{ // Fukushima e powers array e[0] = 2.718, 1., e[2] = e^-1 = 0.135, e[3] = e^-2 = 0.133 ... e[64] = 4.3596100000630809736231248158884615452e-28." << "\n ";
|
||||
for (int i = 0; i != noof_w0zs; i++)
|
||||
{
|
||||
fout << w0es[i] << 'L';
|
||||
if (i != noof_w0es - 1)
|
||||
{ // Omit trailing comma on last element.
|
||||
fout << ", ";
|
||||
}
|
||||
if (i % 4 == 0)
|
||||
{
|
||||
fout << "\n ";
|
||||
}
|
||||
}
|
||||
fout << "\n}; // w0es" << std::endl;
|
||||
|
||||
fout << // W0 z values for W[1], .
|
||||
"\n" "BOOST_STATIC_CONSTEXPR lookup_t w0zs[noof_w0zs] = " //
|
||||
"\n" "{ // z values for W[0], W[1], W[2] ... W[64] (Fukushima array Fk). " << "\n ";
|
||||
for (int i = 0; i != noof_w0zs; i++)
|
||||
{
|
||||
fout << w0zs[i] << 'L';
|
||||
if (i != noof_w0zs - 1)
|
||||
{ // Omit trailing comma on last element.
|
||||
fout << ", ";
|
||||
}
|
||||
if (i % 4 == 0)
|
||||
{
|
||||
fout << "\n ";
|
||||
}
|
||||
}
|
||||
fout << "\n}; // w0zs" << std::endl;
|
||||
|
||||
// Two arrays for w-1
|
||||
|
||||
fout << // W-1 e values.
|
||||
"\n" "BOOST_STATIC_CONSTEXPR lookup_t wm1es[noof_wm1es] = " //
|
||||
"\n" "{ // Fukushima e array e[0] = e^1 = 2.718, e[1] = e^2 = 7.39 ... e[64] = 4.60718e+28." << "\n ";
|
||||
for (int i = 0; i != noof_wm1es; i++)
|
||||
{
|
||||
fout << wm1es[i] << 'L';
|
||||
if (i != noof_wm1es - 1)
|
||||
{ // Omit trailing comma on last element.
|
||||
fout << ", ";
|
||||
}
|
||||
if (i % 4 == 0)
|
||||
{
|
||||
fout << "\n ";
|
||||
}
|
||||
}
|
||||
fout << "\n}; // wm1es" << std::endl;
|
||||
|
||||
fout << // Wm1 z values for integral K.
|
||||
"\n" "BOOST_STATIC_CONSTEXPR lookup_t wm1zs[noof_wm1zs] = " //
|
||||
"\n" "{ // Fukushima G array of z values for integral K, (Fukushima Gk) g[0] (k = -1) = 1 ... g[64] = -1.0264389699511303e-26." << "\n ";
|
||||
for (int i = 0; i != noof_wm1zs; i++)
|
||||
{
|
||||
fout << wm1zs[i] << 'L';
|
||||
if (i != noof_wm1zs - 1)
|
||||
{ // Omit trailing comma on last element.
|
||||
fout << ", ";
|
||||
}
|
||||
if (i % 4 == 0)
|
||||
{ // 4 values per line.
|
||||
fout << "\n ";
|
||||
}
|
||||
}
|
||||
fout << "\n}; // wm1zs" << std::endl;
|
||||
|
||||
fout << "} // namespace lambert_w_lookup\n} // namespace lambert_w_detail\n} // namespace math\n} // namespace boost" << std::endl;
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
std::cout << "Exception " << ex.what() << std::endl;
|
||||
}
|
||||
fout.close();
|
||||
return 0;
|
||||
|
||||
} // int main()
|
||||
|
||||
/*
|
||||
|
||||
Original arrays as output by Veberic/Fukushima code:
|
||||
|
||||
w0 branch
|
||||
|
||||
W-1 branch
|
||||
|
||||
e: 2.7182818284590451 7.3890560989306495 20.085536923187664 54.598150033144229 148.41315910257657 403.42879349273500 1096.6331584284583 2980.9579870417274 8103.0839275753815 22026.465794806707 59874.141715197788 162754.79141900383 442413.39200892020 1202604.2841647759 3269017.3724721079 8886110.5205078647 24154952.753575277 65659969.137330450 178482300.96318710 485165195.40978980 1318815734.4832134 3584912846.1315880 9744803446.2488918 26489122129.843441 72004899337.385788 195729609428.83853 532048240601.79797 1446257064291.4734 3931334297144.0371 10686474581524.447 29048849665247.383 78962960182680.578 214643579785915.75 583461742527454.00 1586013452313428.3 4311231547115188.5 11719142372802592. 31855931757113704. 86593400423993600. 2.3538526683701958e+17 6.3984349353005389e+17 1.7392749415204982e+18 4.7278394682293381e+18 1.2851600114359284e+19 3.4934271057485025e+19 9.4961194206024286e+19 2.5813128861900616e+20 7.0167359120976157e+20 1.9073465724950953e+21 5.1847055285870605e+21 1.4093490824269355e+22 3.8310080007165677e+22 1.0413759433029062e+23 2.8307533032746866e+23 7.6947852651419974e+23 2.0916594960129907e+24 5.6857199993359170e+24 1.5455389355900996e+25 4.2012104037905024e+25 1.1420073898156810e+26 3.1042979357019109e+26 8.4383566687414291e+26 2.2937831594696028e+27 6.2351490808115970e+27
|
||||
|
||||
g: -0.36787944117144233 -0.27067056647322540 -0.14936120510359185 -0.073262555554936742 -0.033689734995427351 -0.014872513059998156 -0.0063831737588816162 -0.0026837010232200957 -0.0011106882367801162 -0.00045399929762484866 -0.00018371870869270232 -7.3730548239938541e-05 -2.9384282290753722e-05 -1.1641402067449956e-05 -4.5885348075273889e-06 -1.8005627955081467e-06 -7.0378941219347870e-07 -2.7413963540482742e-07 -1.0645313231320814e-07 -4.1223072448771179e-08 -1.5923376898615014e-08 -6.1368298043116385e-09 -2.3602323152914367e-09 -9.0603229062698418e-10 -3.4719859662410078e-10 -1.3283631472964657e-10 -5.0747278046555293e-11 -1.9360320299432585e-11 -7.3766303773930841e-12 -2.8072868906520550e-12 -1.0671679036256938e-12 -4.0525329757101402e-13 -1.5374324278841227e-13 -5.8272886672428505e-14 -2.2067908660514491e-14 -8.3502821888768594e-15 -3.1572276215253082e-15 -1.1928704609782527e-15 -4.5038074274761624e-16 -1.6993417021166378e-16 -6.4078169762734621e-17 -2.4147993510032983e-17 -9.0950634616416589e-18 -3.4236981860988753e-18 -1.2881333612472291e-18 -4.8440839844747606e-19 -1.8207788854829806e-19 -6.8407875971564987e-20 -2.5690139750481013e-20 -9.6437492398196038e-21 -3.6186918227652047e-21 -1.3573451162272088e-21 -5.0894204288896066e-22 -1.9076194289884390e-22 -7.1476978375412793e-23 -2.6773000149758669e-23 -1.0025115553818592e-23 -3.7527362568743735e-24 -1.4043571811296988e-24 -5.2539064576179218e-25 -1.9650175744554385e-25 -7.3474021582506962e-26 -2.7465543000397468e-26 -1.0264389699511303e-26
|
||||
|
||||
a: 1.6487212707001282 1.2840254166877414 1.1331484530668263 1.0644944589178595 1.0317434074991028 1.0157477085866857 1.0078430972064480 1.0039138893383477 1.0019550335910028 1.0009770394924165 1.0004884004786945 1.0002441704297478
|
||||
|
||||
b: 0.50000000000000000 0.25000000000000000 0.12500000000000000 0.062500000000000000 0.031250000000000000 0.015625000000000000 0.0078125000000000000 0.0039062500000000000 0.0019531250000000000 0.00097656250000000000 0.00048828125000000000 0.00024414062500000000
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
237
tools/lambert_w_low_reference_values.cpp
Normal file
@@ -0,0 +1,237 @@
|
||||
// lambert_w_test_values.cpp
|
||||
|
||||
// Copyright Paul A. Bristow 2017.
|
||||
// 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)
|
||||
|
||||
// Write a C++ file J:\Cpp\Misc\lambert_w_1000_test_values\lambert_w_mp_values.ipp
|
||||
// containing arrays of z arguments and 100 decimal digit precision lambert_w0(z) reference values.
|
||||
// These can be used in tests of precision of less-precise types like
|
||||
// built-in float, double, long double and quad and cpp_dec_float_50.
|
||||
|
||||
// Multiprecision types:
|
||||
//#include <boost/multiprecision/cpp_bin_float.hpp>
|
||||
#include <boost/multiprecision/cpp_dec_float.hpp> // boost::multiprecision::cpp_dec_float_100
|
||||
using boost::multiprecision::cpp_dec_float_100;
|
||||
|
||||
#include <boost/math/special_functions/lambert_w.hpp> //
|
||||
using boost::math::lambert_w0;
|
||||
|
||||
#include <iostream>
|
||||
// using std::cout; using std::std::endl; using std::ios; using std::std::cerr;
|
||||
#include <iomanip>
|
||||
using std::setprecision;
|
||||
using std::showpoint;
|
||||
#include <fstream>
|
||||
using std::ofstream;
|
||||
#include <cassert>
|
||||
#include <cfloat> // for DBL_EPS etc
|
||||
#include <limits> // for numeric limits.
|
||||
//#include <ctype>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
using std::transform;
|
||||
|
||||
const char* prefix = "static "; // "static const" or "static constexpr" or just "const "" or "" even?
|
||||
// But problems with VS2017 and GCC not accepting same format mean only static at present.
|
||||
|
||||
const long double eps = std::numeric_limits<long double>::epsilon();
|
||||
|
||||
/*
|
||||
|
||||
// Sample test values from Wolfram.
|
||||
template <typename RealType>
|
||||
static RealType zs[noof_tests];
|
||||
|
||||
template <typename RealType>
|
||||
void init_zs()
|
||||
{
|
||||
zs<RealType>[0] = BOOST_MATH_TEST_VALUE(RealType, -0.35);
|
||||
zs<RealType>[1] = BOOST_MATH_TEST_VALUE(RealType, -0.3);
|
||||
zs<RealType>[2] = BOOST_MATH_TEST_VALUE(RealType, -0.01);
|
||||
zs<RealType>[3] = BOOST_MATH_TEST_VALUE(RealType, +0.01);
|
||||
zs<RealType>[4] = BOOST_MATH_TEST_VALUE(RealType, 0.1);
|
||||
zs<RealType>[5] = BOOST_MATH_TEST_VALUE(RealType, 0.5);
|
||||
zs<RealType>[6] = BOOST_MATH_TEST_VALUE(RealType, 1.);
|
||||
zs<RealType>[7] = BOOST_MATH_TEST_VALUE(RealType, 2.);
|
||||
zs<RealType>[8] = BOOST_MATH_TEST_VALUE(RealType, 5.);
|
||||
zs<RealType>[9] = BOOST_MATH_TEST_VALUE(RealType, 10.);
|
||||
zs<RealType>[10] = BOOST_MATH_TEST_VALUE(RealType, 100.);
|
||||
zs<RealType>[11] = BOOST_MATH_TEST_VALUE(RealType, 1e+6);
|
||||
};
|
||||
|
||||
// 'Known good' Lambert w values using N[productlog(-0.3), 50]
|
||||
// evaluated to full precision of RealType (up to 50 decimal digits).
|
||||
template <typename RealType>
|
||||
static RealType ws[noof_tests];
|
||||
|
||||
template <typename RealType>
|
||||
void init_ws()
|
||||
{
|
||||
ws<RealType>[0] = BOOST_MATH_TEST_VALUE(RealType, -0.7166388164560738505881698000038650406110575701385055261614344530078353170171071547711151137001759321);
|
||||
ws<RealType>[1] = BOOST_MATH_TEST_VALUE(RealType, -0.4894022271802149690362312519962933689234100060163590345114659679736814083816206187318524147462752111);
|
||||
ws<RealType>[2] = BOOST_MATH_TEST_VALUE(RealType, -0.01010152719853875327292018767138623973670903993475235877290726369225412969738704722202330440072213641);
|
||||
ws<RealType>[3] = BOOST_MATH_TEST_VALUE(RealType, 0.009901473843595011885336326816570107953627746494917415482611387085655068978243229360100010886171970918);
|
||||
ws<RealType>[4] = BOOST_MATH_TEST_VALUE(RealType, 0.09127652716086226429989572142317956865311922405147203264830839460717224625441755165020664592995606710);
|
||||
ws<RealType>[5] = BOOST_MATH_TEST_VALUE(RealType, 0.3517337112491958260249093009299510651714642155171118040466438461099606107203387108968323038321915693);
|
||||
ws<RealType>[6] = BOOST_MATH_TEST_VALUE(RealType, 0.5671432904097838729999686622103555497538157871865125081351310792230457930866845666932194469617522946); // Output from https://www.wolframalpha.com/input/?i=lambert_w0(1)
|
||||
ws<RealType>[7] = BOOST_MATH_TEST_VALUE(RealType, 0.8526055020137254913464724146953174668984533001514035087721073946525150656742630448965773783502494847);
|
||||
ws<RealType>[8] = BOOST_MATH_TEST_VALUE(RealType, 1.326724665242200223635099297758079660128793554638047479789290393025342679920536226774469916608426789); // https://www.wolframalpha.com/input/?i=N%5Bproductlog(5),+100%5D
|
||||
ws<RealType>[9] = BOOST_MATH_TEST_VALUE(RealType, 1.745528002740699383074301264875389911535288129080941331322206048555557259941551704989523510778883075);
|
||||
ws<RealType>[10] = BOOST_MATH_TEST_VALUE(RealType, 3.385630140290050184888244364529726867491694170157806680386174654885206544913039277686735236213650781);
|
||||
ws<RealType>[11] = BOOST_MATH_TEST_VALUE(RealType, 11.38335808614005262200015678158500428903377470601886512143238610626898610768018867797709315493717650);
|
||||
////W(1e35) = 76.256377207295812974093508663841808129811690961764 too big for float.
|
||||
};
|
||||
|
||||
*/
|
||||
|
||||
// Global so accessible from output_value.
|
||||
// Creates if no file exists, & uses default overwrite/ ios::replace.
|
||||
const char filename[] = "lambert_w_low_reference values.ipp"; //
|
||||
std::ofstream fout(filename, std::ios::out); ; //
|
||||
|
||||
// 100 decimal digits for the value fed to macro BOOST_MATH_TEST_VALUE
|
||||
typedef cpp_dec_float_100 RealType;
|
||||
|
||||
void output_value(size_t index, RealType value)
|
||||
{
|
||||
fout
|
||||
<< " zs<RealType>[" << index << "] = BOOST_MATH_TEST_VALUE(RealType, "
|
||||
<< value
|
||||
<< ");"
|
||||
<< std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
void output_lambert_w0(size_t index, RealType value)
|
||||
{
|
||||
fout
|
||||
<< " ws<RealType>[" << index << "] = BOOST_MATH_TEST_VALUE(RealType, "
|
||||
<< lambert_w0(value)
|
||||
<< ");"
|
||||
<< std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
int main()
|
||||
{ // Make C++ file containing Lambert W test values.
|
||||
std::cout << filename << " ";
|
||||
#ifdef __TIMESTAMP__
|
||||
std::cout << __TIMESTAMP__;
|
||||
#endif
|
||||
std::cout << std::endl;
|
||||
std::cout << "Lambert W0 decimal digit precision values." << std::endl;
|
||||
|
||||
// Note __FILE__ & __TIMESTAMP__ are ANSI standard C & thus Std C++?
|
||||
|
||||
if (!fout.is_open())
|
||||
{ // File failed to open OK.
|
||||
std::cerr << "Open file " << filename << " failed!" << std::endl;
|
||||
std::cerr << "errno " << errno << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int output_precision = std::numeric_limits<cpp_dec_float_100>::digits10;
|
||||
// cpp_dec_float_100 is ample precision and
|
||||
// has several extra bits internally so max_digits10 are not needed.
|
||||
fout.precision(output_precision);
|
||||
|
||||
int no_of_tests = 100;
|
||||
|
||||
// Intro for RealType values.
|
||||
std::cout << "Lambert W test values written to file " << filename << std::endl;
|
||||
fout <<
|
||||
"\n"
|
||||
"// A collection of Lambert W test values computed using "
|
||||
<< output_precision << " decimal digits precision.\n"
|
||||
"// C++ floating-point type is " << "RealType." "\n"
|
||||
"\n"
|
||||
"// Written by " << __FILE__ << " " << __TIMESTAMP__ << "\n"
|
||||
|
||||
"\n"
|
||||
"// Copyright Paul A. Bristow 2017." "\n"
|
||||
"// Distributed under the Boost Software License, Version 1.0." "\n"
|
||||
"// (See accompanying file LICENSE_1_0.txt" "\n"
|
||||
"// or copy at http://www.boost.org/LICENSE_1_0.txt)" "\n"
|
||||
<< std::endl;
|
||||
|
||||
fout << "// Size of arrays of arguments z and Lambert W" << std::endl;
|
||||
fout << "static const unsigned int noof_tests = " << no_of_tests << ";" << std::endl;
|
||||
|
||||
// Declare arrays of z and Lambert W.
|
||||
|
||||
fout << "// Declare arrays of arguments z and Lambert W(z)" << std::endl;
|
||||
fout << "// The values are defined using the macro BOOST_MATH_TEST_VALUE to ensure\n"
|
||||
"// that both built-in and multiprecision types are correctly initialiased with full precision.\n"
|
||||
"// built-in types like double require a floating-point literal like 3.14,\n"
|
||||
"// but multiprecision types require a decimal digit string like \"3.14\".\n"
|
||||
<< std::endl;
|
||||
fout <<
|
||||
"\n"
|
||||
"template <typename RealType>""\n"
|
||||
"static RealType zs[" << no_of_tests << "];"
|
||||
<< std::endl;
|
||||
|
||||
fout <<
|
||||
"\n"
|
||||
"template <typename RealType>""\n"
|
||||
"static RealType ws[" << no_of_tests << "];"
|
||||
<< std::endl;
|
||||
|
||||
RealType max_z("10");
|
||||
RealType min_z("-0.35");
|
||||
RealType step_size("0.01");
|
||||
size_t step_count = no_of_tests;
|
||||
|
||||
// Output to initialize array of arguments z for Lambert W.
|
||||
fout <<
|
||||
"\n"
|
||||
<< "template <typename RealType>\n"
|
||||
"void init_zs()\n"
|
||||
"{\n";
|
||||
|
||||
RealType z = min_z;
|
||||
for (size_t i = 0; (i < no_of_tests); i++)
|
||||
{
|
||||
output_value(i, z);
|
||||
z += step_size;
|
||||
}
|
||||
fout << "};" << std::endl;
|
||||
|
||||
// Output array of Lambert W values.
|
||||
fout <<
|
||||
"\n"
|
||||
<< "template <typename RealType>\n"
|
||||
"void init_ws()\n"
|
||||
"{\n";
|
||||
|
||||
z = min_z;
|
||||
for (size_t i = 0; (i < step_count); i++)
|
||||
{
|
||||
output_lambert_w0(i, z);
|
||||
z += step_size;
|
||||
}
|
||||
fout << "};" << std::endl;
|
||||
|
||||
fout << "// End of lambert_w_mp_values.ipp " << std::endl;
|
||||
fout.close();
|
||||
|
||||
std::cout << "Lambert_w0 values written to files " << __TIMESTAMP__ << std::endl;
|
||||
return 0;
|
||||
} // main
|
||||
|
||||
|
||||
/*
|
||||
|
||||
start and finish checks again Wolfram Alpha:
|
||||
ws<RealType>[0] = BOOST_MATH_TEST_VALUE(RealType, -0.7166388164560738505881698000038650406110575701385055261614344530078353170171071547711151137001759321);
|
||||
Wolfram N[productlog(-0.35), 100] -0.7166388164560738505881698000038650406110575701385055261614344530078353170171071547711151137001759321
|
||||
|
||||
|
||||
ws<RealType>[19] = BOOST_MATH_TEST_VALUE(RealType, 0.7397278549447991214587608743391115983469848985053641692586810406118264600667862543570373167046626221);
|
||||
Wolfram N[productlog(1.55), 100] 0.7397278549447991214587608743391115983469848985053641692586810406118264600667862543570373167046626221
|
||||
|
||||
|
||||
*/
|
||||
|
||||