Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 32 additions & 49 deletions Modules/mathmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,29 @@ static const double logpi = 1.144729885849400174143427351353058711647;
static const double sqrtpi = 1.772453850905516027298167483341145182798;
#endif /* !defined(HAVE_ERF) || !defined(HAVE_ERFC) */


/* Version of PyFloat_AsDouble() with in-line fast paths
for exact floats and integers. Gives a substantial
speed improvement for extracting float arguments.
*/

#define ASSIGN_DOUBLE(target_var, obj, error_label) \
if (PyFloat_CheckExact(obj)) { \
target_var = PyFloat_AS_DOUBLE(obj); \
} \
else if (PyLong_CheckExact(obj)) { \
target_var = PyLong_AsDouble(obj); \
if (target_var == -1.0 && PyErr_Occurred()) { \
goto error_label; \
} \
} \
else { \
target_var = PyFloat_AsDouble(obj); \
if (target_var == -1.0 && PyErr_Occurred()) { \
goto error_label; \
} \
}

static double
sinpi(double x)
{
Expand Down Expand Up @@ -1323,10 +1346,8 @@ math_fsum(PyObject *module, PyObject *seq)
goto _fsum_error;
break;
}
x = PyFloat_AsDouble(item);
ASSIGN_DOUBLE(x, item, error_with_item);
Py_DECREF(item);
if (PyErr_Occurred())
goto _fsum_error;

xsave = x;
for (i = j = 0; j < n; j++) { /* for y in partials */
Expand Down Expand Up @@ -1407,12 +1428,16 @@ math_fsum(PyObject *module, PyObject *seq)
}
sum = PyFloat_FromDouble(hi);

_fsum_error:
_fsum_error:
PyFPE_END_PROTECT(hi)
Py_DECREF(iter);
if (p != ps)
PyMem_Free(p);
return sum;

error_with_item:
Py_DECREF(item);
goto _fsum_error;
}

#undef NUM_PARTIALS
Expand Down Expand Up @@ -2142,37 +2167,9 @@ math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
}
for (i=0 ; i<n ; i++) {
item = PyTuple_GET_ITEM(p, i);
if (PyFloat_CheckExact(item)) {
px = PyFloat_AS_DOUBLE(item);
}
else if (PyLong_CheckExact(item)) {
px = PyLong_AsDouble(item);
if (px == -1.0 && PyErr_Occurred()) {
goto error_exit;
}
}
else {
px = PyFloat_AsDouble(item);
if (px == -1.0 && PyErr_Occurred()) {
goto error_exit;
}
}
ASSIGN_DOUBLE(px, item, error_exit);
item = PyTuple_GET_ITEM(q, i);
if (PyFloat_CheckExact(item)) {
qx = PyFloat_AS_DOUBLE(item);
}
else if (PyLong_CheckExact(item)) {
qx = PyLong_AsDouble(item);
if (qx == -1.0 && PyErr_Occurred()) {
goto error_exit;
}
}
else {
qx = PyFloat_AsDouble(item);
if (qx == -1.0 && PyErr_Occurred()) {
goto error_exit;
}
}
ASSIGN_DOUBLE(qx, item, error_exit);
x = fabs(px - qx);
diffs[i] = x;
found_nan |= Py_IS_NAN(x);
Expand Down Expand Up @@ -2213,21 +2210,7 @@ math_hypot(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
}
for (i = 0; i < nargs; i++) {
item = args[i];
if (PyFloat_CheckExact(item)) {
x = PyFloat_AS_DOUBLE(item);
}
else if (PyLong_CheckExact(item)) {
x = PyLong_AsDouble(item);
if (x == -1.0 && PyErr_Occurred()) {
goto error_exit;
}
}
else {
x = PyFloat_AsDouble(item);
if (x == -1.0 && PyErr_Occurred()) {
goto error_exit;
}
}
ASSIGN_DOUBLE(x, item, error_exit);
x = fabs(x);
coordinates[i] = x;
found_nan |= Py_IS_NAN(x);
Expand Down