Skip to content

Commit 868d87f

Browse files
committed
merge F32 & F64 besseli1
1 parent a53aa90 commit 868d87f

File tree

2 files changed

+8
-37
lines changed

2 files changed

+8
-37
lines changed

src/besseli.jl

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ function besseli0x(x::T) where T <: Union{Float32, Float64}
3434
return evalpoly(inv(x), besseli0_large_coefs(T)) / sqrt(x)
3535
end
3636
end
37-
function besseli1(x::Float32)
38-
T = Float32
37+
function besseli1(x::T) where T <: Union{Float32, Float64}
3938
z = abs(x)
4039
if z < 7.75
4140
a = z * z / 4
@@ -51,46 +50,14 @@ function besseli1(x::Float32)
5150
end
5251
return z
5352
end
54-
function besseli1(x::Float64)
55-
T = Float64
56-
z = abs(x)
57-
if z < 7.75
58-
a = z * z / 4
59-
inner = (one(T), T(0.5), evalpoly(a, besseli1_small_coefs(T)))
60-
z = z * evalpoly(a, inner) / 2
61-
else
62-
a = exp(z / 2)
63-
s = a * evalpoly(inv(z), besseli1_med_coefs(T)) / sqrt(z)
64-
z = a * s
65-
end
66-
if x < zero(x)
67-
z = -z
68-
end
69-
return z
70-
end
71-
function besseli1x(x::Float32)
72-
T = Float32
73-
z = abs(x)
74-
if z < 7.75
75-
a = z * z / 4
76-
inner = (one(T), T(0.5), evalpoly(a, besseli1_small_coefs(T)))
77-
z = z * evalpoly(a, inner) / 2 * exp(-z)
78-
else
79-
z = evalpoly(inv(z), besseli1_med_coefs(T)) / sqrt(z)
80-
end
81-
if x < zero(x)
82-
z = -z
83-
end
84-
return z
85-
end
86-
function besseli1x(x::Float64)
87-
T = Float64
53+
function besseli1x(x::T) where T <: Union{Float32, Float64}
54+
T == Float32 ? branch = 50 : branch = 500
8855
z = abs(x)
8956
if z < 7.75
9057
a = z * z / 4
9158
inner = (one(T), T(0.5), evalpoly(a, besseli1_small_coefs(T)))
9259
z = z * evalpoly(a, inner) / 2 * exp(-z)
93-
elseif z < 500
60+
elseif z < branch
9461
z = evalpoly(inv(z), besseli1_med_coefs(T)) / sqrt(z)
9562
else
9663
z = evalpoly(inv(z), besseli1_large_coefs(T)) / sqrt(z)

src/constants.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ const besseli1_large_coefs(::Type{Float64}) = (
166166
3.989422804014314820e-01, -1.496033551467584157e-01, -4.675105322571775911e-02,
167167
-4.090421597376992892e-02, -5.843630344778927582e-02
168168
)
169+
const besseli1_large_coefs(::Type{Float32}) = (
170+
3.989422804014314820f-01, -1.496033551467584157f-01, -4.675105322571775911f-02,
171+
-4.090421597376992892f-02, -5.843630344778927582f-02
172+
)
169173
const A_k0(::Type{Float64}) = (
170174
1.37446543561352307156E-16, 4.25981614279661018399E-14, 1.03496952576338420167E-11,
171175
1.90451637722020886025E-9, 2.53479107902614945675E-7, 2.28621210311945178607E-5,

0 commit comments

Comments
 (0)