summaryrefslogtreecommitdiff
path: root/Modules
diff options
context:
space:
mode:
authorSebastian Berg <sebastianb@nvidia.com>2023-05-10 18:44:52 +0200
committerGitHub <noreply@github.com>2023-05-10 17:44:52 +0100
commit7a3b03509e5e3e72d8c47137579cccb52548a318 (patch)
treecbb1adddb46665552cb1e93ccae135aac0507e80 /Modules
parenta7a2dbbf72aceef61bfb50901bfa39bfb8d6d229 (diff)
downloadcpython-git-7a3b03509e5e3e72d8c47137579cccb52548a318.tar.gz
gh-104263: Rely on Py_NAN and introduce Py_INFINITY (GH-104202)
This PR removes `_Py_dg_stdnan` and `_Py_dg_infinity` in favour of using the standard `NAN` and `INFINITY` macros provided by C99. This change has the side-effect of fixing a bug on MIPS where the hard-coded value used by `_Py_dg_stdnan` gave a signalling NaN rather than a quiet NaN. --------- Co-authored-by: Mark Dickinson <dickinsm@gmail.com>
Diffstat (limited to 'Modules')
-rw-r--r--Modules/cmathmodule.c61
-rw-r--r--Modules/mathmodule.c39
2 files changed, 10 insertions, 90 deletions
diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c
index 914a697f8e..1a31bdc824 100644
--- a/Modules/cmathmodule.c
+++ b/Modules/cmathmodule.c
@@ -8,7 +8,6 @@
#include "Python.h"
#include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR
-#include "pycore_dtoa.h" // _Py_dg_stdnan()
/* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from
float.h. We assume that FLT_RADIX is either 2 or 16. */
#include <float.h>
@@ -88,53 +87,6 @@ else {
#endif
#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_SHORT_FLOAT_REPR is 1 (which should be
- the most common situation on machines using an IEEE 754
- representation), or Py_NAN is defined. */
-
-static double
-m_inf(void)
-{
-#if _PY_SHORT_FLOAT_REPR == 1
- 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 _PY_SHORT_FLOAT_REPR == 1
-
-static double
-m_nan(void)
-{
-#if _PY_SHORT_FLOAT_REPR == 1
- 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 */
static Py_complex cmath_asinh_impl(PyObject *, Py_complex);
@@ -1274,23 +1226,22 @@ cmath_exec(PyObject *mod)
if (PyModule_AddObject(mod, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
return -1;
}
- if (PyModule_AddObject(mod, "inf", PyFloat_FromDouble(m_inf())) < 0) {
+ if (PyModule_AddObject(mod, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
return -1;
}
+ Py_complex infj = {0.0, Py_INFINITY};
if (PyModule_AddObject(mod, "infj",
- PyComplex_FromCComplex(c_infj())) < 0) {
+ PyComplex_FromCComplex(infj)) < 0) {
return -1;
}
-#if _PY_SHORT_FLOAT_REPR == 1
- if (PyModule_AddObject(mod, "nan", PyFloat_FromDouble(m_nan())) < 0) {
+ if (PyModule_AddObject(mod, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
return -1;
}
- if (PyModule_AddObject(mod, "nanj",
- PyComplex_FromCComplex(c_nanj())) < 0) {
+ Py_complex nanj = {0.0, fabs(Py_NAN)};
+ if (PyModule_AddObject(mod, "nanj", PyComplex_FromCComplex(nanj)) < 0) {
return -1;
}
-#endif
/* initialize special value tables */
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 3737a96545..f369b2c45c 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -59,7 +59,6 @@ raised for division by zero and mod by zero.
#include "Python.h"
#include "pycore_bitutils.h" // _Py_bit_length()
#include "pycore_call.h" // _PyObject_CallNoArgs()
-#include "pycore_dtoa.h" // _Py_dg_infinity()
#include "pycore_long.h" // _PyLong_GetZero()
#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "pycore_object.h" // _PyObject_LookupSpecial()
@@ -389,34 +388,6 @@ lanczos_sum(double x)
return num/den;
}
-/* Constant for +infinity, generated in the same way as float('inf'). */
-
-static double
-m_inf(void)
-{
-#if _PY_SHORT_FLOAT_REPR == 1
- 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 _PY_SHORT_FLOAT_REPR == 1
-
-static double
-m_nan(void)
-{
-#if _PY_SHORT_FLOAT_REPR == 1
- return _Py_dg_stdnan(0);
-#else
- return Py_NAN;
-#endif
-}
-
-#endif
static double
m_tgamma(double x)
@@ -435,7 +406,7 @@ m_tgamma(double x)
if (x == 0.0) {
errno = EDOM;
/* tgamma(+-0.0) = +-inf, divide-by-zero */
- return copysign(Py_HUGE_VAL, x);
+ return copysign(Py_INFINITY, x);
}
/* integer arguments */
@@ -3938,7 +3909,7 @@ math_ulp_impl(PyObject *module, double x)
if (Py_IS_INFINITY(x)) {
return x;
}
- double inf = m_inf();
+ double inf = Py_INFINITY;
double x2 = nextafter(x, inf);
if (Py_IS_INFINITY(x2)) {
/* special case: x is the largest positive representable float */
@@ -3975,14 +3946,12 @@ math_exec(PyObject *module)
if (PyModule_AddObject(module, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
return -1;
}
- if (PyModule_AddObject(module, "inf", PyFloat_FromDouble(m_inf())) < 0) {
+ if (PyModule_AddObject(module, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
return -1;
}
-#if _PY_SHORT_FLOAT_REPR == 1
- if (PyModule_AddObject(module, "nan", PyFloat_FromDouble(m_nan())) < 0) {
+ if (PyModule_AddObject(module, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
return -1;
}
-#endif
return 0;
}