Skip to content

Commit a53aa90

Browse files
committed
remove branch, update coeff
1 parent a92884d commit a53aa90

File tree

2 files changed

+25
-31
lines changed

2 files changed

+25
-31
lines changed

src/besseli.jl

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,14 @@ http://www.advanpix.com/2015/11/12/rational-approximations-for-the-modified-bess
1111
Actual coefficients used are from the boost math library.
1212
https://github.com/boostorg/math/tree/develop/include/boost/math/special_functions/detail
1313
=#
14-
1514
function besseli0(x::T) where T <: Union{Float32, Float64}
16-
T == Float32 ? branch = 50 : branch = 500
1715
x = abs(x)
1816
if x < 7.75
1917
a = x * x / 4
20-
return muladd(a, evalpoly(a, P1_i0(T)), 1)
21-
elseif x < branch
22-
return exp(x) * evalpoly(inv(x), P2_i0(T)) / sqrt(x)
18+
return muladd(a, evalpoly(a, besseli0_small_coefs(T)), 1)
2319
else
2420
a = exp(x / 2)
25-
s = a * evalpoly(inv(x), P3_i0(T)) / sqrt(x)
21+
s = a * evalpoly(inv(x), besseli0_med_coefs(T)) / sqrt(x)
2622
return a * s
2723
end
2824
end
@@ -31,23 +27,23 @@ function besseli0x(x::T) where T <: Union{Float32, Float64}
3127
x = abs(x)
3228
if x < 7.75
3329
a = x * x / 4
34-
return muladd(a, evalpoly(a, P1_i0(T)), 1) * exp(-x)
30+
return muladd(a, evalpoly(a, besseli0_small_coefs(T)), 1) * exp(-x)
3531
elseif x < branch
36-
return evalpoly(inv(x), P2_i0(T)) / sqrt(x)
32+
return evalpoly(inv(x), besseli0_med_coefs(T)) / sqrt(x)
3733
else
38-
return evalpoly(inv(x), P3_i0(T)) / sqrt(x)
34+
return evalpoly(inv(x), besseli0_large_coefs(T)) / sqrt(x)
3935
end
4036
end
4137
function besseli1(x::Float32)
4238
T = Float32
4339
z = abs(x)
4440
if z < 7.75
4541
a = z * z / 4
46-
inner = (one(T), T(0.5), evalpoly(a, P1_i1(T)))
42+
inner = (one(T), T(0.5), evalpoly(a, besseli1_small_coefs(T)))
4743
z = z * evalpoly(a, inner) / 2
4844
else
4945
a = exp(z / 2)
50-
s = a * evalpoly(inv(z), P2_i1(T)) / sqrt(z)
46+
s = a * evalpoly(inv(z), besseli1_med_coefs(T)) / sqrt(z)
5147
z = a * s
5248
end
5349
if x < zero(x)
@@ -60,13 +56,11 @@ function besseli1(x::Float64)
6056
z = abs(x)
6157
if z < 7.75
6258
a = z * z / 4
63-
inner = (one(T), T(0.5), evalpoly(a, P1_i1(T)))
59+
inner = (one(T), T(0.5), evalpoly(a, besseli1_small_coefs(T)))
6460
z = z * evalpoly(a, inner) / 2
65-
elseif z < 500
66-
return exp(z) * evalpoly(inv(z), P2_i1(T)) / sqrt(z)
6761
else
6862
a = exp(z / 2)
69-
s = a * evalpoly(inv(z), P3_i1(T)) / sqrt(z)
63+
s = a * evalpoly(inv(z), besseli1_med_coefs(T)) / sqrt(z)
7064
z = a * s
7165
end
7266
if x < zero(x)
@@ -79,10 +73,10 @@ function besseli1x(x::Float32)
7973
z = abs(x)
8074
if z < 7.75
8175
a = z * z / 4
82-
inner = (one(T), T(0.5), evalpoly(a, P1_i1(T)))
76+
inner = (one(T), T(0.5), evalpoly(a, besseli1_small_coefs(T)))
8377
z = z * evalpoly(a, inner) / 2 * exp(-z)
8478
else
85-
z = evalpoly(inv(z), P2_i1(T)) / sqrt(z)
79+
z = evalpoly(inv(z), besseli1_med_coefs(T)) / sqrt(z)
8680
end
8781
if x < zero(x)
8882
z = -z
@@ -94,12 +88,12 @@ function besseli1x(x::Float64)
9488
z = abs(x)
9589
if z < 7.75
9690
a = z * z / 4
97-
inner = (one(T), T(0.5), evalpoly(a, P1_i1(T)))
91+
inner = (one(T), T(0.5), evalpoly(a, besseli1_small_coefs(T)))
9892
z = z * evalpoly(a, inner) / 2 * exp(-z)
9993
elseif z < 500
100-
z = evalpoly(inv(z), P2_i1(T)) / sqrt(z)
94+
z = evalpoly(inv(z), besseli1_med_coefs(T)) / sqrt(z)
10195
else
102-
z = evalpoly(inv(z), P3_i1(T)) / sqrt(z)
96+
z = evalpoly(inv(z), besseli1_large_coefs(T)) / sqrt(z)
10397
end
10498
if x < zero(x)
10599
z = -z

