frexp, frexpf, frexpl
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더 파일에 정의됨
<math.h>
|
||
|
float
frexpf
(
float
arg,
int
*
exp
)
;
|
(1) | (C99부터) |
|
double
frexp
(
double
arg,
int
*
exp
)
;
|
(2) | |
|
long
double
frexpl
(
long
double
arg,
int
*
exp
)
;
|
(3) | (C99부터) |
|
헤더 파일에 정의됨
<tgmath.h>
|
||
|
#define frexp( arg, exp )
|
(4) | (C99부터) |
x
를 정규화된 분수와 2의 정수 거듭제곱으로 분해합니다.
frexpl
가 호출됩니다. 그렇지 않고
arg
가 정수 타입이나
double
타입을 가지면,
frexp
가 호출됩니다. 그 외의 경우에는 각각
frexpf
가 호출됩니다.
목차 |
매개변수
| arg | - | 부동 소수점 값 |
| exp | - | 지수를 저장할 정수 값에 대한 포인터 |
반환값
만약
arg
가 0이면, 0을 반환하고
*exp
에 0을 저장합니다.
그렇지 않은 경우 (즉
arg
가 0이 아닐 때), 오류가 발생하지 않으면 범위
(-1;-0.5], [0.5; 1)
내의 값
x
를 반환하고
*
exp
에 정수 값을 저장하여
x×2
(*exp)
=arg
가 되도록 합니다.
*exp
에 저장될 값이
int
의 범위를 벗어나는 경우, 동작은 명시되지 않습니다.
만약
arg
가 부동 소수점 숫자가 아니라면, 동작은 명시되지 않습니다.
오류 처리
이 함수는
math_errhandling
에 지정된 어떤 오류에도 영향을 받지 않습니다.
구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우,
-
만약
arg가 ±0이면, 수정 없이 반환되며 * exp 에0이 저장됩니다. -
만약
arg가 ±∞이면, 그대로 반환되며 * exp 에는 지정되지 않은 값이 저장됩니다. -
만약
arg가 NaN이면, NaN이 반환되며 * exp 에는 지정되지 않은 값이 저장됩니다. - 부동 소수점 예외가 발생하지 않습니다.
- 만약 FLT_RADIX 가 2 (또는 2의 거듭제곱)이면, 반환값은 정확하며 현재 반올림 모드 는 무시됩니다.
참고 사항
2진 시스템(여기서
FLT_RADIX
가
2
인 시스템)에서,
frexp
는 다음과 같이 구현될 수 있습니다
함수
frexp
는 그 쌍대 함수인
ldexp
와 함께 부동소수점 수의 표현을 직접적인 비트 조작 없이 다루는 데 사용될 수 있습니다.
예제
#include <float.h> #include <math.h> #include <stdio.h> int main(void) { double f = 123.45; printf("Given the number %.2f or %a in hex,\n", f, f); double f3; double f2 = modf(f, &f3); printf("modf() makes %.0f + %.2f\n", f3, f2); int i; f2 = frexp(f, &i); printf("frexp() makes %f * 2^%d\n", f2, i); i = ilogb(f); printf("logb()/ilogb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i); }
가능한 출력:
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
참고문헌
- C23 표준 (ISO/IEC 9899:2024):
-
- 7.12.6.4 frexp 함수들 (p: TBD)
-
- 7.25 타입-제네릭 수학 <tgmath.h> (p: TBD)
-
- F.10.3.4 frexp 함수들 (p: TBD)
- C17 표준 (ISO/IEC 9899:2018):
-
- 7.12.6.4 frexp 함수들 (p: TBD)
-
- 7.25 타입-제네릭 수학 <tgmath.h> (p: TBD)
-
- F.10.3.4 frexp 함수들 (p: TBD)
- C11 표준 (ISO/IEC 9899:2011):
-
- 7.12.6.4 frexp 함수들 (p: 243)
-
- 7.25 타입-제네릭 수학 <tgmath.h> (p: 373-375)
-
- F.10.3.4 frexp 함수들 (p: 521)
- C99 표준 (ISO/IEC 9899:1999):
-
- 7.12.6.4 frexp 함수들 (p: 224)
-
- 7.22 유형-일반 수학 <tgmath.h> (p: 335-337)
-
- F.9.3.4 frexp 함수들 (p: 458)
- C89/C90 표준 (ISO/IEC 9899:1990):
-
- 4.5.4.2 frexp 함수
참고 항목
|
(C99)
(C99)
|
숫자에 2의 거듭제곱을 곱함
(함수) |
|
(C99)
(C99)
(C99)
|
주어진 숫자의 지수를 추출함
(함수) |
|
(C99)
(C99)
(C99)
|
주어진 숫자의 지수를 추출함
(함수) |
|
(C99)
(C99)
|
숫자를 정수 부분과 분수 부분으로 분리함
(함수) |
|
C++ documentation
for
frexp
|
|