@@ -14,6 +14,7 @@ https://github.com/boostorg/math/tree/develop/include/boost/math/special_functio
14
14
15
15
function besseli0 (x:: T ) where T <: Union{Float32, Float64}
16
16
T == Float32 ? branch = 50 : branch = 500
17
+ x = abs (x)
17
18
if x < 7.75
18
19
a = x * x / 4
19
20
return muladd (a, evalpoly (a, P1_i0 (T)), 1 )
@@ -27,6 +28,7 @@ function besseli0(x::T) where T <: Union{Float32, Float64}
27
28
end
28
29
function besseli0x (x:: T ) where T <: Union{Float32, Float64}
29
30
T == Float32 ? branch = 50 : branch = 500
31
+ x = abs (x)
30
32
if x < 7.75
31
33
a = x * x / 4
32
34
return muladd (a, evalpoly (a, P1_i0 (T)), 1 ) * exp (- x)
@@ -38,49 +40,69 @@ function besseli0x(x::T) where T <: Union{Float32, Float64}
38
40
end
39
41
function besseli1 (x:: Float32 )
40
42
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
43
46
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
45
48
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
49
52
end
53
+ if x < zero (x)
54
+ z = - z
55
+ end
56
+ return z
50
57
end
51
58
function besseli1 (x:: Float64 )
52
59
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
55
63
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 )
59
67
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
63
74
end
75
+ return z
64
76
end
65
77
function besseli1x (x:: Float32 )
66
78
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
69
82
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 )
71
84
else
72
- return evalpoly (inv (x ), P2_i1 (T)) / sqrt (x )
85
+ z = evalpoly (inv (z ), P2_i1 (T)) / sqrt (z )
73
86
end
87
+ if x < zero (x)
88
+ z = - z
89
+ end
90
+ return z
74
91
end
75
92
function besseli1x (x:: Float64 )
76
93
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
79
97
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 )
83
101
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
85
106
end
107
+ return z
86
108
end
0 commit comments