fdim

From cppreference.com
< clrm; | numericlrm; | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99)
fdim
(C99)
(C99)(C99)(C99)
Exponential functions
(C99)
(C99)
(C99)
(C99)
Power functions
(C99)
(C99)
Trigonometric and hyperbolic functions
(C99)
(C99)
(C99)
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Nearest integer floating point operations
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
Floating point manipulation functions
(C99)(C99)
(C99)
(C99)
Classification
(C99)
(C99)
(C99)
Types
(C99)(C99)
Macro constants
Defined in header <math.h>
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 <tgmath.h>
#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 xy), 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.

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

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 <stdio.h>
#include <math.h>
#include <errno.h>
#include <fenv.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

  • 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)

See also

computes absolute value of an integral value (|x|)
(function)
(C99)(C99)(C99)
determines larger of two floating-point values
(function)