Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request] hard coded edge-case results for approximated functions #215

Open
kMutagene opened this issue Jun 23, 2022 · 1 comment

Comments

@kMutagene
Copy link
Member

kMutagene commented Jun 23, 2022

I am not sure if this can be labeled as a bug, please adjust accordingly. Functions that are approximated (such as gamma, erfcx, etc.) may return incorrect results for edge cases such as +/- infinity.

Example: gamma(infinity) should be infinity, but returns nan via approximation:

image

https://www.wolframalpha.com/input?i=gamma%28infinity%29

My suggestion would be catching edge cases on the input, so in the case of the gamma approximation:

    let gamma z = 
        match z with
        | z when (infinity.Equals(z)) -> infinity
        | z when ((-infinity).Equals(z)) -> nan
        | _ ->
            let lanczosCoefficients = [76.18009172947146;-86.50532032941677;24.01409824083091;-1.231739572450155;0.1208650973866179e-2;-0.5395239384953e-5]
            let rec sumCoefficients acc i coefficients =
                match coefficients with
                | []   -> acc
                | h::t -> sumCoefficients (acc + (h/i)) (i+1.0) t
            let gamma = 5.0
            let x = z - 1.0
            Math.Pow(x + gamma + 0.5, x + 0.5) * Math.Exp( -(x + gamma + 0.5) ) * Math.Sqrt( 2.0 * Math.PI ) * sumCoefficients 1.000000000190015 (x + 1.0) lanczosCoefficients
@kMutagene
Copy link
Member Author

After some discussion, we arrived at the use of 2 functions for this problem, a performant version that does not do these checks (prefixed by _), and a checked version (e.g. _gamma and gamma). the unchecked versions should be used internally.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant