std:: remainder, std:: remainderf, std:: remainderl
|
헤더 파일에 정의됨
<cmath>
|
||
| (1) | ||
|
float
remainder
(
float
x,
float
y
)
;
double
remainder
(
double
x,
double
y
)
;
|
(C++23 이전) | |
|
constexpr
/*floating-point-type*/
remainder
(
/*floating-point-type*/
x,
|
(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
>
|
(S) | (C++26 이후) |
|
추가 오버로드
(C++11 이후)
|
||
|
헤더 파일에 정의됨
<cmath>
|
||
|
template
<
class
Integer
>
double remainder ( Integer x, Integer y ) ; |
(A) | (C++23부터 constexpr) |
std::remainder
의 오버로드를 매개변수 타입으로 제공합니다.
(since C++23)
|
S)
SIMD 오버로드는
v_x
와
v_y
에 대해 요소별(element-wise)
std::remainder
연산을 수행합니다.
|
(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 에 대해:
|
(C++23 이전) |
|
num1
과
num2
이 산술 타입을 가지는 경우,
std
::
remainder
(
num1, num2
)
은
std
::
remainder
(
static_cast
<
/*common-floating-point-type*/
>
(
num1
)
,
가장 높은 순위와 하위 순위를 가지는 부동소수점 타입이 존재하지 않는 경우, 오버로드 해결 은 제공된 오버로드 중에서 사용 가능한 후보를 결과로 내지 않습니다. |
(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++11)
|
부호 있는 나머지와 나눗셈 연산의 마지막 세 비트
(함수) |
|
C documentation
for
remainder
|
|