]> granicus.if.org Git - python/commitdiff
Issue #23185: add math.inf and math.nan constants.
authorMark Dickinson <dickinsm@gmail.com>
Sun, 11 Jan 2015 11:55:29 +0000 (11:55 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sun, 11 Jan 2015 11:55:29 +0000 (11:55 +0000)
Doc/library/math.rst
Doc/whatsnew/3.5.rst
Lib/test/test_math.py
Misc/NEWS
Modules/mathmodule.c

index 3c4167209540fded656f894ef6e012b91f3eafe4..eda0056fc94ff8ffae6e567f7677a1fceba7fdf4 100644 (file)
@@ -383,6 +383,22 @@ Constants
    The mathematical constant e = 2.718281..., to available precision.
 
 
+.. data:: inf
+
+   A floating-point positive infinity.  (For negative infinity, use
+   ``-math.inf``.)  Equivalent to the output of ``float('inf')``.
+
+   .. versionadded:: 3.5
+
+
+.. data:: nan
+
+   A floating-point "not a number" (NaN) value.  Equivalent to the output of
+   ``float('nan')``.
+
+   .. versionadded:: 3.5
+
+
 .. impl-detail::
 
    The :mod:`math` module consists mostly of thin wrappers around the platform C
index f3cc514417cba00aed9722edd9c16155a7960dec..bea6a8a0c419ae9d48ecea893095222d0cd7d50f 100644 (file)
@@ -243,6 +243,12 @@ re
 * Now unmatched groups are replaced with empty strings in :func:`re.sub`
   and :func:`re.subn`.  (Contributed by Serhiy Storchaka in :issue:`1519638`.)
 
+math
+----
+
+* :data:`math.inf` and :data:`math.nan` constants added.  (Contributed by Mark
+  Dickinson in :issue:`23185`.)
+
 shutil
 ------
 
index c9f3f16128655b2ff575f9eddda2d1df068c7f77..023dea94654a769dce38205b2cab1a2424cc6427 100644 (file)
@@ -983,6 +983,17 @@ class MathTests(unittest.TestCase):
         self.assertFalse(math.isinf(0.))
         self.assertFalse(math.isinf(1.))
 
+    @requires_IEEE_754
+    def test_nan_constant(self):
+        self.assertTrue(math.isnan(math.nan))
+
+    @requires_IEEE_754
+    def test_inf_constant(self):
+        self.assertTrue(math.isinf(math.inf))
+        self.assertGreater(math.inf, 0.0)
+        self.assertEqual(math.inf, float("inf"))
+        self.assertEqual(-math.inf, float("-inf"))
+
     # RED_FLAG 16-Oct-2000 Tim
     # While 2.0 is more consistent about exceptions than previous releases, it
     # still fails this part of the test on some platforms.  For now, we only
index 5f550d2a09981d306b3e60ebdb5ab6609f0e73af..9a10abff6a9496aa1f1ae782d37649b5a93a8244 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -203,6 +203,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #23185: Add math.inf and math.nan constants.
+
 - Issue #23186: Add ssl.SSLObject.shared_ciphers() and
   ssl.SSLSocket.shared_ciphers() to fetch the client's list ciphers sent at
   handshake.
index bce3799ced2daacc17dd8048fd322686f119d368..0c991cd229312aed1e7334d732d72d53e86adeb8 100644 (file)
@@ -223,6 +223,35 @@ lanczos_sum(double x)
     return num/den;
 }
 
+/* Constant for +infinity, generated in the same way as float('inf'). */
+
+static double
+m_inf(void)
+{
+#ifndef PY_NO_SHORT_FLOAT_REPR
+    return _Py_dg_infinity(0);
+#else
+    return Py_HUGE_VAL;
+#endif
+}
+
+/* Constant nan value, generated in the same way as float('nan'). */
+/* We don't currently assume that Py_NAN is defined everywhere. */
+
+#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
+}
+
+#endif
+
 static double
 m_tgamma(double x)
 {
@@ -2009,7 +2038,11 @@ PyInit_math(void)
 
     PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI));
     PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
+    PyModule_AddObject(m, "inf", PyFloat_FromDouble(m_inf()));
+#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN)
+    PyModule_AddObject(m, "nan", PyFloat_FromDouble(m_nan()));
+#endif
 
-    finally:
+  finally:
     return m;
 }