Skip to content

Commit a92884d

Browse files
committed
add neg numbers support
1 parent 74ad339 commit a92884d

File tree

2 files changed

+49
-26
lines changed

2 files changed

+49
-26
lines changed

src/besseli.jl

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ https://github.com/boostorg/math/tree/develop/include/boost/math/special_functio
1414

1515
function besseli0(x::T) where T <: Union{Float32, Float64}
1616
T == Float32 ? branch = 50 : branch = 500
17+
x = abs(x)
1718
if x < 7.75
1819
a = x * x / 4
1920
return muladd(a, evalpoly(a, P1_i0(T)), 1)
@@ -27,6 +28,7 @@ function besseli0(x::T) where T <: Union{Float32, Float64}
2728
end
2829
function besseli0x(x::T) where T <: Union{Float32, Float64}
2930
T == Float32 ? branch = 50 : branch = 500
31+
x = abs(x)
3032
if x < 7.75
3133
a = x * x / 4
3234
return muladd(a, evalpoly(a, P1_i0(T)), 1) * exp(-x)
@@ -38,49 +40,69 @@ function besseli0x(x::T) where T <: Union{Float32, Float64}
3840
end
3941
function besseli1(x::Float32)
4042
T = Float32
41-
if x < 7.75
42-
a = x * x / 4
43+
z = abs(x)
44+
if z < 7.75
45+
a = z * z / 4
4346
inner = (one(T), T(0.5), evalpoly(a, P1_i1(T)))
44-
return x * evalpoly(a, inner) / 2
47+
z = z * evalpoly(a, inner) / 2
4548
else
46-
a = exp(x / 2)
47-
s = a * evalpoly(inv(x), P2_i1(T)) / sqrt(x)
48-
return a * s
49+
a = exp(z / 2)
50+
s = a * evalpoly(inv(z), P2_i1(T)) / sqrt(z)
51+
z = a * s
4952
end
53+
if x < zero(x)
54+
z = -z
55+
end
56+
return z
5057
end
5158
function besseli1(x::Float64)
5259
T = Float64
53-
if x < 7.75
54-
a = x * x / 4
60+
z = abs(x)
61+
if z < 7.75
62+
a = z * z / 4
5563
inner = (one(T), T(0.5), evalpoly(a, P1_i1(T)))
56-
return x * evalpoly(a, inner) / 2
57-
elseif x < 500
58-
return exp(x) * evalpoly(inv(x), P2_i1(T)) / sqrt(x)
64+
z = z * evalpoly(a, inner) / 2
65+
elseif z < 500
66+
return exp(z) * evalpoly(inv(z), P2_i1(T)) / sqrt(z)
5967
else
60-
a = exp(x / 2)
61-
s = a * evalpoly(inv(x), P3_i1(T)) / sqrt(x)
62-
return a * s
68+
a = exp(z / 2)
69+
s = a * evalpoly(inv(z), P3_i1(T)) / sqrt(z)
70+
z = a * s
71+
end
72+
if x < zero(x)
73+
z = -z
6374
end
75+
return z
6476
end
6577
function besseli1x(x::Float32)
6678
T = Float32
67-
if x < 7.75
68-
a = x * x / 4
79+
z = abs(x)
80+
if z < 7.75
81+
a = z * z / 4
6982
inner = (one(T), T(0.5), evalpoly(a, P1_i1(T)))
70-
return x * evalpoly(a, inner) / 2 * exp(-x)
83+
z = z * evalpoly(a, inner) / 2 * exp(-z)
7184
else
72-
return evalpoly(inv(x), P2_i1(T)) / sqrt(x)
85+
z = evalpoly(inv(z), P2_i1(T)) / sqrt(z)
7386
end
87+
if x < zero(x)
88+
z = -z
89+
end
90+
return z
7491
end
7592
function besseli1x(x::Float64)
7693
T = Float64
77-
if x < 7.75
78-
a = x * x / 4
94+
z = abs(x)
95+
if z < 7.75
96+
a = z * z / 4
7997
inner = (one(T), T(0.5), evalpoly(a, P1_i1(T)))
80-
return x * evalpoly(a, inner) / 2 * exp(-x)
81-
elseif x < 500
82-
return evalpoly(inv(x), P2_i1(T)) / sqrt(x)
98+
z = z * evalpoly(a, inner) / 2 * exp(-z)
99+
elseif z < 500
100+
z = evalpoly(inv(z), P2_i1(T)) / sqrt(z)
83101
else
84-
return evalpoly(inv(x), P3_i1(T)) / sqrt(x)
102+
z = evalpoly(inv(z), P3_i1(T)) / sqrt(z)
103+
end
104+
if x < zero(x)
105+
z = -z
85106
end
107+
return z
86108
end

test/besseli_test.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# general array for testing input to SpecialFunctions.jl
2-
x32 = 1e-6:0.01:60.0
3-
x64 = 1e-6:0.01:600.0
2+
x32 = [-1.0; 0.0; 1e-6; 0.01:0.01:60.0]
3+
x64 = [-1.0; 0.0; 1e-6; 0.01:0.01:600.0]
4+
45
### Tests for besseli0
56
i032_SpecialFunctions = SpecialFunctions.besseli.(0, x32)
67
i064_SpecialFunctions = SpecialFunctions.besseli.(0, x64)

0 commit comments

Comments
 (0)