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)
(constexpr начиная с C++23) |
|
long
double
scalbnl
(
long
double
num,
int
exp
)
;
|
(3) |
(начиная с C++11)
(constexpr начиная с C++23) |
|
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)
(constexpr начиная с C++23) |
|
long
double
scalblnl
(
long
double
num,
long
exp
)
;
|
(6) |
(начиная с C++11)
(constexpr начиная с C++23) |
|
Определено в заголовочном файле
<cmath>
|
||
|
template
<
class
Integer
>
double scalbn ( Integer num, int exp ) ; |
(A) |
(начиная с C++11)
(constexpr начиная с C++23) |
|
template
<
class
Integer
>
double scalbln ( Integer num, long exp ) ; |
(B) |
(начиная с C++11)
(constexpr начиная с C++23) |
std::scalbn
и
std::scalbln
для всех типов с плавающей точкой без cv-квалификаторов в качестве типа параметра
num
.
(начиная с C++23)
Содержание |
Параметры
| num | - | значение с плавающей точкой или целочисленное значение |
| exp | - | целочисленное значение |
Возвращаемое значение
Если ошибок не возникает,
num
умноженное на
FLT_RADIX
в степени
exp
(
num×FLT_RADIX
exp
) возвращается.
Если происходит ошибка диапазона из-за переполнения,
±HUGE_VAL
,
±HUGE_VALF
, или
±HUGE_VALL
возвращается.
Если происходит ошибка диапазона из-за потери значимости (underflow), возвращается корректный результат (после округления).
Обработка ошибок
Ошибки сообщаются, как указано в 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
предназначены для эффективного выполнения операции, во многих реализациях они менее эффективны, чем умножение или деление на степень двойки с использованием арифметических операторов.
Название функции означает «new scalb», где
scalb
— это более старая нестандартная функция, второй аргумент которой имел тип с плавающей запятой.
Функция
std::scalbln
предоставляется потому, что множитель, необходимый для масштабирования от наименьшего положительного значения с плавающей точкой до наибольшего конечного, может превышать 32767 — гарантированный стандартом
INT_MAX
. В частности, для 80-битного
long
double
этот множитель составляет 32828.
Реализация GNU не устанавливает
errno
независимо от
math_errhandling
.
Дополнительные перегрузки не обязаны быть предоставлены именно в виде (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) << " (минимальное положительное субнормальное double)\n" << "scalbn(nextafter(1,0), 1024) = " << std::scalbn(std::nextafter(1,0), 1024) << " (наибольшее конечное double)\n"; // специальные значения std::cout << "scalbn(-0, 10) = " << std::scalbn(-0.0, 10) << '\n' << "scalbn(-Inf, -1) = " << std::scalbn(-INFINITY, -1) << '\n'; // обработка ошибок 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
для
scalbn
|
|