std:: frexp, std:: frexpf, std:: frexpl
|
헤더 파일에 정의됨
<cmath>
|
||
| (1) | ||
|
float
frexp
(
float
num,
int
*
exp
)
;
double
frexp
(
double
num,
int
*
exp
)
;
|
(C++23 이전) | |
|
constexpr
/* floating-point-type */
frexp ( /* floating-point-type */ num, int * exp ) ; |
(C++23 이후) | |
|
float
frexpf
(
float
num,
int
*
exp
)
;
|
(2) |
(C++11 이후)
(C++23부터 constexpr) |
|
long
double
frexpl
(
long
double
num,
int
*
exp
)
;
|
(3) |
(C++11 이후)
(C++23부터 constexpr) |
|
추가 오버로드
(C++11 이후)
|
||
|
헤더 파일에 정의됨
<cmath>
|
||
|
template
<
class
Integer
>
double frexp ( Integer num, int * exp ) ; |
(A) | (C++23부터 constexpr) |
std::frexp
의 오버로드를 제공합니다.
(C++23부터)
|
A)
모든 정수 타입에 대해 추가 오버로드가 제공되며, 이들은
double
로 처리됩니다.
|
(since C++11) |
목차 |
매개변수
| num | - | 부동 소수점 또는 정수 값 |
| exp | - | 지수를 저장할 정수 값에 대한 포인터 |
반환값
만약 num 이 0이면, 0을 반환하고 * exp 에 0을 저장합니다.
그렇지 않은 경우 (
num
이 0이 아닐 때), 오류가 발생하지 않으면 범위
(-1, -0.5], [0.5, 1)
내의 값
x
를 반환하고,
*
exp
에 정수 값을 저장하여
x×2
(*exp)
== num
이 되도록 합니다.
저장할 값이 * exp 에서 int 의 범위를 벗어나는 경우, 동작은 명시되지 않습니다.
오류 처리
이 함수는 math_errhandling 에 지정된 어떤 오류에도 적용되지 않습니다.
구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우,
- 만약 num 이 ±0이면, 수정 없이 그대로 반환되며 0 이 * exp 에 저장됩니다.
- 만약 num 이 ±∞이면, 그대로 반환되며 지정되지 않은 값이 * exp 에 저장됩니다.
- 만약 num 이 NaN이면, NaN이 반환되며 지정되지 않은 값이 * exp 에 저장됩니다.
- 부동 소수점 예외가 발생하지 않습니다.
- 만약 FLT_RADIX 이 2(또는 2의 거듭제곱)이면, 반환값은 정확하며 현재 반올림 모드 는 무시됩니다.
참고 사항
2진법 시스템(여기서
FLT_RADIX
가
2
인 경우),
std::frexp
는 다음과 같이 구현될 수 있습니다
{ *exp = (value == 0) ? 0 : (int)(1 + std::logb(value)); return std::scalbn(value, -(*exp)); }
함수
std::frexp
는 그 쌍대 함수인
std::ldexp
와 함께 부동소수점 수의 표현을 직접적인 비트 조작 없이 다루는 데 사용될 수 있습니다.
추가 오버로드는 반드시 (A) 와 동일하게 제공될 필요는 없습니다. 정수 타입의 인자 num 에 대해 std :: frexp ( num, exp ) 가 std :: frexp ( static_cast < double > ( num ) , exp ) 와 동일한 효과를 보장할 수 있을 정도로만 제공되면 됩니다.
예제
다양한 부동 소수점 분해 함수들을 비교합니다:
#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'; }
가능한 출력:
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
참고 항목
|
(C++11)
(C++11)
|
숫자에 2의 정수 거듭제곱을 곱함
(함수) |
|
(C++11)
(C++11)
(C++11)
|
숫자의 지수를 추출함
(함수) |
|
(C++11)
(C++11)
(C++11)
|
숫자의 지수를 추출함
(함수) |
|
(C++11)
(C++11)
|
숫자를 정수 부분과 분수 부분으로 분해함
(함수) |
|
C 문서
for
frexp
|
|