73 lines
2.3 KiB
Python
73 lines
2.3 KiB
Python
|
import pytest
|
||
|
import numpy as np
|
||
|
from numpy.testing import assert_equal, assert_allclose, suppress_warnings
|
||
|
|
||
|
from scipy.special._ufuncs import _sinpi as sinpi
|
||
|
from scipy.special._ufuncs import _cospi as cospi
|
||
|
|
||
|
|
||
|
def test_integer_real_part():
|
||
|
x = np.arange(-100, 101)
|
||
|
y = np.hstack((-np.linspace(310, -30, 10), np.linspace(-30, 310, 10)))
|
||
|
x, y = np.meshgrid(x, y)
|
||
|
z = x + 1j*y
|
||
|
# In the following we should be *exactly* right
|
||
|
res = sinpi(z)
|
||
|
assert_equal(res.real, 0.0)
|
||
|
res = cospi(z)
|
||
|
assert_equal(res.imag, 0.0)
|
||
|
|
||
|
|
||
|
def test_half_integer_real_part():
|
||
|
x = np.arange(-100, 101) + 0.5
|
||
|
y = np.hstack((-np.linspace(310, -30, 10), np.linspace(-30, 310, 10)))
|
||
|
x, y = np.meshgrid(x, y)
|
||
|
z = x + 1j*y
|
||
|
# In the following we should be *exactly* right
|
||
|
res = sinpi(z)
|
||
|
assert_equal(res.imag, 0.0)
|
||
|
res = cospi(z)
|
||
|
assert_equal(res.real, 0.0)
|
||
|
|
||
|
|
||
|
@pytest.mark.skip("Temporary skip while gh-19526 is being resolved")
|
||
|
def test_intermediate_overlow():
|
||
|
# Make sure we avoid overflow in situations where cosh/sinh would
|
||
|
# overflow but the product with sin/cos would not
|
||
|
sinpi_pts = [complex(1 + 1e-14, 227),
|
||
|
complex(1e-35, 250),
|
||
|
complex(1e-301, 445)]
|
||
|
# Data generated with mpmath
|
||
|
sinpi_std = [complex(-8.113438309924894e+295, -np.inf),
|
||
|
complex(1.9507801934611995e+306, np.inf),
|
||
|
complex(2.205958493464539e+306, np.inf)]
|
||
|
with suppress_warnings() as sup:
|
||
|
sup.filter(RuntimeWarning, "invalid value encountered in multiply")
|
||
|
for p, std in zip(sinpi_pts, sinpi_std):
|
||
|
res = sinpi(p)
|
||
|
assert_allclose(res.real, std.real)
|
||
|
assert_allclose(res.imag, std.imag)
|
||
|
|
||
|
# Test for cosine, less interesting because cos(0) = 1.
|
||
|
p = complex(0.5 + 1e-14, 227)
|
||
|
std = complex(-8.113438309924894e+295, -np.inf)
|
||
|
with suppress_warnings() as sup:
|
||
|
sup.filter(RuntimeWarning, "invalid value encountered in multiply")
|
||
|
res = cospi(p)
|
||
|
assert_allclose(res.real, std.real)
|
||
|
assert_allclose(res.imag, std.imag)
|
||
|
|
||
|
|
||
|
def test_zero_sign():
|
||
|
y = sinpi(-0.0)
|
||
|
assert y == 0.0
|
||
|
assert np.signbit(y)
|
||
|
|
||
|
y = sinpi(0.0)
|
||
|
assert y == 0.0
|
||
|
assert not np.signbit(y)
|
||
|
|
||
|
y = cospi(0.5)
|
||
|
assert y == 0.0
|
||
|
assert not np.signbit(y)
|