Namespaces
Variants

std:: ldexp, std:: ldexpf, std:: ldexpl

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
ldexp
(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>
(1)
float ldexp ( float num, int exp ) ;

double ldexp ( double num, int exp ) ;

long double ldexp ( long 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)
Определено в заголовке <cmath>
template < class Integer >
double ldexp ( Integer num, int exp ) ;
(A) (начиная с C++11)
(constexpr начиная с C++23)
1-3) Умножает значение с плавающей точкой num на число 2 возведённое в степень exp . Библиотека предоставляет перегрузки 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 )
(функция)