Namespaces
Variants

frexp, frexpf, frexpl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
frexp
(C99) (C99)
(C99) (C23)
(C99)
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
Fast operation indicators
헤더 파일에 정의됨 <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부터)
1-3) 주어진 부동 소수점 값 x 를 정규화된 분수와 2의 정수 거듭제곱으로 분해합니다.
4) 타입-제네릭 매크로: 만약 arg long double 타입을 가지면, 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 는 다음과 같이 구현될 수 있습니다

{
    *exp = (value == 0) ? 0 : (int)(1 + logb(value));
    return scalbn(value, -(*exp));
}

함수 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 함수

참고 항목

숫자에 2의 거듭제곱을 곱함
(함수)
(C99) (C99) (C99)
주어진 숫자의 지수를 추출함
(함수)
(C99) (C99) (C99)
주어진 숫자의 지수를 추출함
(함수)
(C99) (C99)
숫자를 정수 부분과 분수 부분으로 분리함
(함수)