Skip to content

Commit edbd576

Browse files
committed
add large args j1, y1
1 parent cb2af4e commit edbd576

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

src/besselj.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,26 @@ function besselj1(x::Float64)
8181
w = evalpoly(z, RP_j1(T)) / evalpoly(z, RQ_j1(T))
8282
w = w * x * (z - 1.46819706421238932572e1) * (z - 4.92184563216946036703e1)
8383
return w
84-
else
84+
elseif x < 100.0
8585
w = 5.0 / x
8686
z = w * w
8787
p = evalpoly(z, PP_j1(T)) / evalpoly(z, PQ_j1(T))
8888
q = evalpoly(z, QP_j1(T)) / evalpoly(z, QQ_j1(T))
8989
xn = x - THPIO4(T)
9090
p = p * cos(xn) - w * q * sin(xn)
9191
return p * SQ2OPI(T) / sqrt(x)
92+
else
93+
xinv = inv(x)
94+
x2 = xinv*xinv
95+
96+
p = (one(T), 3/16, -99/512, 6597/8192, -4057965/524288)
97+
p = evalpoly(x2, p)
98+
a = SQ2OPI(T) * sqrt(xinv) * p
99+
100+
q = (3/8, -21/128, 1899/5120, -543483/229376, 8027901/262144)
101+
xn = muladd(xinv, evalpoly(x2, q), - 3 * PIO4(T))
102+
b = cos(x + xn)
103+
return a * b
92104
end
93105
end
94106

src/bessely.jl

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,26 @@ function _bessely0_compute(x::Float64)
2323
w = evalpoly(z, YP_y0(T)) / evalpoly(z, YQ_y0(T))
2424
w += TWOOPI(T) * log(x) * besselj0(x)
2525
return w
26-
else
26+
elseif x < 100.0
2727
w = T(5) / x
2828
z = w*w
2929
p = evalpoly(z, PP_y0(T)) / evalpoly(z, PQ_y0(T))
3030
q = evalpoly(z, QP_y0(T)) / evalpoly(z, QQ_y0(T))
3131
xn = x - PIO4(T)
3232
p = p * sin(xn) + w * q * cos(xn);
3333
return p * SQ2OPI(T) / sqrt(x)
34+
else
35+
xinv = inv(x)
36+
x2 = xinv*xinv
37+
38+
p = (one(T), -1/16, 53/512, -4447/8192, 5066403/524288)
39+
p = evalpoly(x2, p)
40+
a = SQ2OPI(T) * sqrt(xinv) * p
41+
42+
q = (-1/8, 25/384, -1073/5120, 375733/229376, -55384775/2359296)
43+
xn = muladd(xinv, evalpoly(x2, q), - PIO4(T))
44+
b = sin(x + xn)
45+
return a * b
3446
end
3547
end
3648
function _bessely0_compute(x::Float32)
@@ -71,14 +83,26 @@ function _bessely1_compute(x::Float64)
7183
w = x * (evalpoly(z, YP_y1(T)) / evalpoly(z, YQ_y1(T)))
7284
w += TWOOPI(T) * (besselj1(x) * log(x) - inv(x))
7385
return w
74-
else
86+
elseif x < 100.0
7587
w = T(5) / x
7688
z = w * w
7789
p = evalpoly(z, PP_j1(T)) / evalpoly(z, PQ_j1(T))
7890
q = evalpoly(z, QP_j1(T)) / evalpoly(z, QQ_j1(T))
7991
xn = x - THPIO4(T)
8092
p = p * sin(xn) + w * q * cos(xn)
8193
return p * SQ2OPI(T) / sqrt(x)
94+
else
95+
xinv = inv(x)
96+
x2 = xinv*xinv
97+
98+
p = (one(T), 3/16, -99/512, 6597/8192, -4057965/524288)
99+
p = evalpoly(x2, p)
100+
a = SQ2OPI(T) * sqrt(xinv) * p
101+
102+
q = (3/8, -21/128, 1899/5120, -543483/229376, 8027901/262144)
103+
xn = muladd(xinv, evalpoly(x2, q), - 3 * PIO4(T))
104+
b = sin(x + xn)
105+
return a * b
82106
end
83107
end
84108

0 commit comments

Comments
 (0)