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: floatfminf(float x, float y)

— Function: long doublefminl(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 valuesxandy. It is similar to the expression((x) < (y) ? (x) : (y))except that

xandyare 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: floatfmaxf(float x, float y)

— Function: long doublefmaxl(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 valuesxandy.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: floatfdimf(float x, float y)

— Function: long doublefdiml(long double x, long double y)

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

The

`fdim`

function returns the positive difference betweenxandy. The positive difference isx-yifxis greater thany, and 0 otherwise.If

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

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

— Function: floatfmaf(float x, float y, float z)

— Function: long doublefmal(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·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.hdefines 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.