Previous: , Up: Arithmetic Functions   [Contents][Index]

#### 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)
Function: _FloatN fminfN (_FloatN x, _FloatN y)
Function: _FloatNx fminfNx (_FloatNx x, _FloatNx 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 a quiet NaN, the other argument is returned. If both arguments are NaN, or either is a signaling 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)
Function: _FloatN fmaxfN (_FloatN x, _FloatN y)
Function: _FloatNx fmaxfNx (_FloatNx x, _FloatNx 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 a quiet NaN, the other argument is returned. If both arguments are NaN, or either is a signaling NaN, NaN is returned.

Function: double fminimum (double x, double y)
Function: float fminimumf (float x, float y)
Function: long double fminimuml (long double x, long double y)
Function: _FloatN fminimumfN (_FloatN x, _FloatN y)
Function: _FloatNx fminimumfNx (_FloatNx x, _FloatNx y)

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

The `fminimum` function returns the lesser of the two values x and y. Unlike `fmin`, if either argument is a NaN, NaN is returned. Positive zero is treated as greater than negative zero.

Function: double fmaximum (double x, double y)
Function: float fmaximumf (float x, float y)
Function: long double fmaximuml (long double x, long double y)
Function: _FloatN fmaximumfN (_FloatN x, _FloatN y)
Function: _FloatNx fmaximumfNx (_FloatNx x, _FloatNx y)

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

The `fmaximum` function returns the greater of the two values x and y. Unlike `fmax`, if either argument is a NaN, NaN is returned. Positive zero is treated as greater than negative zero.

Function: double fminimum_num (double x, double y)
Function: float fminimum_numf (float x, float y)
Function: long double fminimum_numl (long double x, long double y)
Function: _FloatN fminimum_numfN (_FloatN x, _FloatN y)
Function: _FloatNx fminimum_numfNx (_FloatNx x, _FloatNx y)

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

The `fminimum_num` function returns the lesser of the two values x and y. If one argument is a number and the other is a NaN, even a signaling NaN, the number is returned. Positive zero is treated as greater than negative zero.

Function: double fmaximum_num (double x, double y)
Function: float fmaximum_numf (float x, float y)
Function: long double fmaximum_numl (long double x, long double y)
Function: _FloatN fmaximum_numfN (_FloatN x, _FloatN y)
Function: _FloatNx fmaximum_numfNx (_FloatNx x, _FloatNx y)

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

The `fmaximum_num` function returns the greater of the two values x and y. If one argument is a number and the other is a NaN, even a signaling NaN, the number is returned. Positive zero is treated as greater than negative zero.

Function: double fminmag (double x, double y)
Function: float fminmagf (float x, float y)
Function: long double fminmagl (long double x, long double y)
Function: _FloatN fminmagfN (_FloatN x, _FloatN y)
Function: _FloatNx fminmagfNx (_FloatNx x, _FloatNx y)

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

These functions, from TS 18661-1:2014 and TS 18661-3:2015, return whichever of the two values x and y has the smaller absolute value. If both have the same absolute value, or either is NaN, they behave the same as the `fmin` functions.

Function: double fmaxmag (double x, double y)
Function: float fmaxmagf (float x, float y)
Function: long double fmaxmagl (long double x, long double y)
Function: _FloatN fmaxmagfN (_FloatN x, _FloatN y)
Function: _FloatNx fmaxmagfNx (_FloatNx x, _FloatNx y)

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

These functions, from TS 18661-1:2014, return whichever of the two values x and y has the greater absolute value. If both have the same absolute value, or either is NaN, they behave the same as the `fmax` functions.

Function: double fminimum_mag (double x, double y)
Function: float fminimum_magf (float x, float y)
Function: long double fminimum_magl (long double x, long double y)
Function: _FloatN fminimum_magfN (_FloatN x, _FloatN y)
Function: _FloatNx fminimum_magfNx (_FloatNx x, _FloatNx y)

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

These functions return whichever of the two values x and y has the smaller absolute value. If both have the same absolute value, or either is NaN, they behave the same as the `fminimum` functions.

Function: double fmaximum_mag (double x, double y)
Function: float fmaximum_magf (float x, float y)
Function: long double fmaximum_magl (long double x, long double y)
Function: _FloatN fmaximum_magfN (_FloatN x, _FloatN y)
Function: _FloatNx fmaximum_magfNx (_FloatNx x, _FloatNx y)

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

These functions return whichever of the two values x and y has the greater absolute value. If both have the same absolute value, or either is NaN, they behave the same as the `fmaximum` functions.

Function: double fminimum_mag_num (double x, double y)
Function: float fminimum_mag_numf (float x, float y)
Function: long double fminimum_mag_numl (long double x, long double y)
Function: _FloatN fminimum_mag_numfN (_FloatN x, _FloatN y)
Function: _FloatNx fminimum_mag_numfNx (_FloatNx x, _FloatNx y)

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

These functions return whichever of the two values x and y has the smaller absolute value. If both have the same absolute value, or either is NaN, they behave the same as the `fminimum_num` functions.

Function: double fmaximum_mag_num (double x, double y)
Function: float fmaximum_mag_numf (float x, float y)
Function: long double fmaximum_mag_numl (long double x, long double y)
Function: _FloatN fmaximum_mag_numfN (_FloatN x, _FloatN y)
Function: _FloatNx fmaximum_mag_numfNx (_FloatNx x, _FloatNx y)

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

These functions return whichever of the two values x and y has the greater absolute value. If both have the same absolute value, or either is NaN, they behave the same as the `fmaximum_num` functions.

Function: double fdim (double x, double y)
Function: float fdimf (float x, float y)
Function: long double fdiml (long double x, long double y)
Function: _FloatN fdimfN (_FloatN x, _FloatN y)
Function: _FloatNx fdimfNx (_FloatNx x, _FloatNx 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)
Function: _FloatN fmafN (_FloatN x, _FloatN y, _FloatN z)
Function: _FloatNx fmafNx (_FloatNx x, _FloatNx y, _FloatNx 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.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.

Function: float fadd (double x, double y)
Function: float faddl (long double x, long double y)
Function: double daddl (long double x, long double y)
Function: _FloatM fMaddfN (_FloatN x, _FloatN y)
Function: _FloatM fMaddfNx (_FloatNx x, _FloatNx y)
Function: _FloatMx fMxaddfN (_FloatN x, _FloatN y)
Function: _FloatMx fMxaddfNx (_FloatNx x, _FloatNx y)

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

These functions, from TS 18661-1:2014 and TS 18661-3:2015, return x + y, rounded once to the return type of the function without any intermediate rounding to the type of the arguments.

Function: float fsub (double x, double y)
Function: float fsubl (long double x, long double y)
Function: double dsubl (long double x, long double y)
Function: _FloatM fMsubfN (_FloatN x, _FloatN y)
Function: _FloatM fMsubfNx (_FloatNx x, _FloatNx y)
Function: _FloatMx fMxsubfN (_FloatN x, _FloatN y)
Function: _FloatMx fMxsubfNx (_FloatNx x, _FloatNx y)

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

These functions, from TS 18661-1:2014 and TS 18661-3:2015, return x - y, rounded once to the return type of the function without any intermediate rounding to the type of the arguments.

Function: float fmul (double x, double y)
Function: float fmull (long double x, long double y)
Function: double dmull (long double x, long double y)
Function: _FloatM fMmulfN (_FloatN x, _FloatN y)
Function: _FloatM fMmulfNx (_FloatNx x, _FloatNx y)
Function: _FloatMx fMxmulfN (_FloatN x, _FloatN y)
Function: _FloatMx fMxmulfNx (_FloatNx x, _FloatNx y)

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

These functions, from TS 18661-1:2014 and TS 18661-3:2015, return x * y, rounded once to the return type of the function without any intermediate rounding to the type of the arguments.

Function: float fdiv (double x, double y)
Function: float fdivl (long double x, long double y)
Function: double ddivl (long double x, long double y)
Function: _FloatM fMdivfN (_FloatN x, _FloatN y)
Function: _FloatM fMdivfNx (_FloatNx x, _FloatNx y)
Function: _FloatMx fMxdivfN (_FloatN x, _FloatN y)
Function: _FloatMx fMxdivfNx (_FloatNx x, _FloatNx y)

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

These functions, from TS 18661-1:2014 and TS 18661-3:2015, return x / y, rounded once to the return type of the function without any intermediate rounding to the type of the arguments.

Function: float fsqrt (double x)
Function: float fsqrtl (long double x)
Function: double dsqrtl (long double x)
Function: _FloatM fMsqrtfN (_FloatN x)
Function: _FloatM fMsqrtfNx (_FloatNx x)
Function: _FloatMx fMxsqrtfN (_FloatN x)
Function: _FloatMx fMxsqrtfNx (_FloatNx x)

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

These functions, from TS 18661-1:2014 and TS 18661-3:2015, return the square root of x, rounded once to the return type of the function without any intermediate rounding to the type of the arguments.

Function: float ffma (double x, double y, double z)
Function: float ffmal (long double x, long double y, long double z)
Function: double dfmal (long double x, long double y, long double z)
Function: _FloatM fMfmafN (_FloatN x, _FloatN y, _FloatN z)
Function: _FloatM fMfmafNx (_FloatNx x, _FloatNx y, _FloatNx z)
Function: _FloatMx fMxfmafN (_FloatN x, _FloatN y, _FloatN z)
Function: _FloatMx fMxfmafNx (_FloatNx x, _FloatNx y, _FloatNx z)

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

These functions, from TS 18661-1:2014 and TS 18661-3:2015, return (x · y) + z, rounded once to the return type of the function without any intermediate rounding to the type of the arguments and without any intermediate rounding of result of the multiplication.

Previous: Floating-Point Comparison Functions, Up: Arithmetic Functions   [Contents][Index]