Namespaces
Variants

std:: scalbn, std:: scalbnf, std:: scalbnl, std:: scalbln, std:: scalblnf, std:: scalblnl

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
scalbn scalbln
(C++11) (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>
int exponent
(1)
float scalbn ( float num, int exp ) ;

double scalbn ( double num, int exp ) ;

long double scalbn ( long double num, int exp ) ;
(C++11부터)
(C++23까지)
constexpr /* floating-point-type */
scalbn ( /* floating-point-type */ num, int exp ) ;
(C++23부터)
float scalbnf ( float num, int exp ) ;
(2) (C++11부터)
(C++23부터 constexpr)
long double scalbnl ( long double num, int exp ) ;
(3) (C++11부터)
(C++23부터 constexpr)
long 지수
(4)
float scalbln ( float num, long exp ) ;

double scalbln ( double num, long exp ) ;

long double scalbln ( long double num, long exp ) ;
(C++11 이후)
(C++23 이전)
constexpr /* floating-point-type */
scalbln ( /* floating-point-type */ num, long exp ) ;
(C++23 이후)
float scalblnf ( float num, long exp ) ;
(5) (C++11부터)
(C++23부터 constexpr)
long double scalblnl ( long double num, long exp ) ;
(6) (C++11부터)
(C++23부터 constexpr)
헤더 파일에 정의됨 <cmath>
template < class Integer >
double scalbn ( Integer num, int exp ) ;
(A) (C++11부터)
(C++23부터 constexpr)
template < class Integer >
double scalbln ( Integer num, long exp ) ;
(B) (C++11부터)
(C++23부터 constexpr)
1-6) 부동 소수점 값 num FLT_RADIX exp 제곱으로 곱합니다. 라이브러리는 cv-unqualified 부동 소수점 타입들에 대해 std::scalbn std::scalbln 의 오버로드를 매개변수 num 의 타입으로 제공합니다. (C++23부터)
A,B) 모든 정수 타입에 대해 추가적인 오버로드가 제공되며, 이들은 double 로 처리됩니다.

목차

매개변수

num - 부동 소수점 또는 정수 값
exp - 정수 값

반환값

오류가 발생하지 않으면, num FLT_RADIX exp 제곱을 곱한 값 ( num×FLT_RADIX exp
)이 반환됩니다.

오버플로로 인한 범위 오류가 발생하면, ±HUGE_VAL , ±HUGE_VALF , 또는 ±HUGE_VALL 가 반환됩니다.

언더플로로 인한 범위 오류가 발생하면, 올바른 결과(반올림 후)가 반환됩니다.

오류 처리

오류는 math_errhandling 에 명시된 대로 보고됩니다.

구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우,

  • 범위 오류가 발생하지 않는 한, FE_INEXACT 는 절대 발생하지 않습니다 (결과는 정확함).
  • 범위 오류가 발생하지 않는 한, 현재 반올림 모드 는 무시됩니다.
  • 만약 num 이 ±0이면, 수정 없이 그대로 반환됩니다.
  • 만약 num 이 ±∞이면, 수정 없이 그대로 반환됩니다.
  • 만약 exp 이 0이면, num 이 수정 없이 그대로 반환됩니다.
  • 만약 num 이 NaN이면, NaN이 반환됩니다.

참고 사항

이진 시스템(여기서 FLT_RADIX 2 인 경우), std::scalbn std::ldexp 와 동등합니다.

비록 std::scalbn std::scalbln 이 해당 연산을 효율적으로 수행하도록 명세되어 있지만, 많은 구현에서 산술 연산자를 사용하여 2의 거듭제곱으로 곱셈이나 나눗셈을 수행하는 것보다 효율성이 낮습니다.

이 함수 이름은 "new scalb"를 의미하며, scalb 는 두 번째 인자가 부동 소수점 타입인 오래된 비표준 함수였습니다.

std::scalbln 함수가 제공되는 이유는 가장 작은 양의 부동 소수점 값에서 가장 큰 유한 값으로 스케일링하는 데 필요한 인자가 표준에서 보장된 INT_MAX 인 32767보다 클 수 있기 때문입니다. 특히, 80비트 long double 의 경우, 이 인자는 32828입니다.

GNU 구현체는 math_errhandling 과 관계없이 errno 를 설정하지 않습니다.

추가 오버로드는 반드시 (A,B) 형태로 정확히 제공될 필요가 없습니다. 정수 타입의 인수 num 에 대해 다음을 보장할 수 있을 만큼만 충분하면 됩니다:

  • std :: scalbn ( num, exp ) std :: scalbn ( static_cast < double > ( num ) , exp ) 와 동일한 효과를 가집니다.
  • std :: scalbln ( num, exp ) std :: scalbln ( static_cast < double > ( num ) , exp ) 와 동일한 효과를 가집니다.

예제

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::cout << "scalbn(7, -4) = " << std::scalbn(7, -4) << '\n'
              << "scalbn(1, -1074) = " << std::scalbn(1, -1074)
              << " (minimum positive subnormal double)\n"
              << "scalbn(nextafter(1,0), 1024) = "
              << std::scalbn(std::nextafter(1,0), 1024)
              << " (largest finite double)\n";
    // special values
    std::cout << "scalbn(-0, 10) = " << std::scalbn(-0.0, 10) << '\n'
              << "scalbn(-Inf, -1) = " << std::scalbn(-INFINITY, -1) << '\n';
    // error handling
    errno = 0;
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "scalbn(1, 1024) = " << std::scalbn(1, 1024) << '\n';
    if (errno == ERANGE)
        std::cout << "    errno == ERANGE: " << std::strerror(errno) << '\n';
    if (std::fetestexcept(FE_OVERFLOW))
        std::cout << "    FE_OVERFLOW raised\n";
}

가능한 출력:

scalbn(7, -4) = 0.4375
scalbn(1, -1074) = 4.94066e-324 (minimum positive subnormal double)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (largest finite double)
scalbn(-0, 10) = -0
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

참고 항목

(C++11) (C++11)
숫자를 가수와 밑수- 2 지수로 분해합니다
(함수)
(C++11) (C++11)
숫자에 2 의 정수 거듭제곱을 곱합니다
(함수)