mirror of https://github.com/python/cpython
Merge heads
This commit is contained in:
commit
2be278c70c
|
@ -259,6 +259,34 @@ Constants
|
||||||
|
|
||||||
.. versionadded:: 3.6
|
.. versionadded:: 3.6
|
||||||
|
|
||||||
|
.. data:: inf
|
||||||
|
|
||||||
|
Floating-point positive infinity. Equivalent to ``float('inf')``.
|
||||||
|
|
||||||
|
.. versionadded:: 3.6
|
||||||
|
|
||||||
|
.. data:: infj
|
||||||
|
|
||||||
|
Complex number with zero real part and positive infinity imaginary
|
||||||
|
part. Equivalent to ``complex(0.0, float('inf'))``.
|
||||||
|
|
||||||
|
.. versionadded:: 3.6
|
||||||
|
|
||||||
|
.. data:: nan
|
||||||
|
|
||||||
|
A floating-point "not a number" (NaN) value. Equivalent to
|
||||||
|
``float('nan')``.
|
||||||
|
|
||||||
|
.. versionadded:: 3.6
|
||||||
|
|
||||||
|
.. data:: nanj
|
||||||
|
|
||||||
|
Complex number with zero real part and NaN imaginary part. Equivalent to
|
||||||
|
``complex(0.0, float('nan'))``.
|
||||||
|
|
||||||
|
.. versionadded:: 3.6
|
||||||
|
|
||||||
|
|
||||||
.. index:: module: math
|
.. index:: module: math
|
||||||
|
|
||||||
Note that the selection of functions is similar, but not identical, to that in
|
Note that the selection of functions is similar, but not identical, to that in
|
||||||
|
|
|
@ -154,6 +154,23 @@ class CMathTests(unittest.TestCase):
|
||||||
self.assertAlmostEqual(cmath.e, e_expected, places=9,
|
self.assertAlmostEqual(cmath.e, e_expected, places=9,
|
||||||
msg="cmath.e is {}; should be {}".format(cmath.e, e_expected))
|
msg="cmath.e is {}; should be {}".format(cmath.e, e_expected))
|
||||||
|
|
||||||
|
def test_infinity_and_nan_constants(self):
|
||||||
|
self.assertEqual(cmath.inf.real, math.inf)
|
||||||
|
self.assertEqual(cmath.inf.imag, 0.0)
|
||||||
|
self.assertEqual(cmath.infj.real, 0.0)
|
||||||
|
self.assertEqual(cmath.infj.imag, math.inf)
|
||||||
|
|
||||||
|
self.assertTrue(math.isnan(cmath.nan.real))
|
||||||
|
self.assertEqual(cmath.nan.imag, 0.0)
|
||||||
|
self.assertEqual(cmath.nanj.real, 0.0)
|
||||||
|
self.assertTrue(math.isnan(cmath.nanj.imag))
|
||||||
|
|
||||||
|
# Check consistency with reprs.
|
||||||
|
self.assertEqual(repr(cmath.inf), "inf")
|
||||||
|
self.assertEqual(repr(cmath.infj), "infj")
|
||||||
|
self.assertEqual(repr(cmath.nan), "nan")
|
||||||
|
self.assertEqual(repr(cmath.nanj), "nanj")
|
||||||
|
|
||||||
def test_user_object(self):
|
def test_user_object(self):
|
||||||
# Test automatic calling of __complex__ and __float__ by cmath
|
# Test automatic calling of __complex__ and __float__ by cmath
|
||||||
# functions
|
# functions
|
||||||
|
|
|
@ -49,6 +49,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #23229: Add new ``cmath`` constants: ``cmath.inf`` and ``cmath.nan`` to
|
||||||
|
match ``math.inf`` and ``math.nan``, and also ``cmath.infj`` and
|
||||||
|
``cmath.nanj`` to match the format used by complex repr.
|
||||||
|
|
||||||
- Issue #27861: Fixed a crash in sqlite3.Connection.cursor() when a factory
|
- Issue #27861: Fixed a crash in sqlite3.Connection.cursor() when a factory
|
||||||
creates not a cursor. Patch by Xiang Zhang.
|
creates not a cursor. Patch by Xiang Zhang.
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,54 @@ else {
|
||||||
#endif
|
#endif
|
||||||
#define CM_SCALE_DOWN (-(CM_SCALE_UP+1)/2)
|
#define CM_SCALE_DOWN (-(CM_SCALE_UP+1)/2)
|
||||||
|
|
||||||
|
/* Constants cmath.inf, cmath.infj, cmath.nan, cmath.nanj.
|
||||||
|
cmath.nan and cmath.nanj are defined only when either
|
||||||
|
PY_NO_SHORT_FLOAT_REPR is *not* defined (which should be
|
||||||
|
the most common situation on machines using an IEEE 754
|
||||||
|
representation), or Py_NAN is defined. */
|
||||||
|
|
||||||
|
static double
|
||||||
|
m_inf(void)
|
||||||
|
{
|
||||||
|
#ifndef PY_NO_SHORT_FLOAT_REPR
|
||||||
|
return _Py_dg_infinity(0);
|
||||||
|
#else
|
||||||
|
return Py_HUGE_VAL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static Py_complex
|
||||||
|
c_infj(void)
|
||||||
|
{
|
||||||
|
Py_complex r;
|
||||||
|
r.real = 0.0;
|
||||||
|
r.imag = m_inf();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN)
|
||||||
|
|
||||||
|
static double
|
||||||
|
m_nan(void)
|
||||||
|
{
|
||||||
|
#ifndef PY_NO_SHORT_FLOAT_REPR
|
||||||
|
return _Py_dg_stdnan(0);
|
||||||
|
#else
|
||||||
|
return Py_NAN;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static Py_complex
|
||||||
|
c_nanj(void)
|
||||||
|
{
|
||||||
|
Py_complex r;
|
||||||
|
r.real = 0.0;
|
||||||
|
r.imag = m_nan();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* forward declarations */
|
/* forward declarations */
|
||||||
static Py_complex cmath_asinh_impl(PyObject *, Py_complex);
|
static Py_complex cmath_asinh_impl(PyObject *, Py_complex);
|
||||||
static Py_complex cmath_atanh_impl(PyObject *, Py_complex);
|
static Py_complex cmath_atanh_impl(PyObject *, Py_complex);
|
||||||
|
@ -1240,6 +1288,12 @@ PyInit_cmath(void)
|
||||||
PyFloat_FromDouble(Py_MATH_PI));
|
PyFloat_FromDouble(Py_MATH_PI));
|
||||||
PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
|
PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
|
||||||
PyModule_AddObject(m, "tau", PyFloat_FromDouble(Py_MATH_TAU)); /* 2pi */
|
PyModule_AddObject(m, "tau", PyFloat_FromDouble(Py_MATH_TAU)); /* 2pi */
|
||||||
|
PyModule_AddObject(m, "inf", PyFloat_FromDouble(m_inf()));
|
||||||
|
PyModule_AddObject(m, "infj", PyComplex_FromCComplex(c_infj()));
|
||||||
|
#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN)
|
||||||
|
PyModule_AddObject(m, "nan", PyFloat_FromDouble(m_nan()));
|
||||||
|
PyModule_AddObject(m, "nanj", PyComplex_FromCComplex(c_nanj()));
|
||||||
|
#endif
|
||||||
|
|
||||||
/* initialize special value tables */
|
/* initialize special value tables */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue