fma

## Synopsis

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 ...`

Get C in a Nutshell now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.