test_powm1.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import pytest
  2. import numpy as np
  3. from numpy.testing import assert_allclose
  4. from scipy.special import powm1
  5. # Expected values were computed with mpmath, e.g.
  6. #
  7. # >>> import mpmath
  8. # >>> mpmath.np.dps = 200
  9. # >>> print(float(mpmath.powm1(2.0, 1e-7))
  10. # 6.931472045825965e-08
  11. #
  12. powm1_test_cases = [
  13. (1.25, 0.75, 0.18217701125396976, 1e-15),
  14. (2.0, 1e-7, 6.931472045825965e-08, 1e-15),
  15. (25.0, 5e-11, 1.6094379125636148e-10, 1e-15),
  16. (0.99996, 0.75, -3.0000150002530058e-05, 1e-15),
  17. (0.9999999999990905, 20, -1.81898940353014e-11, 1e-15),
  18. (-1.25, 751.0, -6.017550852453444e+72, 2e-15)
  19. ]
  20. @pytest.mark.parametrize('x, y, expected, rtol', powm1_test_cases)
  21. def test_powm1(x, y, expected, rtol):
  22. p = powm1(x, y)
  23. assert_allclose(p, expected, rtol=rtol)
  24. @pytest.mark.parametrize('x, y, expected',
  25. [(0.0, 0.0, 0.0),
  26. (0.0, -1.5, np.inf),
  27. (0.0, 1.75, -1.0),
  28. (-1.5, 2.0, 1.25),
  29. (-1.5, 3.0, -4.375),
  30. (np.nan, 0.0, 0.0),
  31. (1.0, np.nan, 0.0),
  32. (1.0, np.inf, 0.0),
  33. (1.0, -np.inf, 0.0),
  34. (np.inf, 7.5, np.inf),
  35. (np.inf, -7.5, -1.0),
  36. (3.25, np.inf, np.inf),
  37. (np.inf, np.inf, np.inf),
  38. (np.inf, -np.inf, -1.0),
  39. (np.inf, 0.0, 0.0),
  40. (-np.inf, 0.0, 0.0),
  41. (-np.inf, 2.0, np.inf),
  42. (-np.inf, 3.0, -np.inf),
  43. (-1.0, float(2**53 - 1), -2.0)])
  44. def test_powm1_exact_cases(x, y, expected):
  45. # Test cases where we have an exact expected value.
  46. p = powm1(x, y)
  47. assert p == expected
  48. @pytest.mark.parametrize('x, y',
  49. [(-1.25, 751.03),
  50. (-1.25, np.inf),
  51. (np.nan, np.nan),
  52. (-np.inf, -np.inf),
  53. (-np.inf, 2.5)])
  54. def test_powm1_return_nan(x, y):
  55. # Test cases where the expected return value is nan.
  56. p = powm1(x, y)
  57. assert np.isnan(p)