Namespaces
Variants

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

From ru.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)
(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 ) ;

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)
(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)
1-6) Умножает значение с плавающей точкой num на FLT_RADIX , возведённый в степень exp . Библиотека предоставляет перегрузки std::scalbn и std::scalbln для всех типов с плавающей точкой без cv-квалификаторов в качестве типа параметра num . (начиная с C++23)
A,B) Для всех целочисленных типов предоставлены дополнительные перегрузки, которые трактуются как double .

Содержание

Параметры

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 в целой степени
(функция)