BUG: special/cdflib: fix fatal loss of precision issues in cumfnc #7858
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Replace gammaln(a+b)-gammaln(a)-gammaln(b) -> -betaln(a,b)
to avoid loss of precision in cancellations for large a, and
make use of gammaln(a+1) == gammaln(a) + log(a) for a > 0.
Whether the previous code worked correctly or not for very large values depends
on floating point issues --- it is dangerous to rely on
gammaln(a) and gammaln(a+b) returning exactly the same floating point
value when a==a+b up to fp precision, as this is apparently not
guaranteed by gfortran optimizations.
Fixes gh-7828
There in principle may be other issues with this function since
it does not appear to be properly tested, but this is at least one obviously
correct fix...