Multiply two floatingpoint numbers and then add a third number
Synopsis:
#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 );
Arguments:
 x, y
 The numbers that you want to multiply together.
 z
 The number you want to add to the product.
Library:
libm
Use the l m option to
qcc
to link against this library.
Description:
The fma(), fmaf(), and fmal()
(“fused multiplyadd”) functions
calculate (x * y) + z, rounded as one ternary operation.
That is, they compute the value to infinite precision and then round the result once, according to the
current rounding mode as specified by FLT_ROUNDS.
To check for error situations, use
feclearexcept()
and
fetestexcept():
 Call feclearexcept(FE_ALL_EXCEPT) before calling
fma(), fmaf(), or fmal().
 On return, if fetestexcept(FE_INVALID  FE_DIVBYZERO  FE_OVERFLOW  FE_UNDERFLOW)
is nonzero, then an error has occurred.
Returns:
(x * y) + z, rounded as one ternary operation.
 If the result overflows or underflows, a range error may occur.
 If x or y is NaN, NaN is returned.
 If x multiplied by y is an exact infinity,
and z is also an infinity but with the opposite sign, a domain error occurs, and
these functions return NaN.
 If one of x and y is infinite, the other is zero,
and z isn't a NaN, a domain error occurs, and the functions return NaN.
 If one of x and y is infinite, the other is zero,
and z is NaN, NaN is returned, and a domain error may occur.
 If x * y isn't 0 * Inf or Inf * 0,
and z is NaN, NaN is returned.
Errors:
 FE_INVALID
 The value of x * y + z is invalid,
or the value x * y is invalid and z isn't NaN.
 FE_OVERFLOW
 The result overflows.
Classification:
ANSI,
POSIX 1003.1
Safety: 

Cancellation point 
No 
Interrupt handler 
No 
Signal handler 
No 
Thread 
Yes 