Namespaces
Variants

std:: remainder, std:: remainderf, std:: remainderl

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

double remainder ( double x, double y ) ;

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

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

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

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

이 함수로 계산된 나눗셈 연산 x / y 의 IEEE 부동 소수점 나머지는 정확히 x - quo * y 값입니다. 여기서 quo 값은 정확한 값 x / y 에 가장 가까운 정수 값입니다. |quo - x / y| = ½ 인 경우, quo 값은 짝수로 선택됩니다.

std::fmod 와 대조적으로, 반환된 값은 x 와 같은 부호를 가질 것이라고 보장되지 않습니다.

반환된 값이 0인 경우, 해당 값은 x 와 동일한 부호를 갖습니다.

목차

매개변수

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

반환값

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

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

언더플로로 인해 범위 오류가 발생하면 올바른 결과가 반환됩니다.

만약 y 가 0이지만 도메인 오류가 발생하지 않는 경우, 0이 반환됩니다.

오류 처리

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

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

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

  • 현재 반올림 모드 는 영향을 미치지 않습니다.
  • FE_INEXACT 는 절대 발생하지 않으며, 결과는 항상 정확합니다.
  • 만약 x 가 ±∞이고 y 가 NaN이 아니면, NaN이 반환되고 FE_INVALID 가 발생합니다.
  • 만약 y 가 ±0이고 x 가 NaN이 아니면, NaN이 반환되고 FE_INVALID 가 발생합니다.
  • 인수 중 하나가 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 의 범위를 벗어납니다.

추가 오버로드는 반드시 (A) 와 정확히 동일하게 제공될 필요는 없습니다. 다음 조건만 충족되면 됩니다: 첫 번째 인수 num1 과 두 번째 인수 num2 에 대해:

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

num1 num2 이 산술 타입을 가지는 경우, std :: remainder ( num1, num2 ) std :: remainder ( 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 << "remainder(+5.1, +3.0) = " << std::remainder(5.1, 3) << '\n'
              << "remainder(-5.1, +3.0) = " << std::remainder(-5.1, 3) << '\n'
              << "remainder(+5.1, -3.0) = " << std::remainder(5.1, -3) << '\n'
              << "remainder(-5.1, -3.0) = " << std::remainder(-5.1, -3) << '\n';
    // 특수 값
    std::cout << "remainder(-0.0, 1.0) = " << std::remainder(-0.0, 1) << '\n'
              << "remainder(5.1, Inf) = " << std::remainder(5.1, INFINITY) << '\n';
    // 오류 처리
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "remainder(+5.1, 0) = " << std::remainder(5.1, 0) << '\n';
    if (fetestexcept(FE_INVALID))
        std::cout << "    FE_INVALID raised\n";
}

가능한 출력:

remainder(+5.1, +3.0) = -0.9
remainder(-5.1, +3.0) = 0.9
remainder(+5.1, -3.0) = -0.9
remainder(-5.1, -3.0) = 0.9
remainder(-0.0, 1.0) = -0
remainder(5.1, Inf) = 5.1
remainder(+5.1, 0) = -nan
    FE_INVALID raised

참고 항목

정수 나눗셈의 몫과 나머지를 계산합니다
(함수)
(C++11) (C++11)
부동 소수점 나눗셈 연산의 나머지
(함수)
(C++11) (C++11) (C++11)
부호 있는 나머지와 나눗셈 연산의 마지막 세 비트
(함수)
C documentation for remainder