Name
fma
Synopsis
Multiplies two numbers and adds a third number to their product
#include <math.h> doublefma( doublex, doubley, doublez); floatfmaf( floatx, floaty, floatz); longdoublefmal( long doublex, long doubley, long doublez);
The name of the fma()
function stands for “fused multiply-add.” fma() multiplies its first two
floating-point arguments, then adds the third argument to the
result. The advantage over the expression (x * y) + z, with two
separate arithmetic operations, is that fma() avoids the error that would be
incurred by intermediate rounding, as well as intermediate overflows
or underflows that might otherwise be caused by the separate
multiplication.
If the implementation defines the macro FP_FAST_FMA in math.h, that indicates that the fma() function is about as fast to execute
as, or faster than, the expression (x * y) + z. This is
typically the case if the fma()
function makes use of a special FMA machine operation. The
corresponding macros FP_FAST_FMAF
and FP_FAST_FMAL provide the same
information about the float and
long double versions.
Example
double x, y, z; x = nextafter( 3.0, 4.0 ); // Smallest possible double value greater than 3 y = 1.0/3.0; z = -1.0; printf( "x = %.15G\n" "y = %.15G\n" "z = %.15G\n", x, y, z ); #ifdef FP_FAST_FMA printf( "fma( x, y, z) = %.15G\n", fma( x, y, z) ); #else // i.e., not def FP_FAST_FMA double product = x * y; printf( "x times y = %.15G\n", product ); printf( "%.15G + z = %.15G\n", product, product + z ); #endif ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access