Skip to content

Commit 1d3bb36

Browse files
committed
remove arctan function
1 parent 1f651b7 commit 1d3bb36

File tree

1 file changed

+16
-31
lines changed

1 file changed

+16
-31
lines changed

src/besselj.jl

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -53,27 +53,19 @@ function besselj0(x::Float64)
5353
sc = sincos(xn)
5454
p = p * sc[2] - w * q * sc[1]
5555
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-
p = evalpoly(x2, p)
62-
q = evalpoly(x2, q) * xinv
63-
alpha = atan(-q/p)
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-
return SQ2OPI(T) * sqrt(xinv) * beta * cos_sum(x, - T(pi)/4 - alpha)
6856
else
57+
if x < 75.0
58+
p = (one(T), -1/16, 53/512, -4447/8192, 3066403/524288, -896631415/8388608, 796754802993/268435456, -500528959023471/4294967296)
59+
q = (-1/8, 25/384, -1073/5120, 375733/229376, -55384775/2359296, 24713030909/46137344, -7780757249041/436207616)
60+
else
61+
p = (one(T), -1/16, 53/512, -4447/8192, 3066403/524288)
62+
q = (-1/8, 25/384, -1073/5120, 375733/229376, -55384775/2359296)
63+
end
6964
xinv = inv(x)
7065
x2 = xinv*xinv
7166

72-
p = (one(T), -1/16, 53/512, -4447/8192, 3066403/524288)
7367
p = evalpoly(x2, p)
7468
a = SQ2OPI(T) * sqrt(xinv) * p
75-
76-
q = (-1/8, 25/384, -1073/5120, 375733/229376, -55384775/2359296)
7769
xn = muladd(xinv, evalpoly(x2, q), - PIO4(T))
7870

7971
# the following computes b = cos(x + xn) more accurately
@@ -82,6 +74,8 @@ function besselj0(x::Float64)
8274
return a * b
8375
end
8476
end
77+
78+
8579
function besselj0(x::Float32)
8680
T = Float32
8781
x = abs(x)
@@ -125,27 +119,19 @@ function besselj1(x::Float64)
125119
sc = sincos(xn)
126120
p = p * sc[2] - w * q * sc[1]
127121
return p * SQ2OPI(T) / sqrt(x)
128-
elseif x < 75.0
129-
xinv = inv(x)
130-
x2 = xinv * xinv
131-
p = (one(T), 15/128, -4725/32768, 2837835/4194304, -14783093325/2147483648, 33424574007825/274877906944, -232376754295310625/70368744177664, 1149690375852815671875/9007199254740992)
132-
q = (3/8, -105/1024, 72765/262144, -66891825/33554432, 468131288625/17179869184, -1327867167401775/2199023255552, 11100458801337530625/562949953421312, -64152722972587114490625/72057594037927936)
133-
p = evalpoly(x2, p)
134-
q = evalpoly(x2, q) * xinv
135-
alpha = atan(-q/p)
136-
137-
pq = (one(T), 3/16, -99/512, 6597/8192, -4057965/524288, 1113686901/8388608, -951148335159/268435456, 581513783771781/4294967296, -3198424285940846836612419/9223372036854775808)
138-
beta = evalpoly(x2, pq)
139-
return SQ2OPI(T) * sqrt(xinv) * beta * cos_sum(x, - 3*T(pi)/4 - alpha)
140122
else
123+
if x < 120.0
124+
p = (one(T), 3/16, -99/512, 6597/8192, -4057965/524288, 1113686901/8388608, -951148335159/268435456, 581513783771781/4294967296)
125+
q = (3/8, -21/128, 1899/5120, -543483/229376, 8027901/262144, -30413055339/46137344, 9228545313147/436207616)
126+
else
127+
p = (one(T), 3/16, -99/512, 6597/8192)
128+
q = (3/8, -21/128, 1899/5120, -543483/229376)
129+
end
141130
xinv = inv(x)
142131
x2 = xinv*xinv
143132

144-
p = (one(T), 3/16, -99/512, 6597/8192, -4057965/524288)
145133
p = evalpoly(x2, p)
146134
a = SQ2OPI(T) * sqrt(xinv) * p
147-
148-
q = (3/8, -21/128, 1899/5120, -543483/229376, 8027901/262144)
149135
xn = muladd(xinv, evalpoly(x2, q), - 3 * PIO4(T))
150136

151137
# the following computes b = cos(x + xn) more accurately
@@ -154,7 +140,6 @@ function besselj1(x::Float64)
154140
return a * b
155141
end
156142
end
157-
158143
function besselj1(x::Float32)
159144
x = abs(x)
160145
isinf(x) && return zero(x)

0 commit comments

Comments
 (0)