Skip to content

Commit 824b0cf

Browse files
committed
support better float16, integer arguments
1 parent fed39ca commit 824b0cf

File tree

4 files changed

+39
-13
lines changed

4 files changed

+39
-13
lines changed

src/besseli.jl

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,12 @@ end
164164
165165
Modified Bessel function of the second kind of order nu, ``I_{nu}(x)``.
166166
"""
167-
function besseli(nu::Real, x::T) where T
168-
isinteger(nu) && return besseli(Int(nu), x)
167+
besseli(nu::Real, x::Real) = _besseli(nu, float(x))
168+
169+
besseli(nu, x::Float16) = Float16(_besseli(nu, Float32(x)))
170+
171+
function _besseli(nu::Real, x::T) where T
172+
isinteger(nu) && return _besseli(Int(nu), x)
169173
abs_nu = abs(nu)
170174
abs_x = abs(x)
171175

@@ -187,7 +191,7 @@ function besseli(nu::Real, x::T) where T
187191
end
188192
end
189193
end
190-
function besseli(nu::Integer, x::T) where T
194+
function _besseli(nu::Integer, x::T) where T
191195
abs_nu = abs(nu)
192196
abs_x = abs(x)
193197
sg = iseven(abs_nu) ? 1 : -1
@@ -225,7 +229,11 @@ end
225229
Scaled modified Bessel function of the first kind of order nu, ``I_{nu}(x)*e^{-x}``.
226230
Nu must be real.
227231
"""
228-
function besselix(nu, x::T) where T <: Union{Float32, Float64}
232+
besselix(nu::Real, x::Real) = _besselix(nu, float(x))
233+
234+
besselix(nu, x::Float16) = Float16(_besselix(nu, Float32(x)))
235+
236+
function _besselix(nu, x::T) where T <: Union{Float32, Float64}
229237
iszero(nu) && return besseli0x(x)
230238
isone(nu) && return besseli1x(x)
231239

src/besselj.jl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,18 @@ end
192192
##### Generic routine for `besselj`
193193
#####
194194

195-
function besselj(nu::Real, x::T) where T
196-
isinteger(nu) && return besselj(Int(nu), x)
195+
"""
196+
besselj(nu, x::T) where T <: Union{Float32, Float64}
197+
198+
Bessel function of the first kind of order nu, ``J_{nu}(x)``.
199+
nu and x must be real where nu and x can be positive or negative.
200+
"""
201+
besselj(nu::Real, x::Real) = _besselj(nu, float(x))
202+
203+
besselj(nu, x::Float16) = Float16(_besselj(nu, Float32(x)))
204+
205+
function _besselj(nu::Real, x::T) where T <: Union{Float32, Float64}
206+
isinteger(nu) && return _besselj(Int(nu), x)
197207
abs_nu = abs(nu)
198208
abs_x = abs(x)
199209

@@ -218,7 +228,7 @@ function besselj(nu::Real, x::T) where T
218228
end
219229
end
220230

221-
function besselj(nu::Integer, x::T) where T
231+
function _besselj(nu::Integer, x::T) where T
222232
abs_nu = abs(nu)
223233
abs_x = abs(x)
224234
sg = iseven(abs_nu) ? 1 : -1

src/besselk.jl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,12 @@ end
185185
186186
Modified Bessel function of the second kind of order nu, ``K_{nu}(x)``.
187187
"""
188-
function besselk(nu::Real, x::T) where T
189-
isinteger(nu) && return besselk(Int(nu), x)
188+
besselk(nu::Real, x::Real) = _besselk(nu, float(x))
189+
190+
besselk(nu, x::Float16) = Float16(_besselk(nu, Float32(x)))
191+
192+
function _besselk(nu::Real, x::T) where T
193+
isinteger(nu) && return _besselk(Int(nu), x)
190194
abs_nu = abs(nu)
191195
abs_x = abs(x)
192196

@@ -197,7 +201,7 @@ function besselk(nu::Real, x::T) where T
197201
#return cispi(-abs_nu)*besselk_positive_args(abs_nu, abs_x) - besseli_positive_args(abs_nu, abs_x) * im * π
198202
end
199203
end
200-
function besselk(nu::Integer, x::T) where T
204+
function _besselk(nu::Integer, x::T) where T
201205
abs_nu = abs(nu)
202206
abs_x = abs(x)
203207
sg = iseven(abs_nu) ? 1 : -1

src/bessely.jl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,13 @@ end
235235
Bessel function of the second kind of order nu, ``Y_{nu}(x)``.
236236
nu and x must be real where nu and x can be positive or negative.
237237
"""
238-
function bessely(nu::Real, x::T) where T
238+
bessely(nu::Real, x::Real) = _bessely(nu, float(x))
239+
240+
bessely(nu, x::Float16) = Float16(_bessely(nu, Float32(x)))
241+
242+
function _bessely(nu::Real, x::T) where T <: Union{Float32, Float64}
239243
isnan(nu) || isnan(x) && return NaN
240-
isinteger(nu) && return bessely(Int(nu), x)
244+
isinteger(nu) && return _bessely(Int(nu), x)
241245
abs_nu = abs(nu)
242246
abs_x = abs(x)
243247

@@ -260,7 +264,7 @@ function bessely(nu::Real, x::T) where T
260264
end
261265
end
262266
end
263-
function bessely(nu::Integer, x::T) where T
267+
function _bessely(nu::Integer, x::T) where T
264268
abs_nu = abs(nu)
265269
abs_x = abs(x)
266270
sg = iseven(abs_nu) ? 1 : -1

0 commit comments

Comments
 (0)