std:: ldexp, std:: ldexpf, std:: ldexpl
|
Определено в заголовке
<cmath>
|
||
| (1) | ||
|
float
ldexp
(
float
num,
int
exp
)
;
double
ldexp
(
double
num,
int
exp
)
;
|
(до C++23) | |
|
constexpr
/* floating-point-type */
ldexp ( /* floating-point-type */ num, int exp ) ; |
(начиная с C++23) | |
|
float
ldexpf
(
float
num,
int
exp
)
;
|
(2) |
(начиная с C++11)
(constexpr начиная с C++23) |
|
long
double
ldexpl
(
long
double
num,
int
exp
)
;
|
(3) |
(начиная с C++11)
(constexpr начиная с C++23) |
|
Дополнительные перегрузки
(начиная с C++11)
|
||
|
Определено в заголовке
<cmath>
|
||
|
template
<
class
Integer
>
double ldexp ( Integer num, int exp ) ; |
(A) |
(начиная с C++11)
(constexpr начиная с C++23) |
std::ldexp
для всех типов с плавающей точкой без cv-квалификаторов в качестве типа параметра
num
.
(начиная с C++23)
|
A)
Дополнительные перегрузки предоставляются для всех целочисленных типов, которые трактуются как
double
.
|
(since C++11) |
Содержание |
Параметры
| num | - | значение с плавающей точкой или целое число |
| exp | - | целочисленное значение |
Возвращаемое значение
Если ошибок не возникает,
num
умноженное на 2 в степени
exp
(
num×2
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::ldexp
эквивалентен
std::scalbn
.
Функция
std::ldexp
("загрузка экспоненты") вместе со своей парной функцией
std::frexp
может использоваться для манипуляции представлением числа с плавающей запятой без прямых битовых операций.
Во многих реализациях
std::ldexp
менее эффективна, чем умножение или деление на степень двойки с использованием арифметических операторов.
Дополнительные перегрузки не обязаны быть предоставлены в точности как (A) . Они лишь должны быть достаточными для обеспечения того, чтобы для их аргумента num целочисленного типа, std :: ldexp ( num, exp ) имел тот же эффект, что и std :: ldexp ( static_cast < double > ( num ) , exp ) .
Для возведения 2 в степень с плавающей точкой std::exp2 может быть использована.
Пример
#include <cerrno> #include <cfenv> #include <cmath> #include <cstring> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::cout << "ldexp(5, 3) = 5 * 8 = " << std::ldexp(5, 3) << '\n' << "ldexp(7, -4) = 7 / 16 = " << std::ldexp(7, -4) << '\n' << "ldexp(1, -1074) = " << std::ldexp(1, -1074) << " (минимальное положительное денормализованное число float64_t)\n" << "ldexp(nextafter(1,0), 1024) = " << std::ldexp(std::nextafter(1,0), 1024) << " (наибольшее конечное число float64_t)\n"; // специальные значения std::cout << "ldexp(-0, 10) = " << std::ldexp(-0.0, 10) << '\n' << "ldexp(-Inf, -1) = " << std::ldexp(-INFINITY, -1) << '\n'; // обработка ошибок std::feclearexcept(FE_ALL_EXCEPT); errno = 0; const double inf = std::ldexp(1, 1024); const bool is_range_error = errno == ERANGE; std::cout << "ldexp(1, 1024) = " << inf << '\n'; if (is_range_error) std::cout << " errno == ERANGE: " << std::strerror(ERANGE) << '\n'; if (std::fetestexcept(FE_OVERFLOW)) std::cout << " FE_OVERFLOW raised\n"; }
Возможный вывод:
ldexp(5, 3) = 5 * 8 = 40
ldexp(7, -4) = 7 / 16 = 0.4375
ldexp(1, -1074) = 4.94066e-324 (minimum positive subnormal float64_t)
ldexp(nextafter(1,0), 1024) = 1.79769e+308 (largest finite float64_t)
ldexp(-0, 10) = -0
ldexp(-Inf, -1) = -inf
ldexp(1, 1024) = inf
errno == ERANGE: Numerical result out of range
FE_OVERFLOW raised
Смотрите также
|
(C++11)
(C++11)
|
разлагает число на мантиссу и показатель степени по основанию
2
(функция) |
|
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
|
умножает число на
FLT_RADIX
возведённое в степень
(функция) |
|
(C++11)
(C++11)
(C++11)
|
возвращает
2
возведённое в заданную степень (
2
x
)
(функция) |
|
Документация C
для
ldexp
|
|