#### 20.8.7 Miscellaneous FP arithmetic functions

The functions in this section perform miscellaneous but common operations that are awkward to express with C operators. On some processors these functions can use special machine instructions to perform these operations faster than the equivalent C code.

— Function: double fmin (double x, double y)

> — Function: float fminf (float x, float y)

> > — Function: long double fminl (long double x, long double y)

> > > Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

> > > The `fmin` function returns the lesser of the two values x and y. It is similar to the expression

> > >               ((x) < (y) ? (x) : (y))

> > > except that x and y are only evaluated once.

> > > If an argument is NaN, the other argument is returned. If both arguments are NaN, NaN is returned.

— Function: double fmax (double x, double y)

> — Function: float fmaxf (float x, float y)

> > — Function: long double fmaxl (long double x, long double y)

> > > Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

> > > The `fmax` function returns the greater of the two values x and y.

> > > If an argument is NaN, the other argument is returned. If both arguments are NaN, NaN is returned.

— Function: double fdim (double x, double y)

> — Function: float fdimf (float x, float y)

> > — Function: long double fdiml (long double x, long double y)

> > > Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

> > > The `fdim` function returns the positive difference between x and y. The positive difference is x - y if x is greater than y, and 0 otherwise.

> > > If x, y, or both are NaN, NaN is returned.

— Function: double fma (double x, double y, double z)

> — Function: float fmaf (float x, float y, float z)

> > — Function: long double fmal (long double x, long double y, long double z)

> > > Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

> > > The `fma` function performs floating-point multiply-add. This is the operation (x &middot; y) + z, but the intermediate result is not rounded to the destination type. This can sometimes improve the precision of a calculation.

> > > This function was introduced because some processors have a special instruction to perform multiply-add. The C compiler cannot use it directly, because the expression ‘`x*y + z`’ is defined to round the intermediate result. `fma` lets you choose when you want to round only once.

> > > On processors which do not implement multiply-add in hardware, `fma` can be very slow since it must avoid intermediate rounding. `math.h` defines the symbols `FP_FAST_FMA`, `FP_FAST_FMAF`, and `FP_FAST_FMAL` when the corresponding version of `fma` is no slower than the expression ‘`x*y + z`’. In the GNU C Library, this always means the operation is implemented in hardware.