| Updated: October 28, 2024 |
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 );
Your system requirements will determine how you should work with these libraries:
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 | Yes |
| Signal handler | Yes |
| Thread | Yes |