std:: scalbn, std:: scalbnf, std:: scalbnl, std:: scalbln, std:: scalblnf, std:: scalblnl
|
헤더 파일에 정의됨
<cmath>
|
||
|
int
exponent
|
||
| (1) | ||
|
float
scalbn
(
float
num,
int
exp
)
;
double
scalbn
(
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
)
;
|
(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) |
std::scalbn
과
std::scalbln
의 오버로드를 매개변수
num
의 타입으로 제공합니다.
(C++23부터)
목차 |
매개변수
| 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
의 정수 거듭제곱을 곱합니다
(함수) |
|
C documentation
for
scalbn
|
|