Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/numeric/math/fdim"

From cppreference.com
< cpp‎ | numeric‎ | math
(+error handling and other details, +example)
m (-stray tt)
Line 17: Line 17:
 
{{dcl end}}
 
{{dcl end}}
  
@1-3@ Returns the positive difference between {{c|x}} and {{c|y}}, that is, if {{tt|c|x>y}}, returns {{c|x-y}}, otherwise (if {{c|x≤y}}), returns +0.
+
@1-3@ Returns the positive difference between {{c|x}} and {{c|y}}, that is, if {{c|x>y}}, returns {{c|x-y}}, otherwise (if {{c|x≤y}}), returns +0.
 
@4@ A set of overloads or a function template for all combinations of arguments of [[cpp/types/is_arithmetic|arithmetic type]] not covered by 1-3). If any argument has [[cpp/types/is_integral|integral type]], it is cast to {{c|double}}. If any argument is {{c|long double}}, then the return type {{tt|Promoted}} is also {{c|long double}}, otherwise the return type is always {{c|double}}.
 
@4@ A set of overloads or a function template for all combinations of arguments of [[cpp/types/is_arithmetic|arithmetic type]] not covered by 1-3). If any argument has [[cpp/types/is_integral|integral type]], it is cast to {{c|double}}. If any argument is {{c|long double}}, then the return type {{tt|Promoted}} is also {{c|long double}}, otherwise the return type is always {{c|double}}.
  

Revision as of 17:53, 7 June 2014

 
 
 
 
Defined in header <cmath>
float       fdim( float x, float y );
(1) (since C++11)
double      fdim( double x, double y );
(2) (since C++11)
long double fdim( long double x, long double y );
(3) (since C++11)
Promoted    fdim( Arithmetic1 x, Arithmetic2 y );
(4) (since C++11)
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) A set of overloads or a function template for all combinations of arguments of arithmetic type not covered by 1-3). If any argument has integral type, it is cast to double. If any argument is long double, then the return type Promoted is also long double, otherwise the return type is always double.

Contents

Parameters

x, y - values of floating-point or integral types

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 std::fmax(x-y, 0), except for the NaN handling requirements

Example

#include <iostream>
#include <cmath>
#include <cerrno>
#include <cstring>
#include <cfenv>
#pragma STDC FENV_ACCESS ON
int main()
{
    std::cout << "fdim(4, 1) = " << std::fdim(4, 1)
              << " fdim(1, 4) = " << std::fdim(1, 4) << '\n'
              << "fdim(4,-1) = " << std::fdim(4, -1)
              << " fdim(1,-4) = " << std::fdim(1, -4) << '\n';
    // error handling 
    errno=0; std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "fdim(1e308, -1e308) = " << std::fdim(1e308, -1e308) << '\n';
    if(errno == ERANGE)
        std::cout << "    errno == ERANGE: " << std::strerror(errno) << '\n';
    if(std::fetestexcept(FE_OVERFLOW))
        std::cout << "    FE_OVERFLOW raised\n";
}

Output:

fdim(4, 1) = 3 fdim(1, 4) = 0
fdim(4,-1) = 5 fdim(1,-4) = 5
fdim(1e308, -1e308) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

See also

computes absolute value of an integral value (|x|)
(function) [edit]
(C++11)(C++11)(C++11)
larger of two floating-point values
(function) [edit]