Commit 5e65cd39 authored by Mark Dickinson's avatar Mark Dickinson

Issue #29282: Backed out changeset b33012ef1417

parent d1b230e4
......@@ -57,21 +57,6 @@ Number-theoretic and representation functions
If *x* is not a float, delegates to ``x.__floor__()``, which should return an
:class:`~numbers.Integral` value.
.. function:: fma(x, y, z)
Fused multiply-add operation. Return ``(x * y) + z``, computed as though with
infinite precision and range followed by a single round to the ``float``
format. This operation often provides better accuracy than the direct
expression ``(x * y) + z``.
This function follows the specification of the fusedMultiplyAdd operation
described in the IEEE 754-2008 standard. The standard leaves one case
implementation-defined, namely the result of ``fma(0, inf, nan)``
and ``fma(inf, 0, nan)``. In these cases, ``math.fma`` returns a NaN,
and does not raise any exception.
.. versionadded:: 3.7
.. function:: fmod(x, y)
......
......@@ -100,15 +100,6 @@ The :const:`~unittest.mock.sentinel` attributes now preserve their identity
when they are :mod:`copied <copy>` or :mod:`pickled <pickle>`.
(Contributed by Serhiy Storchaka in :issue:`20804`.)
math module
-----------
A new function :func:`~math.fma` for fused multiply-add operations has been
added. This function computes ``x * y + z`` with only a single round, and so
avoids any intermediate loss of precision. It wraps the ``fma`` function
provided by C99, and follows the specification of the IEEE 754-2008
"fusedMultiplyAdd" operation for special cases.
Optimizations
=============
......
This diff is collapsed.
......@@ -215,9 +215,6 @@ Core and Builtins
Library
-------
- Issue #29282: Added new math.fma function, wrapping C99's fma
operation.
- Issue #29197: Removed deprecated function ntpath.splitunc().
- Issue #29210: Removed support of deprecated argument "exclude" in
......
......@@ -80,40 +80,6 @@ PyDoc_STRVAR(math_factorial__doc__,
#define MATH_FACTORIAL_METHODDEF \
{"factorial", (PyCFunction)math_factorial, METH_O, math_factorial__doc__},
PyDoc_STRVAR(math_fma__doc__,
"fma($module, x, y, z, /)\n"
"--\n"
"\n"
"Fused multiply-add operation. Compute (x * y) + z with a single round.");
#define MATH_FMA_METHODDEF \
{"fma", (PyCFunction)math_fma, METH_FASTCALL, math_fma__doc__},
static PyObject *
math_fma_impl(PyObject *module, double x, double y, double z);
static PyObject *
math_fma(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
double x;
double y;
double z;
if (!_PyArg_ParseStack(args, nargs, "ddd:fma",
&x, &y, &z)) {
goto exit;
}
if (!_PyArg_NoStackKeywords("fma", kwnames)) {
goto exit;
}
return_value = math_fma_impl(module, x, y, z);
exit:
return return_value;
}
PyDoc_STRVAR(math_trunc__doc__,
"trunc($module, x, /)\n"
"--\n"
......@@ -570,4 +536,4 @@ math_isclose(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwna
exit:
return return_value;
}
/*[clinic end generated code: output=f428e1075d00c334 input=a9049054013a1b77]*/
/*[clinic end generated code: output=71806f73a5c4bf0b input=a9049054013a1b77]*/
......@@ -1595,47 +1595,6 @@ math_factorial(PyObject *module, PyObject *arg)
}
/*[clinic input]
math.fma
x: double
y: double
z: double
/
Fused multiply-add operation. Compute (x * y) + z with a single round.
[clinic start generated code]*/
static PyObject *
math_fma_impl(PyObject *module, double x, double y, double z)
/*[clinic end generated code: output=4fc8626dbc278d17 input=2ae8bb2a6e0f8b77]*/
{
double r;
r = fma(x, y, z);
/* Fast path: if we got a finite result, we're done. */
if (Py_IS_FINITE(r)) {
return PyFloat_FromDouble(r);
}
/* Non-finite result. Raise an exception if appropriate, else return r. */
if (Py_IS_NAN(r)) {
if (!Py_IS_NAN(x) && !Py_IS_NAN(y) && !Py_IS_NAN(z)) {
/* NaN result from non-NaN inputs. */
PyErr_SetString(PyExc_ValueError, "invalid operation in fma");
return NULL;
}
}
else if (Py_IS_FINITE(x) && Py_IS_FINITE(y) && Py_IS_FINITE(z)) {
/* Infinite result from finite inputs. */
PyErr_SetString(PyExc_OverflowError, "overflow in fma");
return NULL;
}
return PyFloat_FromDouble(r);
}
/*[clinic input]
math.trunc
......@@ -2265,7 +2224,6 @@ static PyMethodDef math_methods[] = {
{"fabs", math_fabs, METH_O, math_fabs_doc},
MATH_FACTORIAL_METHODDEF
MATH_FLOOR_METHODDEF
MATH_FMA_METHODDEF
MATH_FMOD_METHODDEF
MATH_FREXP_METHODDEF
MATH_FSUM_METHODDEF
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment