Skip to content

Commit 3d2b465

Browse files
committed
change file structure
1 parent 13cba3f commit 3d2b465

29 files changed

+1198
-1016
lines changed

src/Bessels.jl

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,42 @@ export besselj0
44
export besselj1
55
export bessely0
66
export bessely1
7+
export besseli0
8+
export besseli0x
9+
export besseli1
10+
export besseli1x
11+
export besselk0
12+
export besselk0x
13+
export besselk1
14+
export besselk1x
715

16+
17+
include("Float32/besseli.jl")
18+
include("Float32/besselj.jl")
19+
include("Float32/besselk.jl")
20+
include("Float32/bessely.jl")
21+
include("Float32/constants.jl")
22+
23+
include("Float64/besseli.jl")
24+
include("Float64/besselj.jl")
25+
include("Float64/besselk.jl")
26+
include("Float64/bessely.jl")
27+
include("Float64/constants.jl")
28+
29+
include("Float128/besseli.jl")
30+
include("Float128/besselj.jl")
31+
include("Float128/besselk.jl")
32+
include("Float128/bessely.jl")
33+
include("Float128/constants.jl")
34+
35+
36+
include("chebyshev.jl")
837
include("constants.jl")
9-
include("j0_y0_constants.jl")
10-
include("j0.jl")
11-
include("y0.jl")
12-
include("j1.jl")
38+
#include("j0_y0_constants.jl")
39+
#include("j0.jl")
40+
#include("y0.jl")
41+
#include("j1.jl")
1342

14-
include("parse.jl")
43+
#include("parse.jl")
1544

1645
end

src/Float128/besseli.jl

Whitespace-only changes.

src/Float128/besselj.jl

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
function besselj0(x::BigFloat)
2+
x = abs(x)
3+
T = eltype(x)
4+
if iszero(x)
5+
return one(x)
6+
elseif isinf(x)
7+
return zero(x)
8+
end
9+
10+
if x <= 2.0
11+
z = x * x
12+
p = z * z * evalpoly(z, J0_2N) / evalpoly(z, J0_2D)
13+
p -= 0.25 * z
14+
p += one(T)
15+
return p
16+
else
17+
xinv = inv(x)
18+
z = xinv * xinv
19+
if xinv <= 0.25
20+
if xinv <= 0.125
21+
if xinv <= 0.0625
22+
p = evalpoly(z, P16_IN) / evalpoly(z, P16_ID)
23+
q = evalpoly(z, Q16_IN) / evalpoly(z, Q16_ID)
24+
else
25+
p = evalpoly(z, P8_16N) / evalpoly(z, P8_16D)
26+
q = evalpoly(z, Q8_16N) / evalpoly(z, Q8_16D)
27+
end
28+
elseif xinv <= 0.1875
29+
p = evalpoly(z, P5_8N) / evalpoly(z, P5_8D)
30+
q = evalpoly(z, Q5_8N) / evalpoly(z, Q5_8D)
31+
else
32+
p = evalpoly(z, P4_5N) / evalpoly(z, P4_5D)
33+
q = evalpoly(z, Q4_5N) / evalpoly(z, Q4_5D)
34+
end
35+
elseif xinv <= 0.5
36+
if xinv <= 0.375
37+
if xinv <= 0.3125
38+
p = evalpoly(z, P3r2_4N) / evalpoly(z, P3r2_4D)
39+
q = evalpoly(z, Q3r2_4N) / evalpoly(z, Q3r2_4D)
40+
else
41+
p = evalpoly(z, P2r7_3r2N) / evalpoly(z, P2r7_3r2D)
42+
q = evalpoly(z, Q2r7_3r2N) / evalpoly(z, Q2r7_3r2D)
43+
end
44+
elseif xinv <= 0.4375
45+
p = evalpoly(z, P2r3_2r7N) / evalpoly(z, P2r3_2r7D)
46+
q = evalpoly(z, Q2r3_2r7N) / evalpoly(z, Q2r3_2r7D)
47+
else
48+
p = evalpoly(z, P2_2r3N) / evalpoly(z, P2_2r3D)
49+
q = evalpoly(z, Q2_2r3N) / evalpoly(z, Q2_2r3D)
50+
end
51+
end
52+
53+
p = 1.0 + z * p
54+
q = z * xinv * q
55+
q = q - 0.125 * xinv
56+
c = cos(x)
57+
s = sin(x)
58+
ss = s - c
59+
cc = s + c
60+
z = -cos(x + x)
61+
if (s * c) < 0
62+
cc = z / ss;
63+
else
64+
ss = z / cc;
65+
end
66+
z = ONEOSQPI(T) * (p * cc - q * ss) / sqrt(x)
67+
return z
68+
end
69+
end

