Namespaces
Variants

std:: frexp, std:: frexpf, std:: frexpl

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
frexp
(C++11) (C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
헤더 파일에 정의됨 <cmath>
(1)
float frexp ( float num, int * exp ) ;

double frexp ( double num, int * exp ) ;

long double frexp ( long 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)
1-3) 주어진 부동 소수점 값 num 을 정규화된 가수와 2의 정수 지수로 분해합니다. 라이브러리는 매개변수 num 의 타입으로 모든 cv-한정자가 없는 부동소수점 타입에 대한 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