# fdim, fdimf, fdiml

< c‎ | numeric‎ | math

Common mathematical functions
Types
 div_tldiv_tlldiv_timaxdiv_t(C99)(C99)
 float_tdouble_t(C99)(C99) _Decimal32_t_Decimal64_t(C23)(C23)
Functions
Basic operations
 abslabsllabsimaxabs(C99)(C99) fabs divldivlldivimaxdiv(C99)(C99)
 fmod remainder(C99) remquo(C99) fma(C99) fdim(C99) nannanfnanlnandN(C99)(C99)(C99)(C23)
Maximum/minimum operations
 fmax(C99) fmaximum(C23) fmaximum_mag(C23) fmaximum_num(C23) fmaximum_mag_num(C23)
 fmin(C99) fminimum(C23) fminimum_mag(C23) fminimum_num(C23) fminimum_mag_num(C23)
Exponential functions
 exp exp10(C23) exp2(C99) expm1(C99) exp10m1(C23) exp2m1(C23)
 log log10 log2(C99) log1plogp1(C99)(C23) log10p1(C23) log2p1(C23)
Power functions
 sqrt cbrt(C99) rootn(C23) rsqrt(C23)
 hypot(C99) compound(C23) pow pown(C23) powr(C23)
Trigonometric and hyperbolic functions
 sin cos tan asin acos atan atan2 sinpi(C23) cospi(C23) tanpi(C23)
 asinpi(C23) acospi(C23) atanpi(C23) atan2pi(C23) sinh cosh tanh asinh(C99) acosh(C99) atanh(C99)
Error and gamma functions
 erf(C99) erfc(C99)
 lgamma(C99) tgamma(C99)
Nearest integer floating-point operations
 ceil floor roundlroundllround(C99)(C99)(C99) roundeven(C23) trunc(C99)
 nearbyint(C99) rintlrintllrint(C99)(C99)(C99) fromfpfromfpxufromfpufromfpx(C23)(C23)(C23)(C23)
Floating-point manipulation functions
 ldexp frexp scalbnscalbln(C99)(C99) ilogbllogb(C99)(C23) logb(C99)
 modf nextafternexttoward(C99)(C99) nextupnextdown(C23)(C23) copysign(C99) canonicalize(C23)
Narrowing operations
 fdiv(C23) ffma(C23) fsqrt(C23)
Quantum and quantum exponent functions
 quantizedN(C23) samequantumdN(C23)
 quantumdN(C23) llquantexpdN(C23)
Decimal re-encoding functions
 encodedecdN(C23) decodedecdN(C23)
 encodebindN(C23) decodebindN(C23)
Classification
 fpclassify(C99) iscanonical(C23) isfinite(C99) isinf(C99) isnan(C99) isnormal(C99) signbit(C99) issubnormal(C23) iszero(C23)
 isgreater(C99) isgreaterequal(C99) isless(C99) islessequal(C99) islessgreater(C99) isunordered(C99) issignaling(C23) iseqsig(C23)
Macro constants
Special floating-point values
 HUGE_VALFHUGE_VALHUGE_VALLHUGE_VALDN(C99)(C99)(C23)
 INFINITYDEC_INFINITY(C99)(C23) NANDEC_NAN(C99)(C23)
Arguments and return values
 FP_ILOGB0FP_ILOGBNAN(C99)(C99) FP_INT_UPWARDFP_INT_DOWNWARDFP_INT_TOWARDZEROFP_INT_TONEARESTFROMZEROFP_INT_TONEAREST(C23)(C23)(C23)(C23)(C23)
 FP_LLOGB0FP_LLOGBNAN(C23)(C23) FP_NORMALFP_SUBNORMALFP_ZEROFP_INFINITEFP_NAN(C99)(C99)(C99)(C99)(C99)
Error handling
 MATH_ERRNOMATH_ERRNOEXCEPT(C99)(C99)
 math_errhandling(C99)
Fast operation indicators

 Defined in header  float       fdimf( float x, float y ); (1) (since C99) double      fdim( double x, double y ); (2) (since C99) long double fdiml( long double x, long double y ); (3) (since C99) Defined in header  #define fdim( x, y ) (4) (since C99)
1-3) Returns the positive difference between x and y, that is, if x>y, returns x-y, otherwise (if x≤y), returns +0.
4) Type-generic macro: If any argument has type long double, fdiml is called. Otherwise, if any argument has integer type or has type double, fdim is called. Otherwise, fdimf is called.

## Contents

### Parameters

 x, y - floating-point value

### Return value

If successful, returns the positive difference between x and y.

If a range error due to overflow occurs, +HUGE_VAL, +HUGE_VALF, or +HUGE_VALL is returned.

If a range error due to underflow occurs, the correct value (after rounding) is returned.

### Error handling

Errors are reported as specified in Template:rllpt.

If the implementation supports IEEE floating-point arithmetic (IEC 60559),

• If either argument is NaN, NaN is returned.

### Notes

Equivalent to fmax(x-y, 0) except for the NaN handling requirements.

### Example

#include <errno.h>
#include <fenv.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON

int main(void)
{
printf("fdim(4, 1) = %f, fdim(1, 4)=%f\n", fdim(4,1), fdim(1,4));
printf("fdim(4,-1) = %f, fdim(1,-4)=%f\n", fdim(4,-1), fdim(1,-4));
//error handling
errno = 0; feclearexcept(FE_ALL_EXCEPT);
printf("fdim(1e308, -1e308) = %f\n", fdim(1e308, -1e308));
if (errno == ERANGE)
perror("    errno == ERANGE");
if (fetestexcept(FE_OVERFLOW))
puts("    FE_OVERFLOW raised");
}

Possible output:

fdim(4, 1) = 3.000000, fdim(1, 4)=0.000000
fdim(4,-1) = 5.000000, fdim(1,-4)=5.000000
fdim(1e308, -1e308) = inf
errno == ERANGE: Numerical result out of range
FE_OVERFLOW raised

### References

• C23 standard (ISO/IEC 9899:2024):
• 7.12.12.1 The fdim functions (p: TBD)
• 7.25 Type-generic math <tgmath.h> (p: TBD)
• F.10.9.1 The fdim functions (p: TBD)
• C17 standard (ISO/IEC 9899:2018):
• 7.12.12.1 The fdim functions (p: 187-188)
• 7.25 Type-generic math <tgmath.h> (p: 272-273)
• F.10.9.1 The fdim functions (p: 386)
• C11 standard (ISO/IEC 9899:2011):
• 7.12.12.1 The fdim functions (p: 257)
• 7.25 Type-generic math <tgmath.h> (p: 373-375)
• F.10.9.1 The fdim functions (p: 530)
• C99 standard (ISO/IEC 9899:1999):
• 7.12.12.1 The fdim functions (p: 238)
• 7.22 Type-generic math <tgmath.h> (p: 335-337)
• F.9.9.1 The fdim functions (p: 466)