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
); longdouble
fmal( 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 ...
Get C in a Nutshell now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.