Namespaces
Variants

std:: fdim, std:: fdimf, std:: fdiml

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
헤더 파일에 정의됨 <cmath>
(1)
float fdim ( float x, float y ) ;

double fdim ( double x, double y ) ;

long double fdim ( long double x, long double y ) ;
(C++23 이전)
constexpr /*floating-point-type*/

fdim ( /*floating-point-type*/ x,

/*floating-point-type*/ y ) ;
(C++23 이후)
float fdimf ( float x, float y ) ;
(2) (C++11 이후)
(C++23부터 constexpr)
long double fdiml ( long double x, long double y ) ;
(3) (C++11 이후)
(C++23부터 constexpr)
SIMD 오버로드 (C++26 이후)
헤더 파일에 정의됨 <simd>
template < class V0, class V1 >

constexpr /*math-common-simd-t*/ < V0, V1 >

fdim ( const V0 & v_x, const V1 & v_y ) ;
(S) (C++26 이후)
추가 오버로드 (C++11 이후)
헤더 파일에 정의됨 <cmath>
template < class Integer >
double fdim ( Integer x, Integer y ) ;
(A) (C++23부터 constexpr)
1-3) x y 사이의 양의 차이를 반환합니다. 즉, x > y 인 경우 x - y 를 반환하고, 그렇지 않은 경우(즉 x <= y 인 경우) + 0 을 반환합니다. 라이브러리는 모든 cv-unqualified 부동 소수점 타입에 대해 std::fdim 의 오버로드를 매개변수 타입으로 제공합니다. (since C++23)
S) SIMD 오버로드는 v_x v_y 에 대해 요소별(element-wise) std::fdim 연산을 수행합니다.
(정의는 math-common-simd-t 참조)
(C++26부터)
A) 모든 정수 타입에 대해 추가 오버로드가 제공되며, 이들은 double 로 처리됩니다.
(since C++11)

목차

매개변수

x, y - 부동 소수점 또는 정수 값

반환값

성공 시, x y 사이의 양의 차이를 반환합니다.

오버플로로 인한 범위 오류가 발생하면, +HUGE_VAL , +HUGE_VALF , 또는 +HUGE_VALL 가 반환됩니다.

언더플로로 인한 범위 오류가 발생하면, 올바른 값(반올림 후)이 반환됩니다.

오류 처리

오류는 math_errhandling 에 명시된 대로 보고됩니다.

구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우,

  • 인수 중 하나라도 NaN이면 NaN이 반환됩니다.

참고 사항

std:: fmax ( x - y, 0 ) 와 동등하지만, NaN 처리 요구사항은 제외됩니다.

추가 오버로드는 반드시 (A) 와 정확히 동일하게 제공될 필요는 없습니다. 다만 첫 번째 인수 num1 과 두 번째 인수 num2 에 대해 다음을 보장할 수 있을 만큼 충분히 제공되어야 합니다:

  • num1 또는 num2 long double 타입을 가지는 경우, std :: fdim ( num1, num2 ) std :: fdim ( static_cast < long double > ( num1 ) ,
    static_cast < long double > ( num2 ) )
    와 동일한 효과를 가집니다.
  • 그렇지 않고 num1 및/또는 num2 double 또는 정수 타입을 가지는 경우, std :: fdim ( num1, num2 ) std :: fdim ( static_cast < double > ( num1 ) ,
    static_cast < double > ( num2 ) )
    와 동일한 효과를 가집니다.
  • 그렇지 않고 num1 또는 num2 float 타입을 가지는 경우, std :: fdim ( num1, num2 ) std :: fdim ( static_cast < float > ( num1 ) ,
    static_cast < float > ( num2 ) )
    와 동일한 효과를 가집니다.
(C++23 이전)

num1 num2 이 산술 타입을 가지는 경우, std :: fdim ( num1, num2 ) std :: fdim ( static_cast < /*common-floating-point-type*/ > ( num1 ) ,
static_cast < /*common-floating-point-type*/ > ( num2 ) )
와 동일한 효과를 가집니다. 여기서 /*common-floating-point-type*/ num1 num2 의 타입들 사이에서 가장 높은 부동소수점 변환 순위 와 가장 높은 부동소수점 변환 하위 순위 를 가지는 부동소수점 타입이며, 정수 타입 인수들은 double 과 동일한 부동소수점 변환 순위를 가진 것으로 간주됩니다.

가장 높은 순위와 하위 순위를 가지는 부동소수점 타입이 존재하지 않는 경우, 오버로드 해결 은 제공된 오버로드들 중에서 사용 가능한 후보를 결과로 내지 않습니다.

(C++23 이후)

예제

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
#ifndef __GNUC__
#pragma STDC FENV_ACCESS ON
#endif
int main()
{
    std::cout << "fdim(4, 1) = " << std::fdim(4, 1) << '\n'
              << "fdim(1, 4) = " << std::fdim(1, 4) << '\n'
              << "fdim(4,-1) = " << std::fdim(4, -1) << '\n'
              << "fdim(1,-4) = " << std::fdim(1, -4) << '\n';
    // 오류 처리 
    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";
}

출력:

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

참고 항목

정수 값의 절대값을 계산함 ( |x| )
(함수)
(C++11) (C++11) (C++11)
두 부동소수점 값 중 더 큰 값
(함수)
C 문서 for fdim