home | help
FMA(3)			     Library Functions Manual			  FMA(3)

NAME
     fma, fmaf -- fused multiply-add

LIBRARY
     Math Library (libm, -lm)

SYNOPSIS
     #include <math.h>

     double
     fma(double x, double y, double z);

     float
     fmaf(float x, float y, float z);

DESCRIPTION
     The  fma()  and fmaf() functions return (x * y) + z, computed with only one
     rounding error.  Using the ordinary multiplication and addition  operators,
     by contrast, results in two roundings: one for the intermediate product and
     one for the final result.

     For  instance, the expression 1.2e100 * 2.0e208 - 1.4e308 produces infinity
     due to overflow in the intermediate product, whereas fma(1.2e100,	2.0e208,
     -1.4e308) returns approximately 1.0e308.

     The  fused  multiply-add operation is often used to improve the accuracy of
     calculations such as dot products.  It may also be used to improve  perfor-
     mance  on	machines that implement it natively.  The macros FP_FAST_FMA and
     FP_FAST_FMAF may be defined in <math.h> to indicate that fma()  and  fmaf()
     (respectively)  have  comparable  or faster speed than a multiply operation
     followed by an add operation.

IMPLEMENTATION NOTES
     In general, fma() and fmaf() will behave as one would expect if x * y  +  z
     were  computed with unbounded precision and range, then rounded to the pre-
     cision of the return type.  However, on some platforms, if z is NaN,  these
     functions	may  not  raise  an exception even when the computation of x * y
     would have otherwise generated an invalid exception.

SEE ALSO
     fenv(3), math(3)

STANDARDS
     The fma() and fmaf() functions conform to ISO/IEC 9899:1999 ("ISO C99").  A
     fused multiply-add operation with virtually identical  characteristics  ap-
     pears in IEEE draft standard 754R.

HISTORY
     These routines first appeared in FreeBSD 5.4.

FreeBSD 5.4			January 22, 2005			  FMA(3)

home | help