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 <me...@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 <gvanros...@gmail.com> > wrote: > > Does numpy support this? > > --Guido (mobile) > > On Jan 16, 2017 7:27 AM, "Stephan Houben" <stephan...@gmail.com> wrote: > > Hi Steve, > > Very good! > Here is a version which also handles the nan's, infinities, > negative zeros properly. > > =============== > import math > from fractions import Fraction > > def 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 + z > assert not math.isfinite(result) > return result > =========================== > > Stephan > > > 2017-01-16 12:04 GMT+01:00 Steven D'Aprano <st...@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/