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