@@ -34,16 +34,11 @@ Translated to C++ by SciPy developers in 2024.
34
34
namespace xsf {
35
35
36
36
template <typename T>
37
- T sph_bessel_j (long n, T x) {
37
+ T sph_bessel_j (uint64_t n, T x) {
38
38
if (std::isnan (x)) {
39
39
return x;
40
40
}
41
41
42
- if (n < 0 ) {
43
- set_error (" spherical_jn" , SF_ERROR_DOMAIN, nullptr );
44
- return std::numeric_limits<T>::quiet_NaN ();
45
- }
46
-
47
42
if ((x == std::numeric_limits<T>::infinity ()) || (x == -std::numeric_limits<T>::infinity ())) {
48
43
return 0 ;
49
44
}
@@ -71,7 +66,7 @@ T sph_bessel_j(long n, T x) {
71
66
}
72
67
73
68
T sn;
74
- for (int i = 0 ; i < n - 1 ; ++i) {
69
+ for (uint64_t i = 0 ; i < n - 1 ; ++i) {
75
70
sn = (2 * i + 3 ) * s1 / x - s0;
76
71
s0 = s1;
77
72
s1 = sn;
@@ -85,16 +80,11 @@ T sph_bessel_j(long n, T x) {
85
80
}
86
81
87
82
template <typename T>
88
- std::complex<T> sph_bessel_j (long n, std::complex<T> z) {
83
+ std::complex<T> sph_bessel_j (uint64_t n, std::complex<T> z) {
89
84
if (std::isnan (std::real (z)) || std::isnan (std::imag (z))) {
90
85
return z;
91
86
}
92
87
93
- if (n < 0 ) {
94
- set_error (" spherical_jn" , SF_ERROR_DOMAIN, nullptr );
95
- return std::numeric_limits<T>::quiet_NaN ();
96
- }
97
-
98
88
if (std::real (z) == std::numeric_limits<T>::infinity () || std::real (z) == -std::numeric_limits<T>::infinity ()) {
99
89
// https://dlmf.nist.gov/10.52.E3
100
90
if (std::imag (z) == 0 ) {
@@ -121,7 +111,7 @@ std::complex<T> sph_bessel_j(long n, std::complex<T> z) {
121
111
}
122
112
123
113
template <typename T>
124
- T sph_bessel_j_jac (long n, T z) {
114
+ T sph_bessel_j_jac (uint64_t n, T z) {
125
115
if (n == 0 ) {
126
116
return -sph_bessel_j (1 , z);
127
117
}
@@ -136,25 +126,20 @@ T sph_bessel_j_jac(long n, T z) {
136
126
}
137
127
138
128
// DLMF 10.51.2
139
- return sph_bessel_j (n - 1 , z) - static_cast <T>(n + 1 ) * sph_bessel_j (n, z) / z;
129
+ return sph_bessel_j (n - 1 , z) - ( static_cast <T>(n) + 1 ) * sph_bessel_j (n, z) / z;
140
130
}
141
131
142
132
template <typename T>
143
- T sph_bessel_y (long n, T x) {
133
+ T sph_bessel_y (uint64_t n, T x) {
144
134
T s0, s1, sn;
145
- int idx;
135
+ uint64_t idx;
146
136
147
137
if (std::isnan (x)) {
148
138
return x;
149
139
}
150
140
151
- if (n < 0 ) {
152
- set_error (" spherical_yn" , SF_ERROR_DOMAIN, nullptr );
153
- return std::numeric_limits<T>::quiet_NaN ();
154
- }
155
-
156
141
if (x < 0 ) {
157
- return std::pow (- 1 , n + 1 ) * sph_bessel_y (n, -x);
142
+ return n % 2 == 0 ? - sph_bessel_y (n, -x) : sph_bessel_y (n, -x);
158
143
}
159
144
160
145
if (x == std::numeric_limits<T>::infinity () || x == -std::numeric_limits<T>::infinity ()) {
@@ -188,19 +173,14 @@ T sph_bessel_y(long n, T x) {
188
173
return sn;
189
174
}
190
175
191
- inline float sph_bessel_y (long n, float x) { return sph_bessel_y (n, static_cast <double >(x)); }
176
+ inline float sph_bessel_y (uint64_t n, float x) { return sph_bessel_y (n, static_cast <double >(x)); }
192
177
193
178
template <typename T>
194
- std::complex<T> sph_bessel_y (long n, std::complex<T> z) {
179
+ std::complex<T> sph_bessel_y (uint64_t n, std::complex<T> z) {
195
180
if (std::isnan (std::real (z)) || std::isnan (std::imag (z))) {
196
181
return z;
197
182
}
198
183
199
- if (n < 0 ) {
200
- set_error (" spherical_yn" , SF_ERROR_DOMAIN, nullptr );
201
- return std::numeric_limits<T>::quiet_NaN ();
202
- }
203
-
204
184
if (std::real (z) == 0 && std::imag (z) == 0 ) {
205
185
// https://dlmf.nist.gov/10.52.E2
206
186
return std::numeric_limits<T>::quiet_NaN ();
@@ -219,25 +199,20 @@ std::complex<T> sph_bessel_y(long n, std::complex<T> z) {
219
199
}
220
200
221
201
template <typename T>
222
- T sph_bessel_y_jac (long n, T x) {
202
+ T sph_bessel_y_jac (uint64_t n, T x) {
223
203
if (n == 0 ) {
224
204
return -sph_bessel_y (1 , x);
225
205
}
226
206
227
- return sph_bessel_y (n - 1 , x) - static_cast <T>(n + 1 ) * sph_bessel_y (n, x) / x;
207
+ return sph_bessel_y (n - 1 , x) - ( static_cast <T>(n) + 1 ) * sph_bessel_y (n, x) / x;
228
208
}
229
209
230
210
template <typename T>
231
- T sph_bessel_i (long n, T x) {
211
+ T sph_bessel_i (uint64_t n, T x) {
232
212
if (std::isnan (x)) {
233
213
return x;
234
214
}
235
215
236
- if (n < 0 ) {
237
- set_error (" spherical_in" , SF_ERROR_DOMAIN, nullptr );
238
- return std::numeric_limits<T>::quiet_NaN ();
239
- }
240
-
241
216
if (x == 0 ) {
242
217
// https://dlmf.nist.gov/10.52.E1
243
218
if (n == 0 ) {
@@ -249,7 +224,7 @@ T sph_bessel_i(long n, T x) {
249
224
if (std::isinf (x)) {
250
225
// https://dlmf.nist.gov/10.49.E8
251
226
if (x == -std::numeric_limits<T>::infinity ()) {
252
- return std::pow (- 1 , n) * std::numeric_limits<T>::infinity ();
227
+ return n % 2 == 0 ? std::numeric_limits<T>:: infinity () : - std::numeric_limits<T>::infinity ();
253
228
}
254
229
255
230
return std::numeric_limits<T>::infinity ();
@@ -259,16 +234,11 @@ T sph_bessel_i(long n, T x) {
259
234
}
260
235
261
236
template <typename T>
262
- std::complex<T> sph_bessel_i (long n, std::complex<T> z) {
237
+ std::complex<T> sph_bessel_i (uint64_t n, std::complex<T> z) {
263
238
if (std::isnan (std::real (z)) || std::isnan (std::imag (z))) {
264
239
return z;
265
240
}
266
241
267
- if (n < 0 ) {
268
- set_error (" spherical_in" , SF_ERROR_DOMAIN, nullptr );
269
- return std::numeric_limits<T>::quiet_NaN ();
270
- }
271
-
272
242
if (std::abs (z) == 0 ) {
273
243
// https://dlmf.nist.gov/10.52.E1
274
244
if (n == 0 ) {
@@ -282,7 +252,7 @@ std::complex<T> sph_bessel_i(long n, std::complex<T> z) {
282
252
// https://dlmf.nist.gov/10.52.E5
283
253
if (std::imag (z) == 0 ) {
284
254
if (std::real (z) == -std::numeric_limits<T>::infinity ()) {
285
- return std::pow (- 1 , n) * std::numeric_limits<T>::infinity ();
255
+ return n % 2 == 0 ? std::numeric_limits<T>:: infinity () : - std::numeric_limits<T>::infinity ();
286
256
}
287
257
288
258
return std::numeric_limits<T>::infinity ();
@@ -295,7 +265,7 @@ std::complex<T> sph_bessel_i(long n, std::complex<T> z) {
295
265
}
296
266
297
267
template <typename T>
298
- T sph_bessel_i_jac (long n, T z) {
268
+ T sph_bessel_i_jac (uint64_t n, T z) {
299
269
if (n == 0 ) {
300
270
return sph_bessel_i (1 , z);
301
271
}
@@ -308,20 +278,15 @@ T sph_bessel_i_jac(long n, T z) {
308
278
}
309
279
}
310
280
311
- return sph_bessel_i (n - 1 , z) - static_cast <T>(n + 1 ) * sph_bessel_i (n, z) / z;
281
+ return sph_bessel_i (n - 1 , z) - ( static_cast <T>(n) + 1 ) * sph_bessel_i (n, z) / z;
312
282
}
313
283
314
284
template <typename T>
315
- T sph_bessel_k (long n, T z) {
285
+ T sph_bessel_k (uint64_t n, T z) {
316
286
if (std::isnan (z)) {
317
287
return z;
318
288
}
319
289
320
- if (n < 0 ) {
321
- set_error (" spherical_kn" , SF_ERROR_DOMAIN, nullptr );
322
- return std::numeric_limits<T>::quiet_NaN ();
323
- }
324
-
325
290
if (z == 0 ) {
326
291
return std::numeric_limits<T>::infinity ();
327
292
}
@@ -339,16 +304,11 @@ T sph_bessel_k(long n, T z) {
339
304
}
340
305
341
306
template <typename T>
342
- std::complex<T> sph_bessel_k (long n, std::complex<T> z) {
307
+ std::complex<T> sph_bessel_k (uint64_t n, std::complex<T> z) {
343
308
if (std::isnan (std::real (z)) || std::isnan (std::imag (z))) {
344
309
return z;
345
310
}
346
311
347
- if (n < 0 ) {
348
- set_error (" spherical_kn" , SF_ERROR_DOMAIN, nullptr );
349
- return std::numeric_limits<T>::quiet_NaN ();
350
- }
351
-
352
312
if (std::abs (z) == 0 ) {
353
313
return std::numeric_limits<T>::quiet_NaN ();
354
314
}
@@ -370,12 +330,12 @@ std::complex<T> sph_bessel_k(long n, std::complex<T> z) {
370
330
}
371
331
372
332
template <typename T>
373
- T sph_bessel_k_jac (long n, T x) {
333
+ T sph_bessel_k_jac (uint64_t n, T x) {
374
334
if (n == 0 ) {
375
335
return -sph_bessel_k (1 , x);
376
336
}
377
337
378
- return -sph_bessel_k (n - 1 , x) - static_cast <T>(n + 1 ) * sph_bessel_k (n, x) / x;
338
+ return -sph_bessel_k (n - 1 , x) - ( static_cast <T>(n) + 1 ) * sph_bessel_k (n, x) / x;
379
339
}
380
340
381
341
} // namespace xsf
0 commit comments