Is there a good reason not to detect single expression multiply adds and just emit a new FMA bytecode?
Is our goal for floats to strictly match the result of the same operations coded in unoptimized C using doubles?
Or can we be more precise on occasion?
I guess a similar question may be asked of all C compilers as they too could emit an FMA instruction on such expressions... If they don't do it by default, that suggests we match them and not do it either.
Regardless +1 on adding math.fma() either way as it is an expression of precise intent.
-gps
On Mon, Jan 16, 2017, 10:44 AM David Mertz <mertz@gnosis.cx> wrote:My understanding is that NumPy does NOT currently support a direct FMA operation "natively." However, higher-level routines like `numpy.linalg.solve` that are linked to MKL or BLAS DO take advantage of FMA within the underlying libraries.On Mon, Jan 16, 2017 at 10:06 AM, Guido van Rossum <gvanrossum@gmail.com> wrote:Does numpy support this?--Guido (mobile)On Jan 16, 2017 7:27 AM, "Stephan Houben" <stephanh42@gmail.com> wrote:Hi Steve,Very good!Here is a version which also handles the nan's, infinities,negative zeros properly.===============import mathfrom fractions import Fractiondef fma2(x, y, z):if math.isfinite(x) and math.isfinite(y) and math.isfinite(z):result = float(Fraction(x)*Fraction(y) + Fraction(z))if not result and not z:result = math.copysign(result, x*y+z)else:result = x * y + zassert not math.isfinite(result)return result===========================Stephan2017-01-16 12:04 GMT+01:00 Steven D'Aprano <steve@pearwood.info>:On Mon, Jan 16, 2017 at 11:01:23AM +0100, Stephan Houben wrote:
[...]
> So the following would not be a valid FMA fallback
>
> double bad_fma(double x, double y, double z) {
> return x*y + z;
> }
[...]
> Upshot: if we want to provide a software fallback in the Python code, we
> need to do something slow and complicated like musl does.
I don't know about complicated. I think this is pretty simple:
from fractions import Fraction
def fma(x, y, z):
# Return x*y + z with only a single rounding.
return float(Fraction(x)*Fraction(y) + Fraction(z))
When speed is not the number one priority and accuracy is important,
its hard to beat the fractions module.
--
Steve
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/ --______________________________Keeping medicines from the bloodstreams of the sick; food
from the bellies of the hungry; books from the hands of the
uneducated; technology from the underdeveloped; and putting
advocates of freedom in prisons. Intellectual property is
to the 21st century what the slave trade was to the 16th._________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/