Namespaces
Variants

std:: fmod, std:: fmodf, std:: fmodl

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 fmod ( float x, float y ) ;

double fmod ( double x, double y ) ;

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

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

/*floating-point-type*/ y ) ;
(C++23 이후)
float fmodf ( float x, float y ) ;
(2) (C++11 이후)
(C++23부터 constexpr)
long double fmodl ( 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 >

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

이 함수가 계산하는 나눗셈 연산 x / y 의 부동 소수점 나머지는 정확히 x - iquot * y 값입니다. 여기서 iquot x / y 의 소수부가 절삭된 값입니다.

반환된 값은 x 와 동일한 부호를 가지며 크기는 y 보다 작습니다.

목차

매개변수

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

반환값

성공 시, 위에서 정의된 대로 나눗셈 x / y 의 부동소수점 나머지를 반환합니다.

도메인 오류가 발생하면 구현에서 정의한 값이 반환됩니다(NaN이 지원되는 경우).

언더플로우로 인해 범위 오류가 발생하는 경우, 올바른 결과(반올림 후)가 반환됩니다.

오류 처리

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

y 가 0인 경우 도메인 오류가 발생할 수 있습니다.

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

  • 만약 x 가 ±0이고 y 가 0이 아니면, ±0이 반환됩니다.
  • 만약 x 가 ±∞이고 y 가 NaN이 아니면, NaN이 반환되고 FE_INVALID 가 발생합니다.
  • 만약 y 가 ±0이고 x 가 NaN이 아니면, NaN이 반환되고 FE_INVALID 가 발생합니다.
  • 만약 y 가 ±∞이고 x 가 유한값이면, x 가 반환됩니다.
  • 만약 두 인수 중 하나가 NaN이면, NaN이 반환됩니다.

참고 사항

POSIX는 x 가 무한대이거나 y 가 0인 경우 도메인 오류가 발생하도록 요구합니다.

std::fmod 는 부동 소수점 타입을 부호 없는 정수 타입으로 자동 래핑하는 데 유용하지만, std::remainder 는 그렇지 않습니다: ( 0.0 <= ( y = std :: fmod ( std:: rint ( x ) , 65536.0 ) ) ? y : 65536.0 + y ) [ - 0.0 , 65535.0 ] 범위에 있으므로 unsigned short 에 대응됩니다. 그러나 std:: remainder ( std:: rint ( x ) , 65536.0 [ - 32767.0 , + 32768.0 ] 범위에 있어 signed short 의 범위를 벗어납니다.

double 버전의 std::fmod 는 다음과 같이 구현된 것처럼 동작합니다:

double fmod(double x, double y)
{
#pragma STDC FENV_ACCESS ON
    double result = std::remainder(std::fabs(x), y = std::fabs(y));
    if (std::signbit(result))
        result += y;
    return std::copysign(result, x);
}

다음 식 x - std:: trunc ( x / y ) * y std :: fmod ( x, y ) 와 같지 않을 수 있습니다. 특히 x / y 의 반올림으로 std::trunc 의 인수를 초기화할 때 너무 많은 정밀도를 잃는 경우 그렇습니다 (예시: x = 30.508474576271183309 , y = 6.1016949152542370172 ).

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

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

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

만약 가장 높은 등급과 하위 등급을 가진 부동소수점 타입이 존재하지 않으면, 오버로드 해결 은 제공된 오버로드들 중에서 사용 가능한 후보를 결과로 내지 않습니다.

(C++23 이후)

예제

#include <cfenv>
#include <cmath>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::cout << "fmod(+5.1, +3.0) = " << std::fmod(5.1, 3) << '\n'
              << "fmod(-5.1, +3.0) = " << std::fmod(-5.1, 3) << '\n'
              << "fmod(+5.1, -3.0) = " << std::fmod(5.1, -3) << '\n'
              << "fmod(-5.1, -3.0) = " << std::fmod(-5.1, -3) << '\n';
    // 특수 값
    std::cout << "fmod(+0.0, 1.0) = " << std::fmod(0, 1) << '\n'
              << "fmod(-0.0, 1.0) = " << std::fmod(-0.0, 1) << '\n'
              << "fmod(5.1, Inf) = " << std::fmod(5.1, INFINITY) << '\n';
    // 오류 처리
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "fmod(+5.1, 0) = " << std::fmod(5.1, 0) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "    FE_INVALID raised\n";
}

가능한 출력:

fmod(+5.1, +3.0) = 2.1
fmod(-5.1, +3.0) = -2.1
fmod(+5.1, -3.0) = 2.1
fmod(-5.1, -3.0) = -2.1
fmod(+0.0, 1.0) = 0
fmod(-0.0, 1.0) = -0
fmod(5.1, Inf) = 5.1
fmod(+5.1, 0) = -nan
    FE_INVALID raised

참고 항목

정수 나눗셈의 몫과 나머지를 계산함
(함수)
(C++11) (C++11) (C++11)
나눗셈 연산의 부호 있는 나머지
(함수)
(C++11) (C++11) (C++11)
부호 있는 나머지와 나눗셈 연산의 마지막 세 비트
(함수)
C 문서 for fmod