src/Float128/besselk.jl

Whitespace-only changes.

src/Float128/bessely.jl

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
function bessely0(x::BigFloat)
2+
if x <= zero(x)
3+
if iszero(x)
4+
return -Inf
5+
else
6+
return throw(DomainError(x, "NaN result for non-NaN input."))
7+
end
8+
elseif isinf(x)
9+
return zero(x)
10+
end
11+
12+
xx = abs(x)
13+
14+
if xx <= 2.0
15+
z = xx * xx
16+
p = evalpoly(z, Y0_2N) / evalpoly(z, Y0_2D)
17+
p = TWOOPI(BigFloat) * log(x) * besselj0(x) + p
18+
return p
19+
end
20+
21+
xinv = inv(xx)
22+
z = xinv * xinv
23+
if xinv <= 0.25
24+
if xinv <= 0.125
25+
if xinv <= 0.0625
26+
p = evalpoly(z, P16_IN) / evalpoly(z, P16_ID)
27+
q = evalpoly(z, Q16_IN) / evalpoly(z, Q16_ID)
28+
else
29+
p = evalpoly(z, P8_16N) / evalpoly(z, P8_16D)
30+
q = evalpoly(z, Q8_16N) / evalpoly(z, Q8_16D)
31+
end
32+
elseif xinv <= 0.1875
33+
p = evalpoly(z, P5_8N) / evalpoly(z, P5_8D)
34+
q = evalpoly(z, Q5_8N) / evalpoly(z, Q5_8D)
35+
else
36+
p = evalpoly(z, P4_5N) / evalpoly(z, P4_5D)
37+
q = evalpoly(z, Q4_5N) / evalpoly(z, Q4_5D)
38+
end
39+
else
40+
if xinv <= 0.375
41+
if xinv <= 0.3125
42+
p = evalpoly(z, P3r2_4N) / evalpoly(z, P3r2_4D)
43+
q = evalpoly(z, Q3r2_4N) / evalpoly(z, Q3r2_4D)
44+
else
45+
p = evalpoly(z, P2r7_3r2N) / evalpoly(z, P2r7_3r2D)
46+
q = evalpoly(z, Q2r7_3r2N) / evalpoly(z, Q2r7_3r2D)
47+
end
48+
elseif xinv <= 0.4375
49+
p = evalpoly(z, P2r3_2r7N) / evalpoly(z, P2r3_2r7D)
50+
q = evalpoly(z, Q2r3_2r7N) / evalpoly(z, Q2r3_2r7D)
51+
else
52+
p = evalpoly(z, P2_2r3N) / evalpoly(z, P2_2r3D)
53+
q = evalpoly(z, Q2_2r3N) / evalpoly(z, Q2_2r3D)
54+
end
55+
end
56+
57+
p = 1.0 + z * p
58+
q = z * xinv * q
59+
q = q - 0.125 * xinv
60+
c = cos(x)
61+
s = sin(x)
62+
ss = s - c
63+
cc = s + c
64+
z = -cos(x + x)
65+
if s * c < zero(x)
66+
cc = z / ss
67+
else
68+
ss = z / cc
69+
end
70+
z = ONEOSQPI(BigFloat) * (p * ss + q * cc) / sqrt(x)
71+
return z
72+
end
File renamed without changes.

src/Float32/besseli.jl

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
function besseli0(x::Float32)
2+
T = Float32
3+
if x < zero(x)
4+
x = -x
5+
end
6+
if x <= 8.0f0
7+
y = 0.5f0 * x - 2.0f0
8+
return exp(x) * chbevl(y, A_i0(T))
9+
else
10+
return exp(x) * chbevl(32.0f0 / x - 2.0f0, B_i0(T)) / sqrt(x)
11+
end
12+
end
13+
function besseli0x(x::Float32)
14+
T = Float32
15+
if x < zero(x)
16+
x = -x
17+
end
18+
if x <= 8.0f0
19+
y = 0.5f0 * x - 2.0f0
20+
return chbevl(y, A_i0(T))
21+
else
22+
return chbevl(32.0f0 / x - 2.0f0, B_i0(T)) / sqrt(x)
23+
end
24+
end
25+
function besseli1(x::Float32)
26+
T = Float32
27+
z = abs(x)
28+
if z <= 8.0f0
29+
y = 0.5f0 * z - 2.0f0
30+
z = chbevl(y, A_i1(T)) * z * exp(z)
31+
else
32+
z = exp(z) * chbevl(32.0f0 / z - 2.0f0, B_i1(T)) / sqrt(z)
33+
end
34+
if x < zero(x)
35+
z = -z
36+
end
37+
return z
38+
end
39+
function besseli1x(x::Float32)
40+
T = Float32
41+
z = abs(x)
42+
if z <= 8.0f0
43+
y = 0.5f0 * z - 2.0f0
44+
z = chbevl(y, A_i1(T)) * z
45+
else
46+
z = chbevl(32.0f0 / z - 2.0f0, B_i1(T)) / sqrt(z)
47+
end
48+
if x < zero(x)
49+
z = -z
50+
end
51+
return z
52+
end

