@@ -27,9 +27,11 @@ sphericalbesselj(nu::Real, x::Real) = _sphericalbesselj(nu, float(x))
27
27
_sphericalbesselj (nu, x:: Float16 ) = Float16 (_sphericalbesselj (nu, Float32 (x)))
28
28
29
29
function _sphericalbesselj (nu:: Real , x:: T ) where T <: Union{Float32, Float64}
30
- isnan (nu) || isnan (x) && return NaN
31
30
x < zero (T) && return throw (DomainError (x, " Complex result returned for real arguments. Complex arguments are currently not supported" ))
32
-
31
+ if ~ isfinite (x)
32
+ isnan (x) && return x
33
+ isinf (x) && return zero (x)
34
+ end
33
35
return nu < zero (T) ? sphericalbesselj_generic (nu, x) : sphericalbesselj_positive_args (nu, x)
34
36
end
35
37
56
58
sphericalbesselj_small_args_cutoff (nu, x:: T ) where T = x^ 2 / (4 * nu + 110 ) < eps (T)
57
59
58
60
function sphericalbesselj_small_args (nu, x:: T ) where T
61
+ iszero (x) && return iszero (nu) ? one (T) : zero (T)
59
62
x2 = x^ 2 / 4
60
63
coef = evalpoly (x2, (1 , - inv (T (3 )/ 2 + nu), - inv (5 + nu), - inv (T (21 )/ 2 + nu), - inv (18 + nu)))
61
64
a = sqrt (T (pi )/ 2 ) / (gamma (T (3 )/ 2 + nu) * 2 ^ (nu + T (1 )/ 2 ))
@@ -110,8 +113,11 @@ sphericalbessely(nu::Real, x::Real) = _sphericalbessely(nu, float(x))
110
113
_sphericalbessely (nu, x:: Float16 ) = Float16 (_sphericalbessely (nu, Float32 (x)))
111
114
112
115
function _sphericalbessely (nu:: Real , x:: T ) where T <: Union{Float32, Float64}
113
- isnan (nu) || isnan (x) && return NaN
114
116
x < zero (T) && return throw (DomainError (x, " Complex result returned for real arguments. Complex arguments are currently not supported" ))
117
+ if ~ isfinite (x)
118
+ isnan (x) && return x
119
+ isinf (x) && return zero (x)
120
+ end
115
121
return nu < zero (T) ? sphericalbessely_generic (nu, x) : sphericalbessely_positive_args (nu, x)
116
122
end
117
123
@@ -149,5 +155,8 @@ function sphericalbessely_forward_recurrence(nu::Integer, x::T) where T
149
155
sY0, sY1 = sY1, muladd ((2 * nu_start + 1 )* xinv, sY1, - sY0)
150
156
nu_start += 1
151
157
end
152
- return sY0, sY1
158
+ # need to check if NaN resulted during loop
159
+ # this could happen if x is very small and nu is large which eventually results in overflow (-> -Inf)
160
+ # NaN inputs were checked in top level function so if sY0 is NaN we should return -infinity
161
+ return isnan (sY0) ? (- Inf , - Inf ) : (sY0, sY1)
153
162
end
0 commit comments