Py_complex cbesi_wrap_e( double v, Py_complex z) { int n = 1; int kode = 2; int sign = 1; int nz, ierr; Py_complex cy, cy_k; if (v < 0) { v = -v; sign = -1; } F_FUNC(zbesi,ZBESI)(CADDR(z), &v, &kode, &n, CADDR(cy), &nz, &ierr); DO_MTHERR("ive:", &cy); if (sign == -1) { if (!reflect_i(&cy, v)) { F_FUNC(zbesk,ZBESK)(CADDR(z), &v, &kode, &n, CADDR(cy_k), &nz, &ierr); DO_MTHERR("ive(kv):", &cy_k); /* adjust scaling to match zbesi */ cy_k = rotate(cy_k, -z.imag/NPY_PI); if (z.real > 0) { cy_k.real *= exp(-2*z.real); cy_k.imag *= exp(-2*z.real); } /* v -> -v */ cy = rotate_i(cy, cy_k, v); } } return cy; }
npy_cdouble cbesi_wrap( double v, npy_cdouble z) { int n = 1; int kode = 1; int sign = 1; int nz, ierr; npy_cdouble cy, cy_k; cy.real = NPY_NAN; cy.imag = NPY_NAN; cy_k.real = NPY_NAN; cy_k.imag = NPY_NAN; if (npy_isnan(v) || npy_isnan(z.real) || npy_isnan(z.imag)) { return cy; } if (v < 0) { v = -v; sign = -1; } F_FUNC(zbesi,ZBESI)(CADDR(z), &v, &kode, &n, CADDR(cy), &nz, &ierr); DO_SFERR("iv:", &cy); if (ierr == 2) { /* overflow */ if (z.imag == 0 && (z.real >= 0 || v == floor(v))) { if (z.real < 0 && v/2 != floor(v/2)) cy.real = -NPY_INFINITY; else cy.real = NPY_INFINITY; cy.imag = 0; } else { cy = cbesi_wrap_e(v*sign, z); cy.real *= NPY_INFINITY; cy.imag *= NPY_INFINITY; } } if (sign == -1) { if (!reflect_i(&cy, v)) { F_FUNC(zbesk,ZBESK)(CADDR(z), &v, &kode, &n, CADDR(cy_k), &nz, &ierr); DO_SFERR("iv(kv):", &cy_k); cy = rotate_i(cy, cy_k, v); } } return cy; }
npy_cdouble cbesi_wrap_e( double v, npy_cdouble z) { int n = 1; int kode = 2; int sign = 1; int nz, ierr; npy_cdouble cy, cy_k; cy.real = NPY_NAN; cy.imag = NPY_NAN; cy_k.real = NPY_NAN; cy_k.imag = NPY_NAN; if (npy_isnan(v) || npy_isnan(z.real) || npy_isnan(z.imag)) { return cy; } if (v < 0) { v = -v; sign = -1; } F_FUNC(zbesi,ZBESI)(CADDR(z), &v, &kode, &n, CADDR(cy), &nz, &ierr); DO_SFERR("ive:", &cy); if (sign == -1) { if (!reflect_i(&cy, v)) { F_FUNC(zbesk,ZBESK)(CADDR(z), &v, &kode, &n, CADDR(cy_k), &nz, &ierr); DO_SFERR("ive(kv):", &cy_k); /* adjust scaling to match zbesi */ cy_k = rotate(cy_k, -z.imag/NPY_PI); if (z.real > 0) { cy_k.real *= exp(-2*z.real); cy_k.imag *= exp(-2*z.real); } /* v -> -v */ cy = rotate_i(cy, cy_k, v); } } return cy; }