std:: modf, std:: modff, std:: modfl
|
헤더에 정의됨
<cmath>
|
||
| (1) | ||
|
float
modf
(
float
num,
float
*
iptr
)
;
double
modf
(
double
num,
double
*
iptr
)
;
|
(C++23 이전) | |
|
constexpr
/* floating-point-type */
modf
(
/* floating-point-type */
num,
|
(C++23 이후) | |
|
float
modff
(
float
num,
float
*
iptr
)
;
|
(2) |
(C++11 이후)
(C++23부터 constexpr) |
|
long
double
modfl
(
long
double
num,
long
double
*
iptr
)
;
|
(3) |
(C++11 이후)
(C++23부터 constexpr) |
|
추가 오버로드
(C++11 이후)
|
||
|
헤더에 정의됨
<cmath>
|
||
|
template
<
class
Integer
>
double modf ( Integer num, double * iptr ) ; |
(A) | (C++23부터 constexpr) |
std::modf
의 오버로드를 매개변수
num
의 타입과
iptr
이 가리키는 타입으로서 모든 cv-한정되지 않은 부동 소수점 타입에 대해 제공합니다.
(C++23 이후)
|
A)
모든 정수 타입에 대해 추가 오버로드가 제공되며, 이들은
double
로 처리됩니다.
|
(since C++11) |
목차 |
매개변수
| num | - | 부동 소수점 또는 정수 값 |
| iptr | - | 정수 부분을 저장할 부동 소수점 값에 대한 포인터 |
반환값
오류가 발생하지 않으면, num 과 동일한 부호를 가진 num 의 소수 부분을 반환합니다. 정수 부분은 iptr 이 가리키는 값에 저장됩니다.
반환된 값과 * iptr 에 저장된 값의 합은 num 을 나타냅니다 (반올림을 고려함).
오류 처리
이 함수는 math_errhandling 에 지정된 어떤 오류에도 영향을 받지 않습니다.
구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우,
- 만약 num 이 ±0이면, ±0이 반환되고 ±0이 * iptr 에 저장됩니다.
- 만약 num 이 ±∞이면, ±0이 반환되고 ±∞가 * iptr 에 저장됩니다.
- 만약 num 이 NaN이면, NaN이 반환되고 NaN이 * iptr 에 저장됩니다.
- 반환된 값은 정확하며, 현재 반올림 모드 는 무시됩니다.
참고 사항
이 함수는 다음과 같이 구현된 것처럼 동작합니다:
double modf(double num, double* iptr) { #pragma STDC FENV_ACCESS ON int save_round = std::fegetround(); std::fesetround(FE_TOWARDZERO); *iptr = std::nearbyint(num); std::fesetround(save_round); return std::copysign(std::isinf(num) ? 0.0 : num - (*iptr), num); }
추가 오버로드는 반드시 (A) 와 정확히 동일하게 제공될 필요는 없습니다. 정수 타입의 인수 num 에 대해 std :: modf ( num, iptr ) 가 std :: modf ( static_cast < double > ( num ) , iptr ) 와 동일한 효과를 보장할 수 있을 정도로만 제공되면 됩니다.
예제
다양한 부동 소수점 분해 함수들을 비교합니다:
#include <cmath> #include <iostream> #include <limits> int main() { double f = 123.45; std::cout << "Given the number " << f << " or " << std::hexfloat << f << std::defaultfloat << " in hex,\n"; double f3; double f2 = std::modf(f, &f3); std::cout << "modf() makes " << f3 << " + " << f2 << '\n'; int i; f2 = std::frexp(f, &i); std::cout << "frexp() makes " << f2 << " * 2^" << i << '\n'; i = std::ilogb(f); std::cout << "logb()/ilogb() make " << f / std::scalbn(1.0, i) << " * " << std::numeric_limits<double>::radix << "^" << std::ilogb(f) << '\n'; // special values f2 = std::modf(-0.0, &f3); std::cout << "modf(-0) makes " << f3 << " + " << f2 << '\n'; f2 = std::modf(-INFINITY, &f3); std::cout << "modf(-Inf) makes " << f3 << " + " << f2 << '\n'; }
가능한 출력:
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex, modf() makes 123 + 0.45 frexp() makes 0.964453 * 2^7 logb()/ilogb() make 1.92891 * 2^6 modf(-0) makes -0 + -0 modf(-Inf) makes -INF + -0
참고 항목
|
(C++11)
(C++11)
(C++11)
|
주어진 값의 크기보다 크지 않은 가장 가까운 정수
(함수) |
|
C 문서
for
modf
|
|