2
0
mirror of https://github.com/boostorg/math.git synced 2026-02-27 05:02:32 +00:00
Commit Graph

3839 Commits

Author SHA1 Message Date
jzmaddock
d7ab3a9873 tanh_sinh: trivial correction of if..else logic.
Without this we can take 2 of the branches when z < -0.5 and not make correct use of zc triggering the assertion later.
[CI SKIP]
2020-08-21 11:13:13 +01:00
jzmaddock
09c0d37178 Merge pull request #418 from boostorg/mp_erf
Update multiprecision erf to improve precision and performance.
2020-08-20 18:21:44 +01:00
jzmaddock
8633d74278 jacobi_theta.hpp: Fix a few concept errors. 2020-08-18 11:19:18 +01:00
Matt Pulver
d739449f61 Fix to logic error in c8117fc. 2020-08-16 15:08:52 -04:00
Matt Pulver
c8117fc4bb [#420] Protect unused branches with size_t overflow when compiled pre-C++17.
Replace 'if BOOST_AUTODIFF_IF_CONSTEXPR' with 'BOOST_IF_CONSTEXPR'.
2020-08-16 10:30:50 -04:00
Evan Miller
d7141cd353 Jacobi Theta functions (#394)
* Jacobi Theta functions

Implementations, tests, and ULP plotting programs are provided for the
four Jacobi Theta functions per #373. Twenty-four public C++ functions
are provided in all, covering various precision-preserving scenarios.

Documentation for collaborators is provided in the code comments. Proper
documentation for end users will be provided when the implementation and
APIs are finalized.

Some tests are failing; this implementation is meant to start a
conversation. The core dilemma faced by the author was that large values
of |q| resulted in slow convergence, and sometimes wildly inaccurate
results. Following the implementation note in DLMF 20.14, I added code
to switch over to the imaginary versions of the theta functions when |q|
> 0.85.  This restored accuracy such that all of the identity tests
passed for a loose-enough epsilon, but then lost precision to the point
that the Wolfram Alpha spot checks failed. It is the author's hope that
someone with floating-point experience can tame the exponential dragons
and squeeze the ULPs back down to a reasonable range when |q| is large.

When #392 is merged I will add more thorough value tests, although I
fully expect them to fail until the underlying precision issues are
resolved.

As a final note, the precision issues do not affect the z=0 case - the
ULP plots indicate these return values within 2 ULP across all valid
|q|. So that's a start.

* [CI SKIP] Jacobi theta: Add special-value tests and more

* Add tests covering z=0 special values from MathWorld

* Add missing real_concept header

* Replace M_PI and friends with constants::pi etc

* Use BOOST_MATH_STD_USING in more places

* Jacobi theta: Test two more of Watson's identities [CI SKIP]

See https://mathworld.wolfram.com/JacobiThetaFunctions.html

(Equations 48 and 49)

* Improve precision of Jacobi theta functions [CI SKIP]

Rewrite the private imaginary versions to use double-sided summations
following DLMF 20.13.4 and 20.13.5. This cuts down the worst of the
precision issues by a factor of 10, and gets more of the tests to pass.

I am confident enough in the code path to eliminate the compile-time
__JACOBI_THETA_USE_IMAGINARY flag. In fact the imaginary-z code paths
are now enabled for all |q| > 0.04, i.e. most legal values of q.

More extensive tests will be needed to illuminate any remaining
precision issues.

* Jacobi theta: Make changes suggested in #394 [CI SKIP]

* Add LICENSE notice to main file

* Document convergence criteria

* Eliminate eps*eps = 0 logic. This causes some disagreement with the
zero returned by Wolfram Alpha for z=0, q > 0.99 in the fourth function.
Mathematically, the fourth function is never exactly zero, so I don't
trust Wolfram here.

* Per code-review comments, remove multiplications by floating-point 2.

* Tweak the plotting programs to display their titles, and to uniformly
use `float` as their CoarseType and `long double` as their
`PreciseType`.

* Add quadrature tests to Jacobi theta functions [CI SKIP]

The quadrature tests revealed a problem in the m1 functions: they too
should switch to the _IMAGINARY logic for q > exp(-pi), or will suffer
from slow convergence. Fix them.

Also tighten tolerances for many tests from sqrt(eps) to 100 * eps.

* Test Jacobi thetas against elliptic functions and elliptic integrals [CI SKIP]

See:

* https://dlmf.nist.gov/22.2
* https://dlmf.nist.gov/20.9#i

* Test Jacobi Thetas against their Laplace transforms [CI SKIP]

See:

* https://dlmf.nist.gov/20.10#ii

I did find some disagreement, and dropped the negative sign from the
theta1 equation. DLMF's theta2 and theta3 Laplace transform equations do
not agree at all with the computed values - will need to investigate.

In the meantime, the two implemented equations agree to 4 EPS so I am
keeping them.

* Add a note on using log1p with Jacobi theta functions [CI SKIP]

See discussion:

* https://github.com/boostorg/math/pull/394#issuecomment-655871762

* Add random data tests to Jacobi Theta functions [CI SKIP]

Add a test data generator program for the Jacobi theta functions.
This program will produce data for the tau parameterization, so that
precision isn't lost during the log-transformation. This distinguishes
it from the Wolfram Alpha data, which is parameterized by q.

A few of these new random-data tests are failing, but not by obscene
margins (< 100 EPS). These failures will be addressed when the test
tolerances are finalized.

* Add small-tau tests and simplify Jacobi Theta code [CI SKIP]

Add tests for small tau (i.e. large q). The tests are failing with mean
~ 200 EPS and max ~ 800 EPS. These look like worst-case input, and
should be the focus of future accuracy improvements.

This commit also simplifies the _IMAGINARY code by abstracting all of
the loops into a single svelte function.

* Add user documentation for Jacobi Theta functions [CI SKIP]

* Add function graphs to Jacobi Theta docs [CI SKIP]

* Define Jacobi Theta test tolerances [CI SKIP]

* Add implementation note on Jacobi theta functions [CI SKIP]

* Consolidate Jacobi Theta ULPs plotting programs [CI SKIP]

* Fix q domain checking of jacobi_theta4 [CI SKIP]

* Add ULPs plots to Jacobi Theta docs [CI SKIP]

Also add the built HTML files for easy evaluation. A full rebuild is
needed for the new docs to appear in the indexes.

* Add missing Jacobi Theta ULPs plots [CI SKIP]

* Add LaTeX source for Jacobi Theta equations [CI SKIP]

* Remove unused Jacobi Theta PNG equations [CI SKIP]

* Add Jacobi Theta performance script [CI SKIP]

Provided by @NAThompson.

* Remove vestigial eps*eps check from jacobi_theta3 [CI SKIP]

* Update Jacobi Theta docs per code review comments [CI SKIP]

* Enable arg promotion for Jacobi Theta functions [CI SKIP]

Add Jacobi theta functions to the instantiation tests and fix up
everything needed to make them pass. This changes the function
signatures to use promote_args.

* Fix Jacobi Theta plotting script [CI SKIP]

This script broke when the promote_args API was added.

* Change Jacobi Theta convergence criterion [CI SKIP]

Compare the non-oscillating part of the delta to the previous one.
This avoids some headaches comparing the delta to the partial sum,
because the partial sum can be a small number due to the oscillating
component alternating signs.

Because successive terms involve either q^n^2 or exp(-(pi*n)^2),
convergence should still happen pretty quickly. Graphs have been updated
and tests still passs with no noticeable difference.
2020-08-15 18:51:47 -04:00
jzmaddock
9bcb6be085 Update multiprecision erf to improve precision and performance.
See https://github.com/boostorg/multiprecision/issues/264.
2020-08-13 18:12:51 +01:00
jzmaddock
6d1d46720f Improve ulps plot: (#417)
* Improve ulps plot:

- Use numeric_limits for precision comparison, plot out of bounds points at the clip boundary so we can still see that they're there.
-Add options for colored marks when clipping and NaN.
2020-08-11 11:44:32 -04:00
Nick
cbd2af2890 Cohen acceleration (#415)
* Cohen acceleration

Accelerates convergence of an alternating series by a method designed by Cohen, Villegas, and Zagier.
2020-08-09 09:55:56 -04:00
jzmaddock
eb5b3d0887 cstdfloat: Make complex<__float128> converting constructor explicit
and non-lossy construction from float/double/long double implicit.
Fixes https://github.com/boostorg/math/issues/350.
2020-07-31 18:59:52 +01:00
John Maddock
b1924c02e9 Merge branch 'issue372' into develop 2020-07-31 18:15:10 +01:00
John Maddock
43fab0c267 Merge branch 'issue383' into develop 2020-07-31 18:14:43 +01:00
John Maddock
01f495015c Merge branch 'no_long_double_fixes' into develop 2020-07-31 18:14:09 +01:00
jzmaddock
41795c1f4e Disable legendre_stieltjes.hpp in C++03 mode. 2020-07-28 18:12:43 +01:00
jzmaddock
328cc4957d Forward policy to tgamma call. 2020-07-28 17:08:58 +01:00
Nick
fa23c83bb1 Laplace limit. (#409) 2020-07-27 21:26:24 -04:00
jzmaddock
8d1922e73a Include additional headers in special_functions.hpp.
Fixes https://github.com/boostorg/math/issues/383
2020-07-27 19:37:40 +01:00
jzmaddock
84581cb180 Correct digits parameter in legendre_stieltjes.hpp call to newton_raphson_iterate. 2020-07-27 19:37:00 +01:00
jzmaddock
c4972b0214 Merge pull request #408 from boostorg/issue406
Fix bug in student's T quantile for denormalized degrees_of_freedom.
2020-07-27 19:34:54 +01:00
jzmaddock
5e8e8a479d Fix chebyshev call to forward policy. 2020-07-27 15:30:24 +01:00
jzmaddock
a316c72bb6 Correct lgamma workaround for very small arguments.
This allows simplification of the student's T quantile code.
Added some more lgamma tests.
2020-07-25 18:30:03 +01:00
jzmaddock
3e2d9f2979 Forward policies in chebyshev.hpp. 2020-07-25 14:52:56 +01:00
jzmaddock
2153dfa390 Forward policies to lgamma calls,
Make sure y is set when the result is short-circuited.
2020-07-25 14:41:59 +01:00
Nick
326faa4c28 Reciprocal Fibonacci constant and Dottie number. (#407) 2020-07-25 09:26:38 -04:00
jzmaddock
fa8f763df9 Fix bug in student's T quantile for denormalized degrees_of_freedom. 2020-07-24 20:11:48 +01:00
jzmaddock
040741ff86 Correct ibeta power term calculation.
This error is in some "defensive" code which we haven't been able to locate a test case for - it will probably never be triggered, and is only applicable to multiprecision types.
Fixes #372.
2020-07-24 08:27:58 +01:00
jzmaddock
dae850f3d6 No long double policies: Fix up expm1 and log1p usage. 2020-07-20 18:54:33 +01:00
Nick
8792935679 Engel expansions (#404) 2020-07-20 09:51:17 -04:00
jzmaddock
a9bfd214cb No Long Double Policies: Correct Owen's T. 2020-07-20 14:34:02 +01:00
jzmaddock
797b82df2f Correct Lambert_w policy forwarding. 2020-07-20 14:33:23 +01:00
jzmaddock
b5317e2c86 Zeta: make sure we forward policies. 2020-07-20 11:43:06 +01:00
jzmaddock
17e5cc2b5f hypergeometric_2F0: Makes ure we forward policies. 2020-07-20 11:42:09 +01:00
jzmaddock
95b48bac45 Expint: make sure we forward policies. 2020-07-20 11:41:24 +01:00
jzmaddock
4118fb0c3e Make sure we forward policies in polygamma.hpp 2020-07-20 11:40:46 +01:00
jzmaddock
6f3956cdc7 No Long double policies: Use policies in bessel iterators. 2020-07-20 11:40:02 +01:00
jzmaddock
9211d13480 No long double policy: Update bessel_jy_derivatives_asym.hpp to forward policies. 2020-07-20 11:36:25 +01:00
jzmaddock
c1356fff05 No long double policy: Update bessel_prime.hpp to forward policies. 2020-07-20 11:35:27 +01:00
jzmaddock
c4a5b34934 Update bessel iterators to be policy-aware. 2020-07-20 11:34:32 +01:00
jzmaddock
43ee5254db No long double policy: Fix up lambert_w. 2020-07-20 09:29:18 +01:00
jzmaddock
0404e838e2 No long double policy: Fix falling_factorial calls in factorials.hpp 2020-07-20 09:28:40 +01:00
jzmaddock
2de2aeb7de Disabled long double: fix atanh calls in ellint_3.hpp. 2020-07-20 09:27:54 +01:00
jzmaddock
b90b3cd51e Fix unused variable warning in binomial.hpp. 2020-07-20 09:24:47 +01:00
jzmaddock
c355a7fb16 Disabled long double: Fix Airy calls to cbrt. 2020-07-20 09:24:08 +01:00
jzmaddock
ef37b70953 Disabled long double: Add test case, fix forward header. 2020-07-20 09:23:29 +01:00
Nick
ee2cd5d5e5 Luroth expansions (#401) 2020-07-18 09:28:39 -04:00
jzmaddock
dfca1aaa36 Merge pull request #402 from evanmiller/remove-long-doubles
Remove more long doubles
2020-07-17 09:03:22 +01:00
Vassil Vassilev
e93852358b Add missing header
This patch allows the header to be built standalone, as part of clang C++ modules builds.
2020-07-17 02:00:00 +03:00
Evan Miller
5e5a408d93 Eliminate unnecessary long doubles from make_big_value
If a long double is the same as a double on a platform, prefer the
double variant when defining mathematical constants. This prevents
spurious long doubles from appearing in compiled code.
2020-07-15 10:03:56 -04:00
Evan Miller
e9b18c7369 Eliminate double-promotion from unchecked_factorial
Before this change, any function calling unchecked_factorial<double>
would generate long double code. This created a headache for users
attempting to eliminate long doubles from their compiled code.

A more elegant solution might use templates to create a single lookup
array for all major floating-point types, but the present solution
(adding an explicit double array) works just fine.

See #398.
2020-07-15 10:03:42 -04:00
jzmaddock
d4d0297626 Merge pull request #399 from evanmiller/remove-unwanted-promotions
Reduce unwanted double promotions
2020-07-13 20:03:39 +01:00