@@ -693,7 +693,7 @@ function gamma_inc_inv_psmall(a::Float64, logr::Float64)
693
693
end
694
694
695
695
"""
696
- gamma_inc_inv_qsmall(a,q )
696
+ gamma_inc_inv_qsmall(a, q, qgammaxa )
697
697
698
698
Compute `x0` - initial approximation when `q` is small from ``e^{-x_{0}} x_{0}^{a} = q \\ Gamma(a)``.
699
699
Asymptotic expansions Eqn (2.29) in the paper is used here and higher approximations are obtained using
@@ -702,9 +702,9 @@ x \\sim x_{0} - L + b \\sum_{k=1}^{\\infty} d_{k}/x_{0}^{k}
702
702
```
703
703
where ``b = 1-a``, ``L = \\ ln{x_0}``.
704
704
"""
705
- function gamma_inc_inv_qsmall (a:: Float64 , q:: Float64 )
705
+ function gamma_inc_inv_qsmall (a:: Float64 , q:: Float64 , qgammaxa :: Float64 )
706
706
b = 1.0 - a
707
- eta = sqrt (- 2 / a* log (q * gammax (a) * sqrt (twoπ / a) ))
707
+ eta = sqrt (- 2 / a* log (qgammaxa ))
708
708
x0 = a* lambdaeta (eta)
709
709
l = log (x0)
710
710
@@ -941,8 +941,11 @@ function __gamma_inc_inv(a::Float64, minpq::Float64, pcase::Bool)
941
941
logr = (logp + loggamma1pa) / a
942
942
if logr < log (0.2 * (1 + a)) # small value of p
943
943
x0 = gamma_inc_inv_psmall (a, logr)
944
- elseif ! pcase && minpq < min (0.02 , exp (- 1.5 * a)/ gamma (a)) && a < 10 # small q
945
- x0 = gamma_inc_inv_qsmall (a, minpq)
944
+ elseif ! pcase && a < 10 && minpq < 0.02 && (qgammaxa = minpq* gammax (a)* sqrt (twoπ/ a)) < 1 # small q
945
+ # This deviates from the original version. The tmp variable
946
+ # here ensures that the argument of sqrt in gamma_inc_inv_qsmall
947
+ # is positive
948
+ x0 = gamma_inc_inv_qsmall (a, minpq, qgammaxa)
946
949
elseif abs (minpq - 0.5 ) < 1.0e-05
947
950
x0 = a - 1.0 / 3.0 + (8.0 / 405.0 + 184.0 / 25515.0 / a)/ a
948
951
elseif abs (a - 1.0 ) < 1.0e-4
0 commit comments