src/constants.jl

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -104,23 +104,23 @@ const QQ_j0(::Type{Float64}) = (
104104
7.24046774195652478189E3, 3.88240183605401609683E3, 8.56430025976980587198E2,
105105
6.43178256118178023184E1, 1.00000000000000000000E0
106106
)
107-
const P1_i0(::Type{Float32}) = (
107+
const besseli0_small_coefs(::Type{Float32}) = (
108108
1.00000003928615375f0, 2.49999576572179639f-1, 2.77785268558399407f-2,
109109
1.73560257755821695f-3, 6.96166518788906424f-5, 1.89645733877137904f-6,
110110
4.29455004657565361f-8, 3.90565476357034480f-10, 1.48095934745267240f-11
111111
)
112-
const P1_i0(::Type{Float64}) = (
112+
const besseli0_small_coefs(::Type{Float64}) = (
113113
1.00000000000000000e0, 2.49999999999999909e-1, 2.77777777777782257e-2,
114114
1.73611111111023792e-3, 6.94444444453352521e-5, 1.92901234513219920e-6,
115115
3.93675991102510739e-8, 6.15118672704439289e-10, 7.59407002058973446e-12,
116116
7.59389793369836367e-14, 6.27767773636292611e-16, 4.34709704153272287e-18,
117117
2.63417742690109154e-20, 1.13943037744822825e-22, 9.07926920085624812e-25
118118
)
119-
const P2_i0(::Type{Float32}) = (
119+
const besseli0_med_coefs(::Type{Float32}) = (
120120
3.98942651588301770f-1, 4.98327234176892844f-2, 2.91866904423115499f-2,
121121
1.35614940793742178f-2, 1.31409251787866793f-1
122122
)
123-
const P2_i0(::Type{Float64}) = (
123+
const besseli0_med_coefs(::Type{Float64}) = (
124124
3.98942280401425088e-01, 4.98677850604961985e-02, 2.80506233928312623e-02,
125125
2.92211225166047873e-02, 4.44207299493659561e-02, 1.30970574605856719e-01,
126126
-3.35052280231727022e+00, 2.33025711583514727e+02, -1.13366350697172355e+04,
@@ -130,29 +130,29 @@ const P2_i0(::Type{Float64}) = (
130130
-8.13426467865659318e+14, 2.02391097391687777e+15, -3.08675715295370878e+15,
131131
2.17587543863819074e+15
132132
)
133-
const P3_i0(::Type{Float32}) = (
133+
const besseli0_large_coefs(::Type{Float32}) = (
134134
3.98942391532752700f-1, 4.98455950638200020f-2, 2.94835666900682535f-2
135135
)
136-
const P3_i0(::Type{Float64}) = (
136+
const besseli0_large_coefs(::Type{Float64}) = (
137137
3.98942280401432905e-01, 4.98677850491434560e-02, 2.80506308916506102e-02,
138138
2.92179096853915176e-02, 4.53371208762579442e-02
139139
)
140-
const P1_i1(::Type{Float32}) = (
140+
const besseli1_small_coefs(::Type{Float32}) = (
141141
8.333333221f-2, 6.944453712f-3, 3.472097211f-4, 1.158047174f-5,
142142
2.739745142f-7, 5.135884609f-9, 5.262251502f-11, 1.331933703f-12
143143
)
144-
const P2_i1(::Type{Float32}) = (
144+
const besseli1_med_coefs(::Type{Float32}) = (
145145
3.98942115977513013f-1, -1.49581264836620262f-1, -4.76475741878486795f-2,
146146
-2.65157315524784407f-2, -1.47148600683672014f-1
147147
)
148-
const P1_i1(::Type{Float64}) = (
148+
const besseli1_small_coefs(::Type{Float64}) = (
149149
8.333333333333333803e-02, 6.944444444444341983e-03, 3.472222222225921045e-04,
150150
1.157407407354987232e-05, 2.755731926254790268e-07, 4.920949692800671435e-09,
151151
6.834657311305621830e-11, 7.593969849687574339e-13, 6.904822652741917551e-15,
152152
5.220157095351373194e-17, 3.410720494727771276e-19, 1.625212890947171108e-21,
153153
1.332898928162290861e-23
154154
)
155-
const P2_i1(::Type{Float64}) = (
155+
const besseli1_med_coefs(::Type{Float64}) = (
156156
3.989422804014406054e-01, -1.496033551613111533e-01, -4.675104253598537322e-02,
157157
-4.090895951581637791e-02, -5.719036414430205390e-02, -1.528189554374492735e-01,
158158
3.458284470977172076e+00, -2.426181371595021021e+02, 1.178785865993440669e+04,
@@ -162,7 +162,7 @@ const P2_i1(::Type{Float64}) = (
162162
8.325554073334618015e+14, -2.067285045778906105e+15, 3.146401654361325073e+15,
163163
-2.213318202179221945e+15
164164
)
165-
const P3_i1(::Type{Float64}) = (
165+
const besseli1_large_coefs(::Type{Float64}) = (
166166
3.989422804014314820e-01, -1.496033551467584157e-01, -4.675105322571775911e-02,
167167
-4.090421597376992892e-02, -5.843630344778927582e-02
168168
)

0 commit comments

Comments
 (0)