Multiplies two numbers and adds a third number to their product
#include <math.h>
double fma ( double x , double y , double z );
float fmaf ( float x , float y , float z );
long double fmal( long double x , long double y , long double z );
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 // def FP_FAST_FMA
|