43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Tests for a few of the "double-double" C++ functions defined in
 | |
| # special/cephes/dd_real.h. Prior to gh-20390 which translated these
 | |
| # functions from C to C++, there were test cases for _dd_expm1. It
 | |
| # was determined that this function is not used anywhere internally
 | |
| # in SciPy, so this function was not translated.
 | |
| 
 | |
| 
 | |
| import pytest
 | |
| from numpy.testing import assert_allclose
 | |
| from scipy.special._test_internal import _dd_exp, _dd_log
 | |
| 
 | |
| 
 | |
| # Each tuple in test_data contains:
 | |
| #   (dd_func, xhi, xlo, expected_yhi, expected_ylo)
 | |
| # The expected values were computed with mpmath, e.g.
 | |
| #
 | |
| #   import mpmath
 | |
| #   mpmath.mp.dps = 100
 | |
| #   xhi = 10.0
 | |
| #   xlo = 0.0
 | |
| #   x = mpmath.mpf(xhi) + mpmath.mpf(xlo)
 | |
| #   y = mpmath.log(x)
 | |
| #   expected_yhi = float(y)
 | |
| #   expected_ylo = float(y - expected_yhi)
 | |
| #
 | |
| test_data = [
 | |
|     (_dd_exp, -0.3333333333333333, -1.850371707708594e-17,
 | |
|      0.7165313105737893, -2.0286948382455594e-17),
 | |
|     (_dd_exp, 0.0, 0.0, 1.0, 0.0),
 | |
|     (_dd_exp, 10.0, 0.0, 22026.465794806718, -1.3780134700517372e-12),
 | |
|     (_dd_log, 0.03125, 0.0, -3.4657359027997265, -4.930038229799327e-18),
 | |
|     (_dd_log, 10.0, 0.0, 2.302585092994046, -2.1707562233822494e-16),
 | |
| ]
 | |
| 
 | |
| 
 | |
| @pytest.mark.parametrize('dd_func, xhi, xlo, expected_yhi, expected_ylo',
 | |
|                          test_data)
 | |
| def test_dd(dd_func, xhi, xlo, expected_yhi, expected_ylo):
 | |
|     yhi, ylo = dd_func(xhi, xlo)
 | |
|     assert yhi == expected_yhi, (f"high double ({yhi}) does not equal the "
 | |
|                                  f"expected value {expected_yhi}")
 | |
|     assert_allclose(ylo, expected_ylo, rtol=5e-15)
 |