src/Float32/besselj.jl

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
function besselj0(x::Float32)
2+
T = Float32
3+
x = abs(x)
4+
if iszero(x)
5+
return one(x)
6+
elseif isinf(x)
7+
return zero(x)
8+
end
9+
10+
if x <= 2.0f0
11+
z = x * x
12+
if x < 1.0f-3
13+
return 1.0f0 - 0.25f0 * z
14+
end
15+
DR1 = 5.78318596294678452118f0
16+
p = (z - DR1) * evalpoly(z, JP_j0(T))
17+
return p
18+
else
19+
q = inv(x)
20+
w = sqrt(q)
21+
p = w * evalpoly(q, MO_j0(T))
22+
w = q * q
23+
xn = q * evalpoly(w, PH_j0(T)) - PIO4(Float32)
24+
p = p * cos(xn + x)
25+
return p
26+
end
27+
end
28+
29+
function besselj1(x::Float32)
30+
x = abs(x)
31+
if iszero(x)
32+
return zero(x)
33+
elseif isinf(x)
34+
return zero(x)
35+
end
36+
37+
if x <= 2.0f0
38+
z = x * x
39+
Z1 = 1.46819706421238932572f1
40+
p = (z - Z1) * x * evalpoly(z, JP32)
41+
return p
42+
else
43+
q = inv(x)
44+
w = sqrt(q)
45+
p = w * evalpoly(q, MO132)
46+
w = q * q
47+
xn = q * evalpoly(w, PH132) - THPIO4(Float32)
48+
p = p * cos(xn + x)
49+
return p
50+
end
51+
end

src/Float32/besselk.jl

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
function besselk0(x::Float32)
2+
T = Float32
3+
if x <= zero(x)
4+
return throw(DomainError(x, "NaN result for non-NaN input."))
5+
end
6+
7+
if x <= 2.0f0
8+
y = x * x - 2.0f0
9+
y = chbevl(y, A_k0(T)) - log(0.5f0 * x) * besseli0(x)
10+
return y
11+
else
12+
z = 8.0f0 / x - 2.0f0
13+
y = exp(-x) * chbevl(z, B_k0(T)) / sqrt(x)
14+
return y
15+
end
16+
end
17+
function besselk0x(x::Float32)
18+
T = Float32
19+
if x <= zero(x)
20+
return throw(DomainError(x, "NaN result for non-NaN input."))
21+
end
22+
23+
if x <= 2.0f0
24+
y = x * x - 2.0f0
25+
y = chbevl(y, A_k0(T)) - log(0.5f0 * x) * besseli0(x)
26+
return y * exp(x)
27+
else
28+
z = 8.0f0 / x - 2.0f0
29+
y = chbevl(z, B_k0(T)) / sqrt(x)
30+
return y
31+
end
32+
end
33+
34+
function besselk1(x::Float32)
35+
T = Float32
36+
if x <= zero(x)
37+
if iszero(x)
38+
return Inf32
39+
else
40+
return throw(DomainError(x, "NaN result for non-NaN input."))
41+
end
42+
end
43+
if x <= 2.0f0
44+
y = x * x - 2.0f0
45+
y = log(0.5f0 * x) * besseli1(x) + chbevl(y, A_k1(T)) / x
46+
return y
47+
else
48+
return exp(-x) * chbevl(8.0f0 / x - 2.0f0, B_k1(T)) / sqrt(x)
49+
end
50+
end
51+
52+
function besselk1x(x::Float32)
53+
T = Float32
54+
if x <= zero(x)
55+
if iszero(x)
56+
return Inf32
57+
else
58+
return throw(DomainError(x, "NaN result for non-NaN input."))
59+
end
60+
end
61+
if x <= 2.0f0
62+
y = x * x - 2.0f0
63+
y = log(0.5f0 * x) * besseli1(x) + chbevl(y, A_k1(T)) / x
64+
return y * exp(x)
65+
else
66+
return chbevl(8.0f0 / x - 2.0f0, B_k1(T)) / sqrt(x)
67+
end
68+
end

0 commit comments

Comments
 (0)