Skip to content

Commit 08e7248

Browse files
committed
add medium branch
1 parent 1d41167 commit 08e7248

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

src/besselj.jl

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
# [3] Harrison, John. "Fast and accurate Bessel function computation."
2929
# 2009 19th IEEE Symposium on Computer Arithmetic. IEEE, 2009.
3030
#
31-
function besselj0(x::T) where T
31+
function besselj0(x::Float64)
32+
T = Float64
3233
x = abs(x)
3334
isinf(x) && return zero(x)
3435

@@ -42,7 +43,7 @@ function besselj0(x::T) where T
4243
p = (z - DR1) * (z - DR2)
4344
p = p * evalpoly(z, RP_j0(T)) / evalpoly(z, RQ_j0(T))
4445
return p
45-
elseif x < 75.0
46+
elseif x < 25.0
4647
w = 5.0 / x
4748
q = 25.0 / (x * x)
4849

@@ -52,11 +53,26 @@ function besselj0(x::T) where T
5253
sc = sincos(xn)
5354
p = p * sc[2] - w * q * sc[1]
5455
return p * SQ2OPI(T) / sqrt(x)
56+
elseif x < 75.0
57+
xinv = inv(x)
58+
x2 = xinv * xinv
59+
p = (one(T), -9/128, 3675/32768, - 2401245/4194304, 13043905875/2147483648, - 30241281245175/274877906944, 213786613951685775/70368744177664, -1070401384414690453125/9007199254740992, 57673297952355815927071875/9223372036854775808)
60+
q = (-1/8, 75/1024, - 59535/262144, 57972915/33554432, - 418854310875/17179869184, 1212400457192925/2199023255552, - 10278202593831046875/562949953421312, 60013837619516978071875/72057594037927936, - 3694483615889146090857721875/73786976294838206464)
61+
62+
p = evalpoly(x2, p)
63+
q = evalpoly(x2, q) * xinv
64+
65+
pq = (one(T), -1/16, 53/512, -4447/8192, 3066403/524288, -896631415/8388608, 796754802993/268435456, -500528959023471/4294967296)
66+
beta = evalpoly(x2, pq)
67+
68+
alpha = atan(-q/p)
69+
70+
return SQ2OPI(T) * sqrt(xinv) * beta * cos_sum(x, - T(pi)/4 - alpha)
5571
else
5672
xinv = inv(x)
5773
x2 = xinv*xinv
5874

59-
p = (one(T), -1/16, 53/512, -4447/8192, 5066403/524288)
75+
p = (one(T), -1/16, 53/512, -4447/8192, 3066403/524288)
6076
p = evalpoly(x2, p)
6177
a = SQ2OPI(T) * sqrt(xinv) * p
6278

0 commit comments

Comments
 (0)