Multiply two floating-point numbers and then add a third number
#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 fma(), fmaf(), and fmal() (“fused multiply-add”) 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(). For example:
(x * y) + z, rounded as one ternary operation.
If: | These functions return: | Errors: |
---|---|---|
The result overflows | Inf | FE_OVERFLOW |
The result underflows | The correct result, after rounding | FE_UNDERFLOW |
x or y is NaN | NaN | — |
x * y is an exact infinity, and z is also an infinity but with the opposite sign | NaN | FE_INVALID |
One of x and y is infinite, the other is zero, and z isn't a NaN | NaN | FE_INVALID |
One of x and y is infinite, the other is zero, and z is NaN | NaN | FE_INVALID |
x * y isn't 0.0 * Inf or Inf * 0.0, and z is NaN | NaN | — |
These functions raise FE_INEXACT if the FPU reports that the result can't be exactly represented as a floating-point number.
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | No |
Thread | Yes |