File tree Expand file tree Collapse file tree 4 files changed +103
-45
lines changed Expand file tree Collapse file tree 4 files changed +103
-45
lines changed Original file line number Diff line number Diff line change 20
20
#
21
21
#
22
22
function besselj0 (x:: Float64 )
23
+ x = abs (x)
24
+ if iszero (x)
25
+ return one (x)
26
+ elseif isinf (x)
27
+ return zero (x)
28
+ end
29
+
23
30
if x <= 5.0
24
31
z = x * x
25
32
if x < 1.0e-5
78
85
79
86
80
87
function besselj0 (x:: Float32 )
81
- if x < 0.0f0
82
- x *= - 1
88
+ x = abs (x)
89
+ if iszero (x)
90
+ return one (x)
91
+ elseif isinf (x)
92
+ return zero (x)
83
93
end
84
94
85
95
if x <= 2.0f0
@@ -97,7 +107,7 @@ function besselj0(x::Float32)
97
107
p = (z - DR1) * evalpoly (z, JP)
98
108
return p
99
109
else
100
- q = 1.0f0 / x
110
+ q = inv (x)
101
111
w = sqrt (q)
102
112
103
113
MO = (
@@ -142,17 +152,22 @@ end
142
152
# Q0(x) = 1/x (-.125 + 1/x^2 R(1/x^2))
143
153
#
144
154
function besselj0 (x:: BigFloat )
145
- xx = abs (x)
146
- if iszero (xx)
147
- return one (BigFloat)
148
- elseif xx <= 2.0
149
- z = xx * xx
155
+ x = abs (x)
156
+ T = eltype (x)
157
+ if iszero (x)
158
+ return one (x)
159
+ elseif isinf (x)
160
+ return zero (x)
161
+ end
162
+
163
+ if x <= 2.0
164
+ z = x * x
150
165
p = z * z * evalpoly (z, J0_2N) / evalpoly (z, J0_2D)
151
166
p -= 0.25 * z
152
- p += 1.0
167
+ p += one (T)
153
168
return p
154
169
else
155
- xinv = 1.0 / xx
170
+ xinv = inv (x)
156
171
z = xinv * xinv
157
172
if xinv <= 0.25
158
173
if xinv <= 0.125
@@ -191,17 +206,17 @@ function besselj0(x::BigFloat)
191
206
p = 1.0 + z * p
192
207
q = z * xinv * q
193
208
q = q - 0.125 * xinv
194
- c = cos (xx )
195
- s = sin (xx )
209
+ c = cos (x )
210
+ s = sin (x )
196
211
ss = s - c
197
212
cc = s + c
198
- z = - cos (xx + xx )
213
+ z = - cos (x + x )
199
214
if (s * c) < 0
200
215
cc = z / ss;
201
216
else
202
217
ss = z / cc;
203
218
end
204
- z = ONEOSQPI (BigFloat ) * (p * cc - q * ss) / sqrt (xx )
219
+ z = ONEOSQPI (T ) * (p * cc - q * ss) / sqrt (x )
205
220
return z
206
221
end
207
222
end
Original file line number Diff line number Diff line change 1
1
function besselj1 (x:: Float32 )
2
- if x < zero (x)
3
- x = - x
2
+ x = abs (x)
3
+ if iszero (x)
4
+ return one (x)
5
+ elseif isinf (x)
6
+ return zero (x)
4
7
end
8
+
5
9
if x <= 2.0f0
6
10
z = x * x
7
11
Z1 = 1.46819706421238932572f1
@@ -19,15 +23,17 @@ function besselj1(x::Float32)
19
23
end
20
24
21
25
function besselj1 (x:: Float64 )
22
- w = x
23
- if x < 0
24
- w = - x
26
+ x = abs (x)
27
+ if iszero (x)
28
+ return one (x)
29
+ elseif isinf (x)
30
+ return zero (x)
25
31
end
26
32
27
- if w <= 5.0
33
+ if x <= 5.0
28
34
z = x * x
29
35
w = evalpoly (z, RP) / evalpoly (z, RQ)
30
- w = w * x * (z - 1.46819706421238932572E1 ) * (z - 4.92184563216946036703E1 )
36
+ w = w * x * (z - 1.46819706421238932572e1 ) * (z - 4.92184563216946036703e1 )
31
37
return w
32
38
else
33
39
w = 5.0 / x
@@ -41,10 +47,17 @@ function besselj1(x::Float64)
41
47
end
42
48
43
49
function bessely1 (x:: Float32 )
44
- if x <= 2.0f0
45
- if x <= zero (x)
46
- return error (" Domain error: x <= 0" )
50
+ if x <= zero (x)
51
+ if iszero (x)
52
+ return - Inf32
53
+ else
54
+ return throw (DomainError (x, " NaN result for non-NaN input." ))
47
55
end
56
+ elseif isinf (x)
57
+ return zero (x)
58
+ end
59
+
60
+ if x <= 2.0f0
48
61
z = x * x
49
62
YO1 = 4.66539330185668857532f0
50
63
w = (z - YO1) * x * evalpoly (z, YP32)
@@ -62,10 +75,17 @@ function bessely1(x::Float32)
62
75
end
63
76
64
77
function bessely1 (x:: Float64 )
65
- if x <= 5.0
66
- if x< 0.0
67
- return NaN
78
+ if x <= zero (x)
79
+ if iszero (x)
80
+ return - Inf64
81
+ else
82
+ return throw (DomainError (x, " NaN result for non-NaN input." ))
68
83
end
84
+ elseif isinf (x)
85
+ return zero (x)
86
+ end
87
+
88
+ if x <= 5.0
69
89
z = x * x
70
90
w = x * (evalpoly (z, YP) / evalpoly (z, YQ))
71
91
w += TWOOPI (Float64) * (besselj1 (x) * log (x) - inv (x))
Original file line number Diff line number Diff line change 21
21
# Ported to Julia in December 2021 by Michael Helton
22
22
#
23
23
function bessely0 (x:: Float64 )
24
- if x <= 5.0
25
- if x <= 0.0
26
- return NaN64
24
+ if x <= zero (x)
25
+ if iszero (x)
26
+ return - Inf64
27
+ else
28
+ return throw (DomainError (x, " NaN result for non-NaN input." ))
27
29
end
30
+ elseif isinf (x)
31
+ return zero (x)
32
+ end
33
+ if x <= 5.0
28
34
z = x * x
29
35
30
36
YP = (
78
84
79
85
80
86
function bessely0 (x:: Float32 )
81
- if x <= 2.0f0
82
- if x <= 0.0f0
83
- if x == 0.0f0
84
- return - Inf32
85
- end
86
- return NaN32
87
+ if x <= zero (x)
88
+ if iszero (x)
89
+ return - Inf32
90
+ else
91
+ return throw (DomainError (x, " NaN result for non-NaN input." ))
87
92
end
88
-
93
+ elseif isinf (x)
94
+ return zero (x)
95
+ end
96
+ if x <= 2.0f0
89
97
z = x * x
90
98
YZ1 = 0.43221455686510834878f0
91
99
YP = (
@@ -122,16 +130,16 @@ end
122
130
123
131
124
132
function bessely0 (x:: BigFloat )
125
- if isnan (x)
126
- return NaN
127
- elseif x < zero (x)
128
- return NaN
129
- elseif iszero (x )
130
- return - Inf
133
+ if x <= zero (x)
134
+ if iszero (x)
135
+ return - Inf
136
+ else
137
+ return throw ( DomainError (x, " NaN result for non-NaN input. " ) )
138
+ end
131
139
elseif isinf (x)
132
140
return zero (x)
133
141
end
134
-
142
+
135
143
xx = abs (x)
136
144
137
145
if xx <= 2.0
@@ -141,7 +149,7 @@ function bessely0(x::BigFloat)
141
149
return p
142
150
end
143
151
144
- xinv = 1.0 / xx
152
+ xinv = inv (xx)
145
153
z = xinv * xinv
146
154
if xinv <= 0.25
147
155
if xinv <= 0.125
Original file line number Diff line number Diff line change @@ -16,6 +16,14 @@ y0_big = bessely0.(big.(x))
16
16
17
17
@test isapprox (y0_big, y0_SpecialFunctions, atol= 1.5e-34 )
18
18
19
+ @test_throws DomainError bessely0 (- 1.0 )
20
+
21
+ @test bessely0 (zero (Float32)) == - Inf32
22
+ @test bessely0 (zero (Float64)) == - Inf64
23
+ @test bessely0 (zero (BigFloat)) == - Inf
24
+
25
+ @test bessely0 (Inf32 ) == zero (Float32)
26
+ @test bessely0 (Inf64 ) == zero (Float64)
19
27
20
28
y1_SpecialFunctions = SpecialFunctions. bessely1 .(big .(x))
21
29
@assert y1_SpecialFunctions[1 ] isa BigFloat
@@ -31,4 +39,11 @@ y1_32 = bessely1.(Float32.(x))
31
39
@test y1_64 ≈ y1_SpecialFunctions
32
40
@test y1_32 ≈ y1_SpecialFunctions
33
41
42
+ @test_throws DomainError bessely1 (- 1.0 )
43
+
44
+ @test bessely1 (zero (Float32)) == - Inf32
45
+ @test bessely1 (zero (Float64)) == - Inf64
46
+
47
+ @test bessely1 (Inf32 ) == zero (Float32)
48
+ @test bessely1 (Inf64 ) == zero (Float64)
34
49
You can’t perform that action at this time.
0 commit comments