29 Numerics library [numerics]

29.1 General [numerics.general]

В этом разделе описаны компоненты, которые программы на C ++ могут использовать для выполнения полуцифровых операций.

В следующих подпунктах описываются компоненты для типов комплексных чисел, генерации случайных чисел, числовых ( n-временно) массивов, обобщенных числовых алгоритмов и математических функций для типов с плавающей запятой, как показано в таблице 101.

Таблица 101 - Сводка библиотеки числовых значений
Подпункт Заголовок (ы)
[numerics.defns] Определения
[numeric.requirements] Требования
[cfenv] Среда с плавающей точкой <cfenv>
[complex.numbers] Сложные числа <complex>
[rand] Генерация случайных чисел <random>
[numarray] Числовые массивы <valarray>
[numeric.ops] Обобщенные числовые операции <numeric>
[c.math] Математические функции для <cmath>
типы с плавающей запятой <cstdlib>

29.2 Definitions [numerics.defns]

Определите GENERALIZED_­NONCOMMUTATIVE_­SUM(op, a1, ..., aN) следующее:

  • a1 когда N есть 1, иначе

  • op(GENERALIZED_­NONCOMMUTATIVE_­SUM(op, a1, ..., aK),
    op(GENERALIZED_­NONCOMMUTATIVE_­SUM(op, aM, ..., aN)) для любого K где 1<K+1=MN.

Определите GENERALIZED_­SUM(op, a1, ..., aN) как GENERALIZED_­NONCOMMUTATIVE_­SUM(op, b1, ..., bN), где b1, ..., bN может быть любая перестановка a1, ..., aN.

29.3 Numeric type requirements [numeric.requirements]

Компоненты complex и valarray параметризуются типом информации, которую они содержат и которыми управляют. Программа на C ++ должна создавать экземпляры этих компонентов только с типом, T который удовлетворяет следующим требованиям:267

  • T не является абстрактным классом (у него нет чистых виртуальных функций-членов);

  • T не является ссылочным типом;

  • T не имеет cv-квалификации;

  • Если T это класс, у него есть общедоступный конструктор по умолчанию;

  • Если T это класс, у него есть общедоступный конструктор копии с подписью T​::​T(const T&)

  • Если T это класс, у него есть открытый деструктор;

  • Если T это класс, то есть оператор общественного назначения , чья подпись либо T& T​::​operator=(const T&) или T& T​::​operator=(T)

  • Если T это класс, его оператор присваивания, конструкторы копирования и по умолчанию, а также деструктор должны соответствовать друг другу в следующем смысле:

    • Инициализация необработанного хранилища с использованием конструктора копирования для значения, независимо от T()полученного, семантически эквивалентна инициализации значения того же необработанного хранилища.

    • Инициализация необработанного хранилища с использованием конструктора по умолчанию с последующим назначением семантически эквивалентна инициализации необработанного хранилища с использованием конструктора копирования.

    • Уничтожение объекта с последующей инициализацией его необработанного хранилища с помощью конструктора копирования семантически эквивалентно назначению исходному объекту.

    [ Note: Это правило частично заявляет, что не должно быть никаких тонких различий в семантике инициализации и присваивания. Это дает реализации значительную гибкость в инициализации массивов.

    [ Example: Реализация может инициализировать a valarray путем выделения памяти с помощью new оператора (что подразумевает вызов конструктора по умолчанию для каждого элемента) и последующего присвоения каждому элементу его значения. Или реализация может выделить необработанное хранилище и использовать конструктор копирования для инициализации каждого элемента. ]end example

    Если различие между инициализацией и присваиванием важно для класса или если он не удовлетворяет любому из других условий, перечисленных выше, программист должен использовать vector вместо этого valarray для этого класса. ] end note

  • Если T это класс, он не перегружает унарный operator&.

Если какая-либо операция T вызывает исключение, эффекты не определены.

Кроме того, многие функции-члены и связанные функции valarray<T> могут быть успешно созданы и будут демонстрировать четко определенное поведение тогда и только тогда, когда T удовлетворяют дополнительным требованиям, указанным для каждого такого члена или связанной функции.

[ Example: Создание экземпляра допустимо valarray<complex>, но operator>() не будет успешно создано для valarray<complex> операндов, так complex как не имеет операторов упорядочивания. ]end example

Другими словами, типы значений. К ним относятся арифметические типы, указатели, класс библиотеки complexи экземпляры valarray для типов значений.

29.4 The floating-point environment [cfenv]

29.4.1 Header <cfenv> synopsis [cfenv.syn]

#define FE_ALL_EXCEPT see below
#define FE_DIVBYZERO see below
#define FE_INEXACT see below
#define FE_INVALID see below
#define FE_OVERFLOW see below
#define FE_UNDERFLOW see below

#define FE_DOWNWARD see below
#define FE_TONEAREST see below
#define FE_TOWARDZERO see below
#define FE_UPWARD see below

#define FE_DFL_ENV see below

namespace std {
  // types
  using fenv_t    = object type;
  using fexcept_t = integer type;

  // functions
  int feclearexcept(int except);
  int fegetexceptflag(fexcept_t* pflag, int except);
  int feraiseexcept(int except);
  int fesetexceptflag(const fexcept_t* pflag, int except);
  int fetestexcept(int except);

  int fegetround();
  int fesetround(int mode);

  int fegetenv(fenv_t* penv);
  int feholdexcept(fenv_t* penv);
  int fesetenv(const fenv_t* penv);
  int feupdateenv(const fenv_t* penv);
}

Содержание и значение заголовка <cfenv> такие же , как заголовок стандартной библиотеки C <fenv.h>. [ Note: Этот международный стандарт не требует реализации для поддержки FENV_­ACCESS прагмы; это определяется реализацией ( [cpp.pragma]), поддерживается ли прагма. Как следствие, это определяется реализацией, могут ли эти функции использоваться для проверки флагов состояния с плавающей запятой, установки режимов управления с плавающей запятой или работы с нестандартными настройками режима. Если прагма используется для включения управления средой с плавающей запятой, этот международный стандарт не определяет влияние на вычисление с плавающей запятой в константных выражениях. ]end note

Среда с плавающей запятой имеет thread storage duration. Начальное состояние для среды с плавающей запятой потока - это состояние среды с плавающей запятой того потока, который конструирует соответствующий thread object объект во время создания объекта. [ Note: То есть дочерний поток получает состояние с плавающей запятой родительского потока во время создания дочернего потока. ] end note

Для каждого потока должна поддерживаться отдельная среда с плавающей запятой. Каждая функция обращается к среде, соответствующей ее вызывающему потоку.

См. Также: ISO C 7.6

29.5 Complex numbers [complex.numbers]

Заголовок определяет шаблон класса и многочисленные функции для представления и управления комплексными числами.<complex>

Эффект обработки шаблона complex для любого другого типа , чем float, doubleили long double не определен. Специальности complex<float>, complex<double>и complex<long double> являются literal types.

Если результат функции не определен математически или не входит в диапазон представимых значений для ее типа, поведение не определено.

Если z это lvalue-выражение типа, cv complex<T> то:

  • выражение reinterpret_­cast<cv T(&)[2]>(z) должно быть правильным,

  • reinterpret_­cast<cv T(&)[2]>(z)[0] обозначает действительную часть z, а

  • reinterpret_­cast<cv T(&)[2]>(z)[1] обозначают мнимую часть z.

Более того, если a это выражение типа, cv complex<T>* а выражение a[i] четко определено для целочисленного выражения i, то:

  • reinterpret_­cast<cv T*>(a)[2*i] обозначает действительную часть a[i], а

  • reinterpret_­cast<cv T*>(a)[2*i + 1] обозначают мнимую часть a[i].

29.5.1 Header <complex> synopsis [complex.syn]

namespace std {
  template<class T> class complex;
  template<> class complex<float>;
  template<> class complex<double>;
  template<> class complex<long double>;

  // [complex.ops], operators
  template<class T>
    complex<T> operator+(const complex<T>&, const complex<T>&);
  template<class T> complex<T> operator+(const complex<T>&, const T&);
  template<class T> complex<T> operator+(const T&, const complex<T>&);

  template<class T> complex<T> operator-(
    const complex<T>&, const complex<T>&);
  template<class T> complex<T> operator-(const complex<T>&, const T&);
  template<class T> complex<T> operator-(const T&, const complex<T>&);

  template<class T> complex<T> operator*(
    const complex<T>&, const complex<T>&);
  template<class T> complex<T> operator*(const complex<T>&, const T&);
  template<class T> complex<T> operator*(const T&, const complex<T>&);

  template<class T> complex<T> operator/(
    const complex<T>&, const complex<T>&);
  template<class T> complex<T> operator/(const complex<T>&, const T&);
  template<class T> complex<T> operator/(const T&, const complex<T>&);

  template<class T> complex<T> operator+(const complex<T>&);
  template<class T> complex<T> operator-(const complex<T>&);

  template<class T> constexpr bool operator==(
    const complex<T>&, const complex<T>&);
  template<class T> constexpr bool operator==(const complex<T>&, const T&);
  template<class T> constexpr bool operator==(const T&, const complex<T>&);

  template<class T> constexpr bool operator!=(const complex<T>&, const complex<T>&);
  template<class T> constexpr bool operator!=(const complex<T>&, const T&);
  template<class T> constexpr bool operator!=(const T&, const complex<T>&);

  template<class T, class charT, class traits>
  basic_istream<charT, traits>&
  operator>>(basic_istream<charT, traits>&, complex<T>&);

  template<class T, class charT, class traits>
  basic_ostream<charT, traits>&
  operator<<(basic_ostream<charT, traits>&, const complex<T>&);

  // [complex.value.ops], values
  template<class T> constexpr T real(const complex<T>&);
  template<class T> constexpr T imag(const complex<T>&);

  template<class T> T abs(const complex<T>&);
  template<class T> T arg(const complex<T>&);
  template<class T> T norm(const complex<T>&);

  template<class T> complex<T> conj(const complex<T>&);
  template<class T> complex<T> proj(const complex<T>&);
  template<class T> complex<T> polar(const T&, const T& = 0);

  // [complex.transcendentals], transcendentals
  template<class T> complex<T> acos(const complex<T>&);
  template<class T> complex<T> asin(const complex<T>&);
  template<class T> complex<T> atan(const complex<T>&);

  template<class T> complex<T> acosh(const complex<T>&);
  template<class T> complex<T> asinh(const complex<T>&);
  template<class T> complex<T> atanh(const complex<T>&);

  template<class T> complex<T> cos  (const complex<T>&);
  template<class T> complex<T> cosh (const complex<T>&);
  template<class T> complex<T> exp  (const complex<T>&);
  template<class T> complex<T> log  (const complex<T>&);
  template<class T> complex<T> log10(const complex<T>&);

  template<class T> complex<T> pow  (const complex<T>&, const T&);
  template<class T> complex<T> pow  (const complex<T>&, const complex<T>&);
  template<class T> complex<T> pow  (const T&, const complex<T>&);

  template<class T> complex<T> sin  (const complex<T>&);
  template<class T> complex<T> sinh (const complex<T>&);
  template<class T> complex<T> sqrt (const complex<T>&);
  template<class T> complex<T> tan  (const complex<T>&);
  template<class T> complex<T> tanh (const complex<T>&);

  // [complex.literals], complex literals
  inline namespace literals {
    inline namespace complex_literals {
      constexpr complex<long double> operator""il(long double);
      constexpr complex<long double> operator""il(unsigned long long);
      constexpr complex<double> operator""i(long double);
      constexpr complex<double> operator""i(unsigned long long);
      constexpr complex<float> operator""if(long double);
      constexpr complex<float> operator""if(unsigned long long);
    }
  }
}

29.5.2 Class template complex [complex]

namespace std {
  template<class T>
  class complex {
  public:
    using value_type = T;

    constexpr complex(const T& re = T(), const T& im = T());
    constexpr complex(const complex&);
    template<class X> constexpr complex(const complex<X>&);

    constexpr T real() const;
    void real(T);
    constexpr T imag() const;
    void imag(T);

    complex<T>& operator= (const T&);
    complex<T>& operator+=(const T&);
    complex<T>& operator-=(const T&);
    complex<T>& operator*=(const T&);
    complex<T>& operator/=(const T&);

    complex& operator=(const complex&);
    template<class X> complex<T>& operator= (const complex<X>&);
    template<class X> complex<T>& operator+=(const complex<X>&);
    template<class X> complex<T>& operator-=(const complex<X>&);
    template<class X> complex<T>& operator*=(const complex<X>&);
    template<class X> complex<T>& operator/=(const complex<X>&);
  };
}

Класс complex описывает объект, который может хранить декартовы компоненты real() и imag()комплексного числа.

29.5.3 complex specializations [complex.special]

namespace std {
  template<> class complex<float> {
  public:
    using value_type = float;

    constexpr complex(float re = 0.0f, float im = 0.0f);
    constexpr explicit complex(const complex<double>&);
    constexpr explicit complex(const complex<long double>&);

    constexpr float real() const;
    void real(float);
    constexpr float imag() const;
    void imag(float);

    complex<float>& operator= (float);
    complex<float>& operator+=(float);
    complex<float>& operator-=(float);
    complex<float>& operator*=(float);
    complex<float>& operator/=(float);

    complex<float>& operator=(const complex<float>&);
    template<class X> complex<float>& operator= (const complex<X>&);
    template<class X> complex<float>& operator+=(const complex<X>&);
    template<class X> complex<float>& operator-=(const complex<X>&);
    template<class X> complex<float>& operator*=(const complex<X>&);
    template<class X> complex<float>& operator/=(const complex<X>&);
  };

  template<> class complex<double> {
  public:
    using value_type = double;

    constexpr complex(double re = 0.0, double im = 0.0);
    constexpr complex(const complex<float>&);
    constexpr explicit complex(const complex<long double>&);

    constexpr double real() const;
    void real(double);
    constexpr double imag() const;
    void imag(double);

    complex<double>& operator= (double);
    complex<double>& operator+=(double);
    complex<double>& operator-=(double);
    complex<double>& operator*=(double);
    complex<double>& operator/=(double);

    complex<double>& operator=(const complex<double>&);
    template<class X> complex<double>& operator= (const complex<X>&);
    template<class X> complex<double>& operator+=(const complex<X>&);
    template<class X> complex<double>& operator-=(const complex<X>&);
    template<class X> complex<double>& operator*=(const complex<X>&);
    template<class X> complex<double>& operator/=(const complex<X>&);
  };

  template<> class complex<long double> {
  public:
    using value_type = long double;

    constexpr complex(long double re = 0.0L, long double im = 0.0L);
    constexpr complex(const complex<float>&);
    constexpr complex(const complex<double>&);

    constexpr long double real() const;
    void real(long double);
    constexpr long double imag() const;
    void imag(long double);

    complex<long double>& operator=(const complex<long double>&);
    complex<long double>& operator= (long double);
    complex<long double>& operator+=(long double);
    complex<long double>& operator-=(long double);
    complex<long double>& operator*=(long double);
    complex<long double>& operator/=(long double);

    template<class X> complex<long double>& operator= (const complex<X>&);
    template<class X> complex<long double>& operator+=(const complex<X>&);
    template<class X> complex<long double>& operator-=(const complex<X>&);
    template<class X> complex<long double>& operator*=(const complex<X>&);
    template<class X> complex<long double>& operator/=(const complex<X>&);
  };
}

29.5.4 complex member functions [complex.members]

template<class T> constexpr complex(const T& re = T(), const T& im = T());

Effects: Создает объект класса complex.

Postconditions: real() == re && imag() == im.

constexpr T real() const;

Returns: Стоимость реальной составляющей.

void real(T val);

Effects: Присваивается val к реальному компоненту.

constexpr T imag() const;

Returns: Значение мнимой составляющей.

void imag(T val);

Effects: Присваивается val мнимой составляющей.

29.5.5 complex member operators [complex.member.ops]

complex<T>& operator+=(const T& rhs);

Effects: Добавляет скалярное значение rhs к действительной части комплексного значения *this и сохраняет результат в действительной части *this, оставляя мнимую часть неизменной.

Returns: *this.

complex<T>& operator-=(const T& rhs);

Effects: Вычитает скалярное значение rhs из действительной части комплексного значения *this и сохраняет результат в действительной части *this, оставляя мнимую часть неизменной.

Returns: *this.

complex<T>& operator*=(const T& rhs);

Effects: Умножает скалярное значение rhs на комплексное значение *this и сохраняет результат в формате *this.

Returns: *this.

complex<T>& operator/=(const T& rhs);

Effects: Делит скалярное значение rhs на комплексное *this и сохраняет результат в формате *this.

Returns: *this.

template<class X> complex<T>& operator+=(const complex<X>& rhs);

Effects: Добавляет комплексное значение rhs к комплексному значению *this и сохраняет сумму в *this.

Returns: *this.

template<class X> complex<T>& operator-=(const complex<X>& rhs);

Effects: Вычитает комплексное значение rhs из комплексного значения *this и сохраняет разницу в *this.

Returns: *this.

template<class X> complex<T>& operator*=(const complex<X>& rhs);

Effects: Умножает комплексное значение rhs на комплексное значение *this и сохраняет продукт в *this.

Returns: *this.

template<class X> complex<T>& operator/=(const complex<X>& rhs);

Effects: Делит комплексное значение rhs на комплексное *this и сохраняет частное в *this.

Returns: *this.

29.5.6 complex non-member operations [complex.ops]

template<class T> complex<T> operator+(const complex<T>& lhs);

Returns: complex<T>(lhs).

Remarks: унарный оператор.

template<class T> complex<T> operator+(const complex<T>& lhs, const complex<T>& rhs); template<class T> complex<T> operator+(const complex<T>& lhs, const T& rhs); template<class T> complex<T> operator+(const T& lhs, const complex<T>& rhs);

Returns: complex<T>(lhs) += rhs.

template<class T> complex<T> operator-(const complex<T>& lhs);

Returns: complex<T>(-lhs.real(),-lhs.imag()).

Remarks: унарный оператор.

template<class T> complex<T> operator-(const complex<T>& lhs, const complex<T>& rhs); template<class T> complex<T> operator-(const complex<T>& lhs, const T& rhs); template<class T> complex<T> operator-(const T& lhs, const complex<T>& rhs);

Returns: complex<T>(lhs) -= rhs.

template<class T> complex<T> operator*(const complex<T>& lhs, const complex<T>& rhs); template<class T> complex<T> operator*(const complex<T>& lhs, const T& rhs); template<class T> complex<T> operator*(const T& lhs, const complex<T>& rhs);

Returns: complex<T>(lhs) *= rhs.

template<class T> complex<T> operator/(const complex<T>& lhs, const complex<T>& rhs); template<class T> complex<T> operator/(const complex<T>& lhs, const T& rhs); template<class T> complex<T> operator/(const T& lhs, const complex<T>& rhs);

Returns: complex<T>(lhs) /= rhs.

template<class T> constexpr bool operator==(const complex<T>& lhs, const complex<T>& rhs); template<class T> constexpr bool operator==(const complex<T>& lhs, const T& rhs); template<class T> constexpr bool operator==(const T& lhs, const complex<T>& rhs);

Returns: lhs.real() == rhs.real() && lhs.imag() == rhs.imag().

Remarks: Предполагается, что мнимая часть аргументов равна T()0,0 T.

template<class T> constexpr bool operator!=(const complex<T>& lhs, const complex<T>& rhs); template<class T> constexpr bool operator!=(const complex<T>& lhs, const T& rhs); template<class T> constexpr bool operator!=(const T& lhs, const complex<T>& rhs);

Returns: rhs.real() != lhs.real() || rhs.imag() != lhs.imag().

template<class T, class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is, complex<T>& x);

Requires: Входные значения должны быть преобразованы в T.

Effects: Экстракты комплексного числа x в виде: u, (u)или (u,v), где u это действительная часть и v мнимая часть ( [istream.formatted]).

Если обнаруживается неправильный ввод, вызывается is.setstate(ios_­base​::​failbit) (который может throw ios​::​failure ( [iostate.flags])).

Returns: is.

Remarks: Эта экстракция выполняется как серия более простых экстракций. Таким образом, пропуск пробелов должен быть одинаковым для всех более простых извлечений.

template<class T, class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);

Effects: Вставляет комплексное число x в поток, o как если бы это было реализовано следующим образом:

basic_ostringstream<charT, traits> s;
s.flags(o.flags());
s.imbue(o.getloc());
s.precision(o.precision());
s << '(' << x.real() << "," << x.imag() << ')';
return o << s.str();

[ Note: В языковом стандарте, в котором запятая используется в качестве символа десятичной точки, использование запятой в качестве разделителя полей может быть неоднозначным. Вставка showpoint в выходной поток заставляет все выходные данные показывать явный десятичный знак; в результате все вставленные последовательности комплексных чисел могут быть однозначно извлечены. ] end note

29.5.7 complex value operations [complex.value.ops]

template<class T> constexpr T real(const complex<T>& x);

Returns: x.real().

template<class T> constexpr T imag(const complex<T>& x);

Returns: x.imag().

template<class T> T abs(const complex<T>& x);

Returns: Величина x.

template<class T> T arg(const complex<T>& x);

Returns: Фазовый угол x, или atan2(imag(x), real(x)).

template<class T> T norm(const complex<T>& x);

Returns: Квадрат величины x.

template<class T> complex<T> conj(const complex<T>& x);

Returns: Комплексное сопряжение x.

template<class T> complex<T> proj(const complex<T>& x);

Returns: Проекция x на сферу Римана.

Remarks: Ведет себя так же, как функция C cproj, определенная в 7.3.9.4.

template<class T> complex<T> polar(const T& rho, const T& theta = 0);

Requires: rho должно быть неотрицательным и отличным от NaN. theta будет конечным.

Returns: complex Значение , соответствующее комплексное число, величина которого rho и чье фазовый угол theta.

29.5.8 complex transcendentals [complex.transcendentals]

template<class T> complex<T> acos(const complex<T>& x);

Returns: Комплексный арккосинус x.

Remarks: Действует так же, как функция C cacos, определенная в 7.3.5.1.

template<class T> complex<T> asin(const complex<T>& x);

Returns: Сложный арксинус x.

Remarks: Ведет себя так же, как функция C casin, определенная в 7.3.5.2.

template<class T> complex<T> atan(const complex<T>& x);

Returns: Комплексная арктангенс x.

Remarks: Действует так же, как функция C catan, определенная в 7.3.5.3.

template<class T> complex<T> acosh(const complex<T>& x);

Returns: Комплексный арочный гиперболический косинус x.

Remarks: Действует так же, как функция C cacosh, определенная в 7.3.6.1.

template<class T> complex<T> asinh(const complex<T>& x);

Returns: Сложный дуговый гиперболический синус x.

Remarks: Ведет себя так же, как функция C casinh, определенная в 7.3.6.2.

template<class T> complex<T> atanh(const complex<T>& x);

Returns: Комплексный арочный гиперболический тангенс x.

Remarks: Действует так же, как функция C catanh, определенная в 7.3.6.3.

template<class T> complex<T> cos(const complex<T>& x);

Returns: Комплексный косинус x.

template<class T> complex<T> cosh(const complex<T>& x);

Returns: Комплексный гиперболический косинус x.

template<class T> complex<T> exp(const complex<T>& x);

Returns: Комплексное основание - e экспонента x.

template<class T> complex<T> log(const complex<T>& x);

Returns: Комплексный натуральный eлогарифм по основанию x. Для всех x, imag(log(x)) лежит в интервале [π, π], а когда x отрицательное вещественное число, imag(log(x)) является π.

Remarks: Срезы ответвлений проходят по отрицательной действительной оси.

template<class T> complex<T> log10(const complex<T>& x);

Returns: Комплексный общий (основанный 10) логарифм числа x, определяемый как log(x) / log(10).

Remarks: Срезы ответвлений проходят по отрицательной действительной оси.

template<class T> complex<T> pow(const complex<T>& x, const complex<T>& y); template<class T> complex<T> pow(const complex<T>& x, const T& y); template<class T> complex<T> pow(const T& x, const complex<T>& y);

Returns: Комплексная мощность базы x возведена в yth степень, определяемую как exp(y * log(x)). Возвращаемое значение pow(0, 0) определяется реализацией.

Remarks: Срезы ответвлений проходят по отрицательной действительной оси.

template<class T> complex<T> sin(const complex<T>& x);

Returns: Сложный синус x.

template<class T> complex<T> sinh(const complex<T>& x);

Returns: Сложный гиперболический синус x.

template<class T> complex<T> sqrt(const complex<T>& x);

Returns: Комплексный квадратный корень из xдиапазона в правой полуплоскости. Если аргумент - отрицательное действительное число, возвращаемое значение лежит на положительной мнимой оси.

Remarks: Срезы ответвлений проходят по отрицательной действительной оси.

template<class T> complex<T> tan(const complex<T>& x);

Returns: Комплексный тангенс x.

template<class T> complex<T> tanh(const complex<T>& x);

Returns: Комплексный гиперболический тангенс x.

29.5.9 Additional overloads [cmplx.over]

Следующие шаблоны функций должны иметь дополнительные перегрузки:

arg                   norm
conj                  proj
imag                  real

Дополнительных перегрузок должно быть достаточно для обеспечения:

  1. 1.Если аргумент имеет тип long double, он фактически приводится к типу complex<long double>.

  2. 2.В противном случае, если аргумент имеет тип double или целочисленный тип, он эффективно приводится к complex<​double>.

  3. 3.В противном случае, если аргумент имеет тип float, он фактически приводится к типу complex<float>.

Шаблон функции pow должен иметь дополнительные перегрузки, достаточные для обеспечения вызова хотя бы с одним аргументом типа complex<T>:

  1. 1.Если какой-либо из аргументов имеет тип complex<long double> или тип long double, то оба аргумента эффективно приводятся к complex<long double>.

  2. 2.В противном случае, если любой из аргументов имеет тип complex<double>, doubleили целочисленный тип, то оба аргумента эффективно приводятся к complex<double>.

  3. 3.В противном случае, если у любого из аргументов есть тип complex<float> или float, то оба аргумента эффективно приводятся к complex<float>.

29.5.10 Suffixes for complex number literals [complex.literals]

В этом разделе описаны буквальные суффиксы для построения литералов комплексных чисел. Суффиксы i, ilи if создают комплексные числа типов complex<double>, complex<long double>и, complex<float> соответственно, при этом их мнимая часть обозначается заданным буквальным числом, а действительная часть равна нулю.

constexpr complex<long double> operator""il(long double d); constexpr complex<long double> operator""il(unsigned long long d);

Returns: complex<long double>{0.0L, static_­cast<long double>(d)}.

constexpr complex<double> operator""i(long double d); constexpr complex<double> operator""i(unsigned long long d);

Returns: complex<double>{0.0, static_­cast<double>(d)}.

constexpr complex<float> operator""if(long double d); constexpr complex<float> operator""if(unsigned long long d);

Returns: complex<float>{0.0f, static_­cast<float>(d)}.

29.6 Random number generation [rand]

В этом подпункте определяется средство для генерации (псевдо-) случайных чисел.

В дополнении к нескольким утилитам, четыре категории субъектов описана: uniform random bit generators, random number engines, random number engine adaptors, и random number distributions. Эти классификации применимы к типам, которые удовлетворяют соответствующим требованиям, к объектам, экземплярам которых создаются из таких типов, и к шаблонам, создающим такие типы при создании экземпляров. [ Note: Эти сущности определены таким образом, чтобы разрешить привязку любого однородного объекта генератора случайных битов e в качестве аргумента к любому объекту распределения случайных чисел d, создавая таким образом объект функции с нулевым аргументом, такой как заданный bind(d,e). ]end note

Каждая из сущностей, указанных в этом подпункте, имеет ассоциированный объект, arithmetic type обозначенный как result_­type. В T качестве result_­type связанного с такой сущностью, эта сущность характеризуется:

  1. a)как boolean или эквивалентно как boolean-valued, если T есть bool;

  2. b)иначе как integral или эквивалентно как integer-valued, если numeric_­limits<T>​::​is_­integer есть true;

  3. c)иначе как floating или эквивалентно как real-valued.

В случае целочисленного значения объект может дополнительно характеризоваться как signed или unsigned, в соответствии с numeric_­limits<T>​::​is_­signed.

Если не указано иное, во всех описаниях вычислений в этом подпункте используются математические действительные числа.

В этом подпункте операторы bitand , bitor и xor обозначают соответствующие стандартные побитовые операции. Дальше:

  1. a)оператор rshift обозначает побитовый сдвиг вправо с нулевыми битами, появляющимися в старших битах результата, и

  2. b)оператор lshiftw обозначает побитовый сдвиг влево с нулевыми битами, появляющимися в младших битах результата, и чей результат всегда берется по модулю 2w.

29.6.1 Requirements [rand.req]

29.6.1.1 General requirements [rand.req.genl]

В этом подпункте [rand]эффект создания экземпляра шаблона:

  1. a)с параметром типа шаблона с именем Sseq undefined, если соответствующий аргумент шаблона не является cv-unqualified и удовлетворяет требованиям seed sequence.

  2. b)с параметром типа шаблона с именем URBG undefined, если соответствующий аргумент шаблона не является cv-unqualified и удовлетворяет требованиям uniform random bit generator.

  3. c)с параметром типа шаблона с именем Engine undefined, если соответствующий аргумент шаблона не является cv-unqualified и удовлетворяет требованиям random number engine.

  4. d)что параметр типа шаблона с именем RealType не определен , если соответствующий аргумент шаблона не резюме, неквалифицированное и один из float, doubleили long double.

  5. e)который имеет тип параметра шаблона с именем IntType не определен , если соответствующий аргумент шаблона не резюме, неквалифицированные и один из short, int, long, long long, unsigned short, unsigned int, unsigned long, или unsigned long long.

  6. f)что параметр типа шаблона с именем UIntType не определен , если соответствующий аргумент шаблона не резюме, неквалифицированное и один из unsigned short, unsigned int, unsigned longили unsigned long long.

В этом подпункте [rand]фразы вида « x является итератором определенного типа» должны интерпретироваться как эквивалентные более формальному требованию, что « x является значением типа, удовлетворяющим требованиям указанного типа итератора».

В этом подпункте [rand]должен быть объявлен любой конструктор, который может быть вызван с одним аргументом и который удовлетворяет требованиям, указанным в этом подпункте explicit.

29.6.1.2 Seed sequence requirements [rand.req.seedseq]

Является объектом , который потребляет последовательность целочисленных данных и производит требуемое число без знака целочисленных значений , на основе потребляемых данных. [ Такой объект предоставляет механизм, позволяющий избежать репликации потоков случайных значений. Это может быть полезно, например, в приложениях, требующих большого количества машин случайных чисел. ] seed sequence i 0i<232Note: end note

Класс S удовлетворяет требованиям начальной последовательности, если выражения, показанные в таблице 102 , действительны и имеют указанную семантику, а S также если они удовлетворяют всем другим требованиям этого раздела [rand.req.seedseq]. В этой таблице и в этом разделе:

  1. a)T тип, названный Sассоциированным result_­type;

  2. b)q является значением S и, r возможно, константным значением S;

  3. c)ib и ie являются итераторами ввода с целым числом без знака value_­type длиной не менее 32 бит;

  4. d)rb и re являются изменяемыми итераторами произвольного доступа с целым числом без знака value_­type не менее 32 бит;

  5. e)ob - итератор вывода; а также

  6. f)il это значение initializer_­list<T>.

Таблица 102 - Требования к последовательности посева
ВыражениеТип возвратаДо / после состоянияСложность
S​::​result_­type T T представляет собой , unsigned integer type по меньшей мере , 32 бита. время компиляции
S() Создает начальную последовательность с тем же начальным состоянием, что и все другие исходные последовательности типа, сконструированные по умолчанию S. постоянный
S(ib,ie) Создает начальную последовательность, имеющую внутреннее состояние, которое зависит от некоторых или всех битов предоставленной последовательности [ib,ie). O(ieib)
S(il) То же, что и S(il.begin(), il.end()). такой же как S(il.begin(), il.end())
q.generate(rb,re) void Ничего не делает, если rb == re. В противном случае заполняет предоставленную последовательность [rb,re) 32-битными величинами, которые зависят от последовательности, предоставленной конструктору, и, возможно, также зависят от истории generateпредыдущих вызовов. O(rerb)
r.size() size_­t Количество 32-битных единиц, которые будут скопированы при вызове r.param. постоянный
r.param(ob) void Копирует в указанное место назначения последовательность 32-битных единиц, которые могут быть предоставлены конструктору второго объекта типа S, и которые будут воспроизводить в этом втором объекте состояние, неотличимое от состояния первого объекта. O(r.size())

29.6.1.3 Uniform random bit generator requirements [rand.req.urng]

uniform random bit generator g Типа G является функция объекта возвращение целого числа без знака значения , такой , что каждое значение в диапазоне возможных результатов имеет ( в идеале) , равная вероятности быть возвращены. [ Note: Степень gприближения результатов к идеалу часто определяется статистически. ]end note

Класс G удовлетворяет требованиям a, uniform random bit generator если выражения, показанные в таблице 103 , действительны и имеют указанную семантику, а G также если удовлетворяет всем другим требованиям этого раздела [rand.req.urng]. В этой таблице и в этом разделе:

  1. a)T тип, названный Gассоциированным result_­type, и

  2. b)g это значение G.

Таблица 103 - Требования к генератору единых случайных битов
ВыражениеТип возвратаДо / после состоянияСложность
G​::​result_­type T T это unsigned integer type. время компиляции
g() T Возвращает значение в замкнутом интервале [G​::​min(), G​::​max()]. амортизированная постоянная
G​::​min() T Обозначает наименьшее значение, которое потенциально может вернуть operator(). время компиляции
G​::​max() T Обозначает наибольшее значение, которое потенциально может вернуть operator(). время компиляции

Следующее соотношение должно занимать: G​::​min() < G​::​max().

29.6.1.4 Random number engine requirements [rand.req.eng]

random number engine (Обычно сокращенно engine) e типа E является равномерной случайной генератор битов , что дополнительно отвечает требованиям (например, для посева , а также для ввода / вывода) , указанные в данном разделе.

В любой момент времени e имеет состояние ei для некоторого целого числа i0. При постройке e имеет исходное состояние e0. Состояние двигателя может быть установлено с помощью конструктора, seed функции, присваивания или подходящего operator>>.

Eспецификация должна определять:

  1. a)размер Eсостояния, кратный размеру result_­type, заданному как интегральное постоянное выражение;

  2. b) transition algorithm TA , с помощью которого e«s государства ei продвигаются к его successor state ei+1; а также

  3. c)с generation algorithm GA помощью которого состояние двигателя отображается на значение типа result_­type.

Класс, E который удовлетворяет требованиям a, uniform random bit generator также удовлетворяет требованиям a, random number engine если выражения, показанные в таблице 104 , действительны и имеют указанную семантику, а E также if удовлетворяет всем другим требованиям этого раздела [rand.req.eng]. В этой таблице и в этом разделе:

  1. a)T тип, названный Eассоциированным result_­type;

  2. b)e это значение E, v является именующим из E, x и y которые (возможно const) значения E;

  3. c)s значение T;

  4. d)q является lvalue, удовлетворяющим требованиям a seed sequence;

  5. e)z это значение типа unsigned long long;

  6. f)os - lvalue типа некоторой специализации шаблона класса basic_­ostream<charT, traits>; а также

  7. g)is - lvalue типа некоторой специализации шаблона класса basic_­istream<charT, traits>;

где charT и traits ограничены согласно пунктам [strings] и пунктам [input.output].

Таблица 104 - Требования к механизму случайных чисел
ВыражениеТип возвратаДо / после состоянияСложность
E() Создает механизм с тем же начальным состоянием, что и все другие механизмы типа, построенные по умолчанию E. O(size of state)
E(x) Создает движок, который сравнивает равный x. O(size of state)
E(s) Создает движок с начальным состоянием, определяемым s. O(size of state)
E(q)268 Создает движок с начальным состоянием, которое зависит от последовательности, созданной одним вызовом q.generate. q.generate такая же, как сложность вызываемой последовательности, длина которой равна размеру состояния
e.seed() void Postconditions: e == E(). такой же как E()
e.seed(s) void Postconditions: e == E(s). такой же как E(s)
e.seed(q) void Postconditions: e == E(q). такой же как E(q)
e() T Авансы eдержавотворческая ei к ei+1 =TA(ei) и возвращается GA(ei). за таблицу 103
e.discard(z) 269 void Авансы eдержавотворческих ei к ei+z любому способу эквивалентного z последовательным вызовов e(). не хуже сложности z последовательных звонков e()
x == y bool Этот оператор является отношением эквивалентности. С Sx и Sy как бесконечные последовательности значений, которые будут сгенерированы повторными вызовами в будущем, x() и y(), соответственно, возвращает true if Sx=Sy; иначе возвращается false. O(size of state)
x != y bool !(x == y). O(size of state)
os << x ссылка на тип os Если os.fmtflags задано значение ios_­base​::​dec|ios_­base​::​left и символ заполнения установлен на пробел, os выполняется запись в текстовое представление xтекущего состояния. В выводе соседние числа разделяются одним или несколькими пробелами. И символ - заполнитель не изменяются. Postconditions: os.fmtflags O(size of state)
is >> v ссылка на тип is Если is.fmtflags установлено в ios_­base​::​dec, устанавливает vсостояние, определяемое чтением его текстового представления из is. Если обнаружен неверный ввод, гарантирует, что vсостояние не изменится в результате операции и вызовов is.setstate(ios​::​failbit) (которые могут вызывать throw ios​::​failure ( [iostate.flags])). Если текстовое представление, записанное через, os << x было впоследствии прочитано через is >> v, то x == v при условии, что не было промежуточных вызовов of x или of v. Requires: is предоставляет текстовое представление, которое ранее было написано с использованием выходного потока, встроенная локаль которого была такой же, как и у is, и аргументы специализации шаблона charT и для которого traits были, соответственно, такими же, как у is. Неизменны. Postconditions: is.fmtflags O(size of state)

E должны соответствовать требованиям CopyConstructible и CopyAssignable типам. Каждая из этих операций должна быть по сложности не хуже O(size of state).

Этот конструктор (а также последующая соответствующая seed() функция) может быть особенно полезен для приложений, требующих большого количества независимых случайных последовательностей.

Эта операция распространена в пользовательском коде и часто может быть реализована специфичным для движка способом, чтобы обеспечить значительное улучшение производительности по сравнению с эквивалентным наивным циклом, который выполняет z последовательные вызовы e().

29.6.1.5 Random number engine adaptor requirements [rand.req.adapt]

random number engine adaptor (Обычно сокращенно adaptor) a типа A является случайным числом двигателя , который принимает значения , полученные с помощью какого - либо другого случайных чисел двигателя, и применяет алгоритм для этих значений для того , чтобы поставить последовательность значений с различными свойствами случайности. Двигатель b типа , B адаптированный таким образом, называется base engine в этом контексте. Выражение a.base() должно быть действительным и должно возвращать константную ссылку на aбазовый движок.

Требования к типу двигателя со случайным числом должны интерпретироваться следующим образом по отношению к типу адаптера двигателя со случайным числом.

A::A();

Effects: Базовый движок инициализируется, как если бы его конструктор по умолчанию.

bool operator==(const A& a1, const A& a2);

Returns: true если a1базовый двигатель равен a2базовому двигателю. В противном случае возвращается false.

A::A(result_type s);

Effects: Базовый движок инициализируется с помощью s.

template<class Sseq> A::A(Sseq& q);

Effects: Базовый движок инициализируется с помощью q.

void seed();

Effects: В b качестве базового движка вызывает b.seed().

void seed(result_type s);

Effects: В b качестве базового движка вызывает b.seed(s).

template<class Sseq> void seed(Sseq& q);

Effects: В b качестве базового движка вызывает b.seed(q).

A также должны удовлетворять следующим дополнительным требованиям:

  1. a)Сложность каждой функции не должна превышать сложность соответствующей функции, применяемой к базовому двигателю.

  2. b)Состояние A должно включать состояние его базового двигателя. Размер Aгосударства должен быть не меньше размера базового двигателя.

  3. c) AСостояние копирования (например, во время создания копии или назначения копии) должно включать в себя копирование состояния базового механизма A.

  4. d)Текстовое представление A должно включать текстовое представление его базового двигателя.

29.6.1.6 Random number distribution requirements [rand.req.dist]

random number distribution (Обычно сокращенно distribution) d типа D является функция объекта возвращение значения, которые распределены в соответствии с ассоциированным математическим probability density function p(z) или в соответствии с ассоциированным discrete probability function P(zi). Спецификация распределения определяет связанную с ним функцию вероятности p(z) или P(zi).

Соответствующая функция вероятности обычно выражается с помощью определенных поставляемых извне величин, известных как parameters of the distribution. Такие параметры распределения идентифицируются в этом контексте путем написания, например, p(z|a,b) или P(zi|a,b)для обозначения определенных параметров, или путем написания, например, p(z|{p}) или P(zi|{p}), для обозначения параметров распределения, p взятых в целом.

Класс D удовлетворяет требованиям a, random number distribution если выражения, показанные в таблице 105 , действительны и имеют указанную семантику, а if D и связанные с ним типы также удовлетворяют всем другим требованиям этого раздела [rand.req.dist]. В этой таблице и в этом разделе

  1. a)T тип, названный Dассоциированным result_­type;

  2. b)P тип, названный Dассоциированным param_­type;

  3. c)d это значение D, а также x и y являются (возможно const) значения D;

  4. d)glb и lub являются значениями T соответственно, соответствующими наибольшей нижней границе и наименьшей верхней границе значений, потенциально возвращаемых d's operator(), как определено текущими значениями dпараметров' s;

  5. e)p является (возможно const) значением P;

  6. f)g, g1и g2 являются l значениями типа, удовлетворяющими требованиям a uniform random bit generator;

  7. g)os - lvalue типа некоторой специализации шаблона класса basic_­ostream<charT, traits>; а также

  8. h)is - lvalue типа некоторой специализации шаблона класса basic_­istream<charT, traits>;

где charT и traits ограничены в соответствии с пунктами [strings] и [input.output].

Таблица 105 - Требования к распределению случайных чисел
ВыражениеТип возвратаДо / после состоянияСложность
D​::​result_­type T T это arithmetic type. время компиляции
D​::​param_­type P время компиляции
D() Создает распределение, поведение которого неотличимо от поведения любого другого вновь созданного по умолчанию распределения типа D. постоянный
D(p) Создает распределение, поведение которого неотличимо от поведения вновь созданного распределения, непосредственно из значений, используемых для построения p. такая же, как pи конструкция
d.reset() void Последующее использование d не зависит от значений, созданных каким-либо механизмом перед вызовом reset. постоянный
x.param() P Возвращает такое значение p , что D(p).param() == p. не хуже, чем сложность D(p)
d.param(p) void Postconditions: d.param() == p. не хуже, чем сложность D(p)
d(g) T С p=d.param(), последовательность чисел, возвращаемая последовательными вызовами одного и того же объекта g , случайным образом распределяется в соответствии с ассоциированной функцией p(z|{p}) или P(zi|{p}). амортизируемое постоянное количество вызовов g
d(g,p) T Последовательность чисел, возвращаемая последовательными вызовами одних g и тех же объектов, p случайным образом распределяется в соответствии с ассоциированной функцией p(z|{p}) или P(zi|{p})функцией. амортизируемое постоянное количество вызовов g
x.min() T Возврат glb. постоянный
x.max() T Возврат lub. постоянный
x == y bool Этот оператор является отношением эквивалентности. Возвращает true if x.param() == y.param() и S1=S2, где S1 и S2 - бесконечные последовательности значений, которые будут генерироваться, соответственно, повторными вызовами в будущем x(g1) и y(g2) всякий раз g1 == g2. В противном случае возвращается false. постоянный
x != y bool !(x == y). так же, как x == y.
os << x ссылка на тип os Записывает в os текстовое представление параметры и дополнительные внутренние данные x. И символ - заполнитель не изменяются. Postconditions: os.fmtflags
is >> d ссылка на тип is Восстанавливается из is параметров и дополнительных внутренних данных lvalue d. Если обнаружен неправильный ввод, гарантирует, что d операция и вызовы не изменят его is.setstate(ios​::​failbit) (что может вызвать throw ios​::​failure ( [iostate.flags])). Requires: is обеспечивает текстовое представление , которое было ранее написанным используя os которого пронизана локаль и чьи аргументы шаблона специализации типа в charT и traits были такими же , как те is. Неизменны. Postconditions: is.fmtflags

D должны удовлетворять требованиям CopyConstructible и CopyAssignable типам.

Последовательность чисел, полученная при повторных вызовах, d(g) должна быть независимой от любого вызова os << d или какой-либо const функции-члена D между любыми вызовами d(g).

Если текстовое представление написано с использованием os << x и это представление восстанавливается в тот же или другой объект y того же типа с использованием is >> y, повторные вызовы y(g) должны производить ту же последовательность чисел, что и повторные вызовы x(g).

Не указано, D​::​param_­type объявлен ли он как (вложенный) class или через typedef. В этом подпункте [rand]объявления D​::​param_­type используются в форме typedefs только для удобства изложения.

P должен удовлетворять требования CopyConstructible, CopyAssignableи EqualityComparable типов.

Для каждого из конструкторов, D принимающих аргументы, соответствующие параметрам распределения, P должен быть соответствующий конструктор, подчиняющийся тем же требованиям и принимающий аргументы, идентичные по количеству, типу и значениям по умолчанию. Более того, для каждой из функций-членов D этих возвращаемых значений, соответствующих параметрам распределения, P должна быть соответствующая функция-член с идентичным именем, типом и семантикой.

P иметь декларацию по форме

using distribution_type =  D;

29.6.2 Header <random> synopsis [rand.synopsis]

#include <initializer_list>

namespace std {
  // [rand.eng.lcong], class template linear_­congruential_­engine
  template<class UIntType, UIntType a, UIntType c, UIntType m>
    class linear_congruential_engine;

  // [rand.eng.mers], class template mersenne_­twister_­engine
  template<class UIntType, size_t w, size_t n, size_t m, size_t r,
           UIntType a, size_t u, UIntType d, size_t s,
           UIntType b, size_t t,
           UIntType c, size_t l, UIntType f>
    class mersenne_twister_engine;

  // [rand.eng.sub], class template subtract_­with_­carry_­engine
  template<class UIntType, size_t w, size_t s, size_t r>
    class subtract_with_carry_engine;

  // [rand.adapt.disc], class template discard_­block_­engine
  template<class Engine, size_t p, size_t r>
    class discard_block_engine;

  // [rand.adapt.ibits], class template independent_­bits_­engine
  template<class Engine, size_t w, class UIntType>
    class independent_bits_engine;

  // [rand.adapt.shuf], class template shuffle_­order_­engine
  template<class Engine, size_t k>
    class shuffle_order_engine;

  // [rand.predef], engines and engine adaptors with predefined parameters
  using minstd_rand0  = see below;
  using minstd_rand   = see below;
  using mt19937       = see below;
  using mt19937_64    = see below;
  using ranlux24_base = see below;
  using ranlux48_base = see below;
  using ranlux24      = see below;
  using ranlux48      = see below;
  using knuth_b       = see below;

  using default_random_engine = see below;

  // [rand.device], class random_­device
  class random_device;

  // [rand.util.seedseq], class seed_­seq
  class seed_seq;

  // [rand.util.canonical], function template generate_­canonical
  template<class RealType, size_t bits, class URBG>
    RealType generate_canonical(URBG& g);

  // [rand.dist.uni.int], class template uniform_­int_­distribution
  template<class IntType = int>
    class uniform_int_distribution;

  // [rand.dist.uni.real], class template uniform_­real_­distribution
  template<class RealType = double>
    class uniform_real_distribution;

  // [rand.dist.bern.bernoulli], class bernoulli_­distribution
  class bernoulli_distribution;

  // [rand.dist.bern.bin], class template binomial_­distribution
  template<class IntType = int>
    class binomial_distribution;

  // [rand.dist.bern.geo], class template geometric_­distribution
  template<class IntType = int>
    class geometric_distribution;

  // [rand.dist.bern.negbin], class template negative_­binomial_­distribution
  template<class IntType = int>
    class negative_binomial_distribution;

  // [rand.dist.pois.poisson], class template poisson_­distribution
  template<class IntType = int>
    class poisson_distribution;

  // [rand.dist.pois.exp], class template exponential_­distribution
  template<class RealType = double>
    class exponential_distribution;

  // [rand.dist.pois.gamma], class template gamma_­distribution
  template<class RealType = double>
    class gamma_distribution;

  // [rand.dist.pois.weibull], class template weibull_­distribution
  template<class RealType = double>
    class weibull_distribution;

  // [rand.dist.pois.extreme], class template extreme_­value_­distribution
  template<class RealType = double>
    class extreme_value_distribution;

  // [rand.dist.norm.normal], class template normal_­distribution
  template<class RealType = double>
    class normal_distribution;

  // [rand.dist.norm.lognormal], class template lognormal_­distribution
  template<class RealType = double>
    class lognormal_distribution;

  // [rand.dist.norm.chisq], class template chi_­squared_­distribution
  template<class RealType = double>
    class chi_squared_distribution;

  // [rand.dist.norm.cauchy], class template cauchy_­distribution
  template<class RealType = double>
    class cauchy_distribution;

  // [rand.dist.norm.f], class template fisher_­f_­distribution
  template<class RealType = double>
    class fisher_f_distribution;

  // [rand.dist.norm.t], class template student_­t_­distribution
  template<class RealType = double>
    class student_t_distribution;

  // [rand.dist.samp.discrete], class template discrete_­distribution
  template<class IntType = int>
    class discrete_distribution;

  // [rand.dist.samp.pconst], class template piecewise_­constant_­distribution
  template<class RealType = double>
    class piecewise_constant_distribution;

  // [rand.dist.samp.plinear], class template piecewise_­linear_­distribution
  template<class RealType = double>
    class piecewise_linear_distribution;
}

29.6.3 Random number engine class templates [rand.eng]

Каждый тип, созданный из шаблона класса, указанного в этом разделе, [rand.eng] удовлетворяет требованиям random number engine типа.

Если не указано иное, сложность каждой функции, указанной в этом разделе, [rand.eng] является постоянной.

Если не указано иное, ни одна функция, описанная в этом разделе, не [rand.eng] вызывает исключение.

Каждая функция, описанная в этом разделе, [rand.eng] которая имеет параметр функции q типа Sseq& для параметра типа шаблона с именем Sseq , отличным от типа, seed_­seq вызывает то, что и когда q.generate вызывает вызов throw.

Описания представлены в этом разделе [rand.eng] только для операций двигателя, которые не описаны, [rand.req.eng] или для операций, для которых имеется дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.

Каждый шаблон, указанный в этом разделе, [rand.eng] требует удержания одного или нескольких отношений, включающих значение (значения) не относящихся к типу параметров шаблона. Программа, реализующая любой из этих шаблонов, плохо сформирована, если какая-либо такая требуемая взаимосвязь не выполняется.

Для каждого механизма случайных чисел и для каждого адаптера механизма случайных чисел, X определенных в этом подпункте ( [rand.eng]) и в подпункте [rand.adapt]:

  • если конструктор

    template <class Sseq> explicit X(Sseq& q);

    вызывается с типом Sseq , который не квалифицируется как начальная последовательность, тогда этот конструктор не должен участвовать в разрешении перегрузки;

  • если функция-член

    template <class Sseq> void seed(Sseq& q);

    вызывается с типом Sseq , который не квалифицируется как начальная последовательность, то эта функция не должна участвовать в разрешении перегрузки.

Степень, в которой реализация определяет, что тип не может быть начальной последовательностью, не указана, за исключением того, что, как минимум, тип не должен квалифицироваться как начальная последовательность, если он неявно конвертируется в X​::​result_­type.

29.6.3.1 Class template linear_­congruential_­engine [rand.eng.lcong]

Механизм linear_­congruential_­engine случайных чисел производит беззнаковые целые случайные числа. Состояние из объекта имеет размер и состоит из одного целого числа. Алгоритм перехода представляет собой модульную линейную функцию формы ; алгоритм генерации есть . xi linear_­congruential_­engine x 1TA(xi)=(axi+c)modm GA(xi)=xi+1

template<class UIntType, UIntType a, UIntType c, UIntType m>
  class linear_congruential_engine {
  public:
    // types
    using result_type = UIntType;

    // engine characteristics
    static constexpr result_type multiplier = a;
    static constexpr result_type increment = c;
    static constexpr result_type modulus = m;
    static constexpr result_type min() { return c == 0u ? 1u: 0u; }
    static constexpr result_type max() { return m - 1u; }
    static constexpr result_type default_seed = 1u;

    // constructors and seeding functions
    explicit linear_congruential_engine(result_type s = default_seed);
    template<class Sseq> explicit linear_congruential_engine(Sseq& q);
    void seed(result_type s = default_seed);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);
  };

Если параметр шаблона m равен 0, модуль, m используемый в этом разделе, равен плюсу . [ не обязательно представлять как значение типа . ] [rand.eng.lcong] numeric_­limits<result_­type>​::​max() 1Note: m result_­typeend note

Если параметр шаблона m не равен 0, должны выполняться следующие отношения: a < m и c < m.

Текстовое представление состоит из значения xi.

explicit linear_congruential_engine(result_type s = default_seed);

Effects: Создает linear_­congruential_­engine объект. Если cmodm есть 0 и smodm есть 0, устанавливает состояние двигателя в 1, в противном случае устанавливает состояние двигателя в smodm.

template<class Sseq> explicit linear_congruential_engine(Sseq& q);

Effects: Создает linear_­congruential_­engine объект. С k=log2m32 и a массивом (или эквивалентом) длины k+3вызывает, q.generate(a+0, a+k+3) а затем вычисляет S=(k1j=0aj+3232j)modm. Если cmodm есть 0 и S есть 0, устанавливает состояние двигателя в 1, иначе устанавливает состояние двигателя в S.

29.6.3.2 Class template mersenne_­twister_­engine [rand.eng.mers]

Механизм mersenne_­twister_­engine случайных чисел 270 производит беззнаковые целые случайные числа в закрытом интервале [0,2w1]. Состояние из объекта имеет размер и состоит из последовательности из значений типа поставляемого ; все применяемые индексы следует брать по модулю .xi mersenne_­twister_­engine x n X n x X n

Алгоритм перехода использует сдвиговый регистр с обобщенной обратной связью, определяемый значениями сдвига и , значением поворота и условной xor-маской . Чтобы улучшить однородность результата, биты необработанного регистра сдвига дополнительно (т. Е. Скремблируются) в соответствии с матрицей битового скремблирования, определенной значениями и . n m r a tempered u,d,s,b,t,c,

Переход между состояниями выполняется следующим образом:

  1. a)Соедините верхние wr биты Xin с младшими r битами, Xi+1n чтобы получить беззнаковое целое число Y.

  2. b)С α=a(Ybitand1), установите Xi на Xi+mnxor(Yrshift1)xorα.

Последовательность X инициализируется с помощью множителя инициализации f.

Алгоритм генерации определяет беззнаковые целочисленные значения следующим образом, а затем выдает в качестве своего результата: z1,z2,z3,z4 z4

  1. a)Пусть z1=Xixor((Xirshiftu)bitandd).

  2. b)Пусть z2=z1xor((z1lshiftws)bitandb).

  3. c)Пусть z3=z2xor((z2lshiftwt)bitandc).

  4. d)Пусть z4=z3xor(z3rshift).

template<class UIntType, size_t w, size_t n, size_t m, size_t r,
         UIntType a, size_t u, UIntType d, size_t s,
         UIntType b, size_t t,
         UIntType c, size_t l, UIntType f>
  class mersenne_twister_engine {
  public:
    // types
    using result_type = UIntType;

    // engine characteristics
    static constexpr size_t word_size = w;
    static constexpr size_t state_size = n;
    static constexpr size_t shift_size = m;
    static constexpr size_t mask_bits = r;
    static constexpr UIntType xor_mask = a;
    static constexpr size_t tempering_u = u;
    static constexpr UIntType tempering_d = d;
    static constexpr size_t tempering_s = s;
    static constexpr UIntType tempering_b = b;
    static constexpr size_t tempering_t = t;
    static constexpr UIntType tempering_c = c;
    static constexpr size_t tempering_l = l;
    static constexpr UIntType initialization_multiplier = f;
    static constexpr result_type min() { return 0; }
    static constexpr result_type max() { return  2w1; }
    static constexpr result_type default_seed = 5489u;

    // constructors and seeding functions
    explicit mersenne_twister_engine(result_type value = default_seed);
    template<class Sseq> explicit mersenne_twister_engine(Sseq& q);
    void seed(result_type value = default_seed);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);
  };

Следующие соотношения должны занимать: 0 < m, m <= n, 2u < w, r <= w, u <= w, s <= w, t <= w, l <= w, w <= numeric_­limits<UIntType>​::​digits, a <= (1u<<w) - 1u, b <= (1u<<w) - 1u, c <= (1u<<w) - 1u, d <= (1u<<w) - 1u, и f <= (1u<<w) - 1u.

Текстовое представление о xi состоит из значений Xin,,Xi1, в таком порядке.

explicit mersenne_twister_engine(result_type value = default_seed);

Effects: Создает mersenne_­twister_­engine объект. Устанавливается Xn на valuemod2w. Затем итеративно для i=1n,,1, наборы Xi для

[f(Xi1xor(Xi1rshift(w2)))+imodn]mod2w.

Complexity: O(n).

template<class Sseq> explicit mersenne_twister_engine(Sseq& q);

Effects: Создает mersenne_­twister_­engine объект. With k=w/32 и a массив (или эквивалент) длины nkвызывает, q.generate(a+0, a+nk) а затем, итеративно для i=n,,1, устанавливает Xi значение (k1j=0ak(i+n)+j232j)mod2w. Наконец, если наиболее значимые wr биты Xn равны нуль, и если каждый из других в результате чего Xi это 0, изменяется Xn с 2w1.

Название этого механизма частично относится к свойству его периода: для правильно выбранных значений параметров период тесно связан с большим простым числом Мерсенна.

29.6.3.3 Class template subtract_­with_­carry_­engine [rand.eng.sub]

Механизм subtract_­with_­carry_­engine случайных чисел производит беззнаковые целые случайные числа.

Состояние из объекта имеет размера , и состоит из последовательности из целочисленных значений ; все применяемые индексы следует брать по модулю . Состояние дополнительно состоит из целого числа (известного как ) , значение которого равно или . xi subtract_­with_­carry_­engine xO(r) X r 0Xi<m=2w X r xi c carry 0 1

Переход между состояниями выполняется следующим образом:

  1. a)Пусть Y=XisXirc.

  2. b)Установите Xi на y=Ymodm. Установите c в 1, если Y<0, в противном случае установите c в 0.

[ Note: Этот алгоритм соответствует модульной линейной функции вида TA(xi)=(axi)modb, где b имеет вид mrms+1 и a=b(b1)/m. ]end note

Алгоритм генерации задается формулой , где - значение, полученное в результате улучшения состояния двигателя, как описано выше.GA(xi)=y y

template<class UIntType, size_t w, size_t s, size_t r>
  class subtract_with_carry_engine {
  public:
    // types
    using result_type = UIntType;

    // engine characteristics
    static constexpr size_t word_size = w;
    static constexpr size_t short_lag = s;
    static constexpr size_t long_lag = r;
    static constexpr result_type min() { return 0; }
    static constexpr result_type max() { return m1; }
    static constexpr result_type default_seed = 19780503u;

    // constructors and seeding functions
    explicit subtract_with_carry_engine(result_type value = default_seed);
    template<class Sseq> explicit subtract_with_carry_engine(Sseq& q);
    void seed(result_type value = default_seed);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);
  };

Следующие соотношения должны проводить: 0u < s, s < r, 0 < w, и w <= numeric_­limits<UIntType>​::​digits.

Текстовое представление состоит из значений в указанном порядке, за которыми следует . Xir,,Xi1 c

explicit subtract_with_carry_engine(result_type value = default_seed);

Effects: Создает subtract_­with_­carry_­engine объект. Устанавливает значения Xr,,X1в указанном ниже порядке в указанном ниже порядке. Если X1 есть, то 0устанавливается c в 1; в противном случае устанавливается c на 0.

Для того, чтобы установить значение Xk, первые построить e, А linear_­congruential_­engine объект, как если бы по следующему определению:

linear_congruential_engine<result_type,
                          40014u,0u,2147483563u> e(value == 0u ? default_seed : value);

Затем, чтобы установить каждый Xk, получить новые значения z0,,zn1 из n=w/32 последовательных вызовов e взятого по модулю 232. Установите Xk на (n1j=0zj232j)modm.

Complexity: Собственно nr заклинания e.

template<class Sseq> explicit subtract_with_carry_engine(Sseq& q);

Effects: Создает subtract_­with_­carry_­engine объект. With k=w/32 и a массив (или эквивалент) длины rkвызывает, q.generate(a+0, a+rk) а затем, итеративно для i=r,,1, устанавливает Xi значение (k1j=0ak(i+r)+j232j)modm. Если X1 есть, то 0устанавливается c в 1; в противном случае устанавливается c на 0.

29.6.4 Random number engine adaptor class templates [rand.adapt]

29.6.4.1 In general [rand.adapt.general]

Каждый тип, созданный из шаблона класса, указанного в этом разделе, [rand.adapt] удовлетворяет требованиям random number engine adaptor типа.

Если не указано иное, сложность каждой функции, указанной в этом разделе, [rand.adapt] является постоянной.

Если не указано иное, ни одна функция, описанная в этом разделе, не [rand.adapt] вызывает исключение.

Каждая функция, описанная в этом разделе, [rand.adapt] которая имеет параметр функции q типа Sseq& для параметра типа шаблона с именем Sseq , отличным от типа, seed_­seq вызывает то, что и когда q.generate вызывает вызов throw.

Описание предоставляется в этом разделе [rand.adapt] только для операций адаптера, которые не описаны в разделе, [rand.req.adapt] или для операций, для которых существует дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.

Каждый шаблон, указанный в этом разделе, [rand.adapt] требует удержания одного или нескольких отношений, включающих значение (значения) не относящихся к типу параметров шаблона. Программа, реализующая любой из этих шаблонов, плохо сформирована, если какая-либо такая требуемая взаимосвязь не выполняется.

29.6.4.2 Class template discard_­block_­engine [rand.adapt.disc]

discard_­block_­engine Случайным образом номера адаптер двигателя производит случайные числа , выбранные из производства некоторых базового двигателя e. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя и дополнительного целого числа . Размер государства равен размеру государства плюс . xi discard_­block_­engine x ei e n e 1

Алгоритм перехода отбрасывает все значения, кроме значений, из каждого блока значений, предоставленного . Переход между состояниями выполняется следующим образом: Если , переместите состояние из в и установите в . В любом случае, затем увеличивайте и продвигайте текущее состояние до . r>0 pr e nr e ei ei+pr n 0 n e ej ej+1

Алгоритм генерации выдает значение, возвращенное последним вызовом состояния при продвижении , как описано выше. e() e

template<class Engine, size_t p, size_t r>
  class discard_block_engine {
  public:
    // types
    using result_type = typename Engine::result_type;

    // engine characteristics
    static constexpr size_t block_size = p;
    static constexpr size_t used_block = r;
    static constexpr result_type min() { return Engine::min(); }
    static constexpr result_type max() { return Engine::max(); }

    // constructors and seeding functions
    discard_block_engine();
    explicit discard_block_engine(const Engine& e);
    explicit discard_block_engine(Engine&& e);
    explicit discard_block_engine(result_type s);
    template<class Sseq> explicit discard_block_engine(Sseq& q);
    void seed();
    void seed(result_type s);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);

    // property functions
    const Engine& base() const noexcept { return e; };

  private:
    Engine e;   // exposition only
    int n;      // exposition only
  };

Имеют место следующие отношения: 0 < r и r <= p.

Текстовое представление состоит из текстового представления, за которым следует значение . e n

В дополнение к своему поведению в соответствии с разделом [rand.req.adapt]каждый конструктор, который не является конструктором копирования, устанавливает n значение 0.

29.6.4.3 Class template independent_­bits_­engine [rand.adapt.ibits]

An independent_­bits_­engine адаптер сочетает в себе случайное число случайных чисел двигателей, которые производятся некоторым базовым двигателем e, таким образом , чтобы произвести случайные числа с заданным количеством битов w. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя ; размер государства - это размер российского государства. xi independent_­bits_­engine x ei e e

Алгоритмы перехода и генерации описываются следующими интегральными константами:

  1. a)Пусть R=e.max() - e.min() + 1 и m=log2R.

  2. b)С , n как определено ниже, пусть w0=w/n, n0=nwmodn, y0=2w0R/2w0и y1=2w0+1R/2w0+1.

  3. c)Пусть n=w/m тогда и только тогда, когда в результате соотношение Ry0y0/n выполняется. Иначе пусть n=1+w/m.

[ Note: Отношение w=n0w0+(nn0)(w0+1) всегда сохраняется. ]end note

Алгоритм перехода выполняется путем вызова по мере необходимости для получения значений меньше чем и значений меньше чем . e() n0y0+e.min() nn0 y1+e.min()

Алгоритм генерации использует значения, полученные при продвижении состояния, как описано выше, чтобы получить количество, полученное, как если бы по следующему алгоритму: S

S = 0;
for (k = 0; kn0; k += 1)  {
 do u = e() - e.min(); while (uy0);
 S = 2w0S+umod2w0;
}
for (k = n0; kn; k += 1)  {
 do u = e() - e.min(); while (uy1);
 S = 2w0+1S+umod2w0+1;
}

template<class Engine, size_t w, class UIntType>
  class independent_bits_engine {
  public:
    // types
    using result_type = UIntType;

    // engine characteristics
    static constexpr result_type min() { return 0; }
    static constexpr result_type max() { return 2w1; }

    // constructors and seeding functions
    independent_bits_engine();
    explicit independent_bits_engine(const Engine& e);
    explicit independent_bits_engine(Engine&& e);
    explicit independent_bits_engine(result_type s);
    template<class Sseq> explicit independent_bits_engine(Sseq& q);
    void seed();
    void seed(result_type s);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);

    // property functions
    const Engine& base() const noexcept { return e; };

  private:
    Engine e;   // exposition only
  };

Имеют место следующие отношения: 0 < w и w <= numeric_­limits<result_­type>​::​digits.

Текстовое представление состоит из текстового представления . e

29.6.4.4 Class template shuffle_­order_­engine [rand.adapt.shuf]

shuffle_­order_­engine Случайным образом номер адаптера двигатель производит те же самые случайные числа, которые производятся некоторым базовым двигателем e, но доставляет их в другой последовательности. Состояние из объекта адаптера двигателя состоит из состояния своего базового двигателя , дополнительное значение типа поставляемого и дополнительная последовательность из значений и типа поставляемого . Размер государства равен размеру государства плюс . xi shuffle_­order_­engine x ei e Y e V k e e k+1

Алгоритм перехода переставляет значения, создаваемые . Переход между состояниями выполняется следующим образом: e

  1. a)Вычислить целое число j=k(Yemin)emaxemin+1 .

  2. b)Набор Y для Vj и затем установить Vj в e().

Алгоритм генерации выдает последнее значение, полученное при продвижении , как описано выше. Y e

template<class Engine, size_t k>
  class shuffle_order_engine {
  public:
    // types
    using result_type = typename Engine::result_type;

    // engine characteristics
    static constexpr size_t table_size = k;
    static constexpr result_type min() { return Engine::min(); }
    static constexpr result_type max() { return Engine::max(); }

    // constructors and seeding functions
    shuffle_order_engine();
    explicit shuffle_order_engine(const Engine& e);
    explicit shuffle_order_engine(Engine&& e);
    explicit shuffle_order_engine(result_type s);
    template<class Sseq> explicit shuffle_order_engine(Sseq& q);
    void seed();
    void seed(result_type s);
    template<class Sseq> void seed(Sseq& q);

    // generating functions
    result_type operator()();
    void discard(unsigned long long z);

    // property functions
    const Engine& base() const noexcept { return e; };

  private:
    Engine e;           // exposition only
    result_type V[k];   // exposition only
    result_type Y;      // exposition only
  };

Следующее соотношение должно занимать: 0 < k.

Текстовое представление состоит из текстового представления , за которым следуют значения , за которыми следует значение . e k V Y

В дополнение к своему поведению в соответствии с разделом [rand.req.adapt], каждый конструктор, который не является конструктором копирования, инициализируется V[0],,V[k-1] и Yв этом порядке значениями, возвращаемыми последовательными вызовами e().

29.6.5 Engines and engine adaptors with predefined parameters [rand.predef]

using minstd_rand0 = linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а minstd_­rand0 должен получить значение 1043618065.

using minstd_rand = linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а minstd_­rand должен получить значение 399268537.

using mt19937 = mersenne_twister_engine<uint_fast32_t, 32,624,397,31,0x9908b0df,11,0xffffffff,7,0x9d2c5680,15,0xefc60000,18,1812433253>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а mt19937 должен получить значение 4123659995.

using mt19937_64 = mersenne_twister_engine<uint_fast64_t, 64,312,156,31,0xb5026f5aa96619e9,29, 0x5555555555555555,17, 0x71d67fffeda60000,37, 0xfff7eee000000000,43, 6364136223846793005>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а mt19937_­64 должен получить значение 9981545732273789042.

using ranlux24_base = subtract_with_carry_engine<uint_fast32_t, 24, 10, 24>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux24_­base должен получить значение 7937952.

using ranlux48_base = subtract_with_carry_engine<uint_fast64_t, 48, 5, 12>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux48_­base должен получить значение 61839128582725.

using ranlux24 = discard_block_engine<ranlux24_base, 223, 23>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux24 должен получить значение 9901578.

using ranlux48 = discard_block_engine<ranlux48_base, 389, 11>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а ranlux48 должен получить значение 249142670248501.

using knuth_b = shuffle_order_engine<minstd_rand0,256>;

Required behavior: 10000th Последовательный вызов по умолчанию построенного объекта типа а knuth_­b должен получить значение 1112339016.

using default_random_engine = implementation-defined;

Remarks: Выбор типа двигателя, названного этим, typedef определяется реализацией. [ Note: Реализация может выбрать этот тип на основе производительности, размера, качества или любой комбинации таких факторов, чтобы обеспечить, по крайней мере, приемлемое поведение двигателя для относительно случайного, неопытного и / или легкого использования. Поскольку разные реализации могут выбирать разные типы базовых механизмов, код, использующий это, typedef не должен генерировать идентичные последовательности для разных реализаций. ] end note

29.6.6 Class random_­device [rand.device]

random_­device Равномерный случайный бит генератор производит недетерминированные случайные числа.

Если ограничения реализации не позволяют генерировать недетерминированные случайные числа, реализация может использовать механизм случайных чисел.

class random_device {
public:
  // types
  using result_type = unsigned int;

  // generator characteristics
  static constexpr result_type min() { return numeric_limits<result_type>::min(); }
  static constexpr result_type max() { return numeric_limits<result_type>::max(); }

  // constructors
  explicit random_device(const string& token = implementation-defined);

  // generating functions
  result_type operator()();

  // property functions
  double entropy() const noexcept;

  // no copy functions
  random_device(const random_device& ) = delete;
  void operator=(const random_device& ) = delete;
};

explicit random_device(const string& token = implementation-defined);

Effects: Создает random_­device недетерминированный однородный объект генератора случайных битов. Семантика и значение token параметра по умолчанию определяются реализацией.271

Throws: Значение типа, определяемого реализацией, производное от, exception если random_­device не удалось инициализировать.

double entropy() const noexcept;

Returns: Если реализация использует механизм случайных чисел, возвращается 0.0. В противном случае возвращает оценку энтропии 272 для случайных чисел, возвращаемых operator()в диапазоне min() до log2(max()+1).

result_type operator()();

Returns: Недетерминированное случайное значение, равномерно распределенное между min() и max()включительно. Это определяется реализацией , как генерируются эти значения.

Throws: Значение типа, определяемого реализацией, полученное в exception случае, если не удалось получить случайное число.

Параметр предназначен для того, чтобы реализация могла различать разные источники случайности.

Если у устройства есть n состояния, соответствующие вероятности которых равны P0,,Pn1, энтропия устройства S определяется как
S=n1i=0PilogPi.

29.6.7 Utilities [rand.util]

29.6.7.1 Class seed_­seq [rand.util.seedseq]

class seed_seq {
public:
  // types
  using result_type = uint_least32_t;

  // constructors
  seed_seq();
  template<class T>
    seed_seq(initializer_list<T> il);
  template<class InputIterator>
    seed_seq(InputIterator begin, InputIterator end);

  // generating functions
  template<class RandomAccessIterator>
    void generate(RandomAccessIterator begin, RandomAccessIterator end);

  // property functions
  size_t size() const noexcept;
  template<class OutputIterator>
    void param(OutputIterator dest) const;

  // no copy functions
  seed_seq(const seed_seq& ) = delete;
  void operator=(const seed_seq& ) = delete;

private:
  vector<result_type> v;   // exposition only
};

seed_seq();

Effects: Создает seed_­seq объект, как если бы по умолчанию создавал его член v.

Throws: Ничего такого.

template<class T> seed_seq(initializer_list<T> il);

Requires: T должен быть целочисленным типом.

Effects: То же, что и seed_­seq(il.begin(), il.end()).

template<class InputIterator> seed_seq(InputIterator begin, InputIterator end);

Requires: InputIterator должны удовлетворять требованиям input iterator типа. Кроме того, iterator_­traits<InputIterator>​::​value_­type будет обозначать целочисленный тип.

Effects: Создает seed_­seq объект по следующему алгоритму:

for( InputIterator s = begin; s != end; ++s)
 v.push_back((*s)mod232);

template<class RandomAccessIterator> void generate(RandomAccessIterator begin, RandomAccessIterator end);

Requires: RandomAccessIterator должен соответствовать требованиям изменяемого random access iterator. Кроме того, iterator_­traits<RandomAccessIterator>​::​value_­type должен обозначать беззнаковый целочисленный тип, способный вместить 32-битные величины.

Effects: Ничего не делает, если begin == end. В противном случае, с помощью s=v.size() и n=endbeginзаполняет предоставленный диапазон в [begin,end) соответствии со следующим алгоритмом, в котором каждая операция должна выполняться по модулю 232, каждый примененный оператор индексации begin должен приниматься по модулю nи T(x) определяется как xxor(xrshift27):

  1. a)В качестве инициализации установите значение каждого элемента диапазона 0x8b8b8b8b. Кроме того, для использования на последующих этапах, пусть p=(nt)/2 и пусть q=p+t, где

    t=(n623) ? 11 : (n68) ? 7 : (n39) ? 5 : (n7) ? 3 : (n1)/2;

  2. b)С m как большее из s+1 и nпреобразовать элементы диапазона: итеративно для k=0,,m1, вычислить значения

    r1=1664525T(begin[k]xorbegin[k+p]xorbegin[k1])r2=r1+sk=0kmodn+v[k1]0<kskmodns<k

    и, по порядку, увеличить begin[k+p] на r1, увеличить begin[k+q] на r2и установить begin[k] в r2.

  3. c)Снова преобразовать элементы диапазона, начиная с того места, где закончился предыдущий шаг: итеративно для k=m,,m+n1, вычислить значения

    r3=1566083941T(begin[k]+begin[k+p]+begin[k1])r4=r3(kmodn)

    и, по порядку, обновить begin[k+p] , зафиксировав его r3, обновить begin[k+q] , зафиксировав его r4, и установить begin[k] в r4.

Throws: Какие и когда RandomAccessIterator операции begin и end бросают.

size_t size() const noexcept;

Returns: Количество 32-битных единиц, которые будут возвращены вызовом param().

Complexity: Постоянное время.

template<class OutputIterator> void param(OutputIterator dest) const;

Requires: OutputIterator должны удовлетворять требованиям output iterator. Более того, выражение *dest = rt должно быть действительным для значения rt типа result_­type.

Effects: Копирует последовательность подготовленных 32-битных модулей в заданное место назначения, как если бы выполняя следующий оператор:

copy(v.begin(), v.end(), dest);

Throws: Какие и когда OutputIterator операции dest броска.

29.6.7.2 Function template generate_­canonical [rand.util.canonical]

Каждая функция экземпляр из шаблона , описанный в этом разделе [rand.util.canonical] отображает результат одного или несколько призываний в комплекте поставку равномерного случайного генератора бит g одного из членов указанной RealType таким образом, что, если значения , gi полученные g равномерно распределены, результаты Инстанцирования в tj, 0tj<1, распределяются как можно более равномерно, как указано ниже.

[ Note: Получение значения таким образом может быть полезным этапом в процессе преобразования значения, сгенерированного генератором однородных случайных битов, в значение, которое может быть доставлено распределением случайных чисел. ]end note

template<class RealType, size_t bits, class URBG> RealType generate_canonical(URBG& g);

Complexity: Точно k=max(1,b/log2R) вызовы g, где b273 - меньшее из numeric_­limits<RealType>​::​digits и bits, а R - значение g.max()g.min()+1.

Effects: Вызывает g() k время для получения значений g0,,gk1соответственно. Рассчитывает количество

S=k1i=0(gig.min())Ri

используя арифметику типа RealType.

Returns: S/Rk.

Throws: Что и когда g кидает.

b вводится, чтобы избежать любых попыток произвести больше битов случайности, чем может быть удержано RealType.

29.6.8 Random number distribution class templates [rand.dist]

29.6.8.1 In general [rand.dist.general]

Каждый тип, созданный из шаблона класса, указанного в этом разделе, [rand.dist] удовлетворяет требованиям random number distribution типа.

Описания представлены в этом разделе [rand.dist] только для операций распространения, которые не описаны, [rand.req.dist] или для операций, для которых имеется дополнительная семантическая информация. В частности, объявления для конструкторов копирования, для операторов присваивания копий, для операторов потоковой передачи и для операторов равенства и неравенства не показаны в резюме.

Алгоритмы создания каждого из указанных распределений определяются реализацией.

Значение каждой функции плотности вероятности p(z) и каждой дискретной функции вероятности, P(zi) указанной в этом разделе, находится 0 везде за пределами указанной области.

29.6.8.2 Uniform distributions [rand.dist.uni]

29.6.8.2.1 Class template uniform_­int_­distribution [rand.dist.uni.int]

uniform_­int_­distribution Случайное распределение числа производит случайные целые числа i, aib, распределенные в соответствии с постоянной дискретной функцией вероятности

P(i|a,b)=1/(ba+1).

template<class IntType = int>
  class uniform_int_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max());
    explicit uniform_int_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    result_type a() const;
    result_type b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max());

Requires: ab.

Effects: Строит uniform_­int_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

result_type a() const;

Returns: Значение a параметра, с которым был построен объект.

result_type b() const;

Returns: Значение b параметра, с которым был построен объект.

29.6.8.2.2 Class template uniform_­real_­distribution [rand.dist.uni.real]

uniform_­real_­distribution Случайное распределение числа производит случайные числа x, ax<b, распределенные в соответствии с функцией плотности вероятности постоянной

p(x|a,b)=1/(ba).

[ Note: Это означает, что p(x|a,b) не определено, когда a == b. ]end note

template<class RealType = double>
  class uniform_real_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
    explicit uniform_real_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    result_type a() const;
    result_type b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);

Requires: ab и banumeric_limits<RealType>::max().

Effects: Строит uniform_­real_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

result_type a() const;

Returns: Значение a параметра, с которым был построен объект.

result_type b() const;

Returns: Значение b параметра, с которым был построен объект.

29.6.8.3 Bernoulli distributions [rand.dist.bern]

29.6.8.3.1 Class bernoulli_­distribution [rand.dist.bern.bernoulli]

bernoulli_­distribution Распределение случайных чисел производит bool значения , b распределенных в соответствии с дискретной вероятностной функцией

P(b|p)={pifb=true1pifb=false.

class bernoulli_distribution {
public:
  // types
  using result_type = bool;
  using param_type  = unspecified;

  // constructors and reset functions
  explicit bernoulli_distribution(double p = 0.5);
  explicit bernoulli_distribution(const param_type& parm);
  void reset();

  // generating functions
  template<class URBG>
    result_type operator()(URBG& g);
  template<class URBG>
    result_type operator()(URBG& g, const param_type& parm);

  // property functions
  double p() const;
  param_type param() const;
  void param(const param_type& parm);
  result_type min() const;
  result_type max() const;
};

explicit bernoulli_distribution(double p = 0.5);

Requires: 0p1.

Effects: Строит bernoulli_­distribution объект; p соответствует параметру распределения.

double p() const;

Returns: Значение p параметра, с которым был построен объект.

29.6.8.3.2 Class template binomial_­distribution [rand.dist.bern.bin]

binomial_­distribution Случайное распределение числа производит целые значения i0 распределены по дискретной функции вероятности

P(i|t,p)=(ti)pi(1p)ti.

template<class IntType = int>
  class binomial_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit binomial_distribution(IntType t = 1, double p = 0.5);
    explicit binomial_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    IntType t() const;
    double p() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit binomial_distribution(IntType t = 1, double p = 0.5);

Requires: 0p1 и 0t.

Effects: Строит binomial_­distribution объект; t и p соответствуют соответствующим параметрам распределения.

IntType t() const;

Returns: Значение t параметра, с которым был построен объект.

double p() const;

Returns: Значение p параметра, с которым был построен объект.

29.6.8.3.3 Class template geometric_­distribution [rand.dist.bern.geo]

geometric_­distribution Случайное распределение числа производит целые значения i0 распределены по дискретной функции вероятности

P(i|p)=p(1p)i.

template<class IntType = int>
  class geometric_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit geometric_distribution(double p = 0.5);
    explicit geometric_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    double p() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit geometric_distribution(double p = 0.5);

Requires: 0<p<1.

Effects: Строит geometric_­distribution объект; p соответствует параметру распределения.

double p() const;

Returns: Значение p параметра, с которым был построен объект.

29.6.8.3.4 Class template negative_­binomial_­distribution [rand.dist.bern.negbin]

negative_­binomial_­distribution Случайное распределение числа производит случайные целые числа , i0 распределенные в соответствии с дискретной вероятностной функцией

P(i|k,p)=(k+i1i)pk(1p)i.

[ Note: Это означает, что P(i|k,p) не определено, когда p == 1. ]end note

template<class IntType = int>
  class negative_binomial_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit negative_binomial_distribution(IntType k = 1, double p = 0.5);
    explicit negative_binomial_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    IntType k() const;
    double p() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit negative_binomial_distribution(IntType k = 1, double p = 0.5);

Requires: 0<p1 и 0<k.

Effects: Строит negative_­binomial_­distribution объект; k и p соответствуют соответствующим параметрам распределения.

IntType k() const;

Returns: Значение k параметра, с которым был построен объект.

double p() const;

Returns: Значение p параметра, с которым был построен объект.

29.6.8.4 Poisson distributions [rand.dist.pois]

29.6.8.4.1 Class template poisson_­distribution [rand.dist.pois.poisson]

poisson_­distribution Случайное распределение числа производит целые значения i0 распределены по дискретной функции вероятности

P(i|μ)=eμμii!.

Параметр распределения μ также известен как это распределение . mean

template<class IntType = int>
  class poisson_distribution
  {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit poisson_distribution(double mean = 1.0);
    explicit poisson_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    double mean() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit poisson_distribution(double mean = 1.0);

Requires: 0<mean.

Effects: Строит poisson_­distribution объект; mean соответствует параметру распределения.

double mean() const;

Returns: Значение mean параметра, с которым был построен объект.

29.6.8.4.2 Class template exponential_­distribution [rand.dist.pois.exp]

exponential_­distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности

p(x|λ)=λeλx.

template<class RealType = double>
  class exponential_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit exponential_distribution(RealType lambda = 1.0);
    explicit exponential_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType lambda() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit exponential_distribution(RealType lambda = 1.0);

Requires: 0<lambda.

Effects: Создает exponential_­distribution объект; lambda соответствует параметру распределения.

RealType lambda() const;

Returns: Значение lambda параметра, с которым был построен объект.

29.6.8.4.3 Class template gamma_­distribution [rand.dist.pois.gamma]

gamma_­distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности

p(x|α,β)=ex/ββαΓ(α)xα1.

template<class RealType = double>
  class gamma_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit gamma_distribution(RealType alpha = 1.0, RealType beta = 1.0);
    explicit gamma_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType alpha() const;
    RealType beta() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit gamma_distribution(RealType alpha = 1.0, RealType beta = 1.0);

Requires: 0<alpha и 0<beta.

Effects: Строит gamma_­distribution объект; alpha и beta соответствуют параметрам распределения.

RealType alpha() const;

Returns: Значение alpha параметра, с которым был построен объект.

RealType beta() const;

Returns: Значение beta параметра, с которым был построен объект.

29.6.8.4.4 Class template weibull_­distribution [rand.dist.pois.weibull]

weibull_­distribution Случайное распределение числа производит случайные числа , x0 распределенные в соответствии с функцией плотности вероятности

p(x|a,b)=ab(xb)a1exp((xb)a).

template<class RealType = double>
  class weibull_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0);
    explicit weibull_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType a() const;
    RealType b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit weibull_distribution(RealType a = 1.0, RealType b = 1.0);

Requires: 0<a и 0<b.

Effects: Строит weibull_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

RealType a() const;

Returns: Значение a параметра, с которым был построен объект.

RealType b() const;

Returns: Значение b параметра, с которым был построен объект.

29.6.8.4.5 Class template extreme_­value_­distribution [rand.dist.pois.extreme]

extreme_­value_­distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности274

p(x|a,b)=1bexp(axbexp(axb)).

template<class RealType = double>
  class extreme_value_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0);
    explicit extreme_value_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType a() const;
    RealType b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit extreme_value_distribution(RealType a = 0.0, RealType b = 1.0);

Requires: 0<b.

Effects: Создает extreme_­value_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

RealType a() const;

Returns: Значение a параметра, с которым был построен объект.

RealType b() const;

Returns: Значение b параметра, с которым был построен объект.

Распределение, соответствующее этой функции плотности вероятности, также известно (с возможным изменением переменной) как распределение Гамбеля типа I, лог-Вейбулла или распределение Фишера-Типпетта типа I.

29.6.8.5 Normal distributions [rand.dist.norm]

29.6.8.5.1 Class template normal_­distribution [rand.dist.norm.normal]

normal_­distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности

p(x|μ,σ)=1σ2πexp((xμ)22σ2).

Параметры распределения μ и σ также известны как этого распределения и . mean standard deviation

template<class RealType = double>
  class normal_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructors and reset functions
    explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);
    explicit normal_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType mean() const;
    RealType stddev() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit normal_distribution(RealType mean = 0.0, RealType stddev = 1.0);

Requires: 0<stddev.

Effects: Строит normal_­distribution объект; mean и stddev соответствуют соответствующим параметрам распределения.

RealType mean() const;

Returns: Значение mean параметра, с которым был построен объект.

RealType stddev() const;

Returns: Значение stddev параметра, с которым был построен объект.

29.6.8.5.2 Class template lognormal_­distribution [rand.dist.norm.lognormal]

lognormal_­distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности

p(x|m,s)=1sx2πexp((lnxm)22s2).

template<class RealType = double>
  class lognormal_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit lognormal_distribution(RealType m = 0.0, RealType s = 1.0);
    explicit lognormal_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType m() const;
    RealType s() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit lognormal_distribution(RealType m = 0.0, RealType s = 1.0);

Requires: 0<s.

Effects: Строит lognormal_­distribution объект; m и s соответствуют соответствующим параметрам распределения.

RealType m() const;

Returns: Значение m параметра, с которым был построен объект.

RealType s() const;

Returns: Значение s параметра, с которым был построен объект.

29.6.8.5.3 Class template chi_­squared_­distribution [rand.dist.norm.chisq]

chi_­squared_­distribution Случайное распределение числа производит случайные числа , x>0 распределенные в соответствии с функцией плотности вероятности

p(x|n)=x(n/2)1ex/2Γ(n/2)2n/2.

template<class RealType = double>
  class chi_squared_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit chi_squared_distribution(RealType n = 1);
    explicit chi_squared_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType n() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit chi_squared_distribution(RealType n = 1);

Requires: 0<n.

Effects: Строит chi_­squared_­distribution объект; n соответствует параметру распределения.

RealType n() const;

Returns: Значение n параметра, с которым был построен объект.

29.6.8.5.4 Class template cauchy_­distribution [rand.dist.norm.cauchy]

cauchy_­distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности

p(x|a,b)=(πb(1+(xab)2))1.

template<class RealType = double>
  class cauchy_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0);
    explicit cauchy_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType a() const;
    RealType b() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit cauchy_distribution(RealType a = 0.0, RealType b = 1.0);

Requires: 0<b.

Effects: Строит cauchy_­distribution объект; a и b соответствуют соответствующим параметрам распределения.

RealType a() const;

Returns: Значение a параметра, с которым был построен объект.

RealType b() const;

Returns: Значение b параметра, с которым был построен объект.

29.6.8.5.5 Class template fisher_­f_­distribution [rand.dist.norm.f]

fisher_­f_­distribution Случайное распределение числа производит случайные числа , x≥0 распределенные в соответствии с функцией плотности вероятности

p(x|m,n)=Γ((m+n)/2)Γ(m/2)Γ(n/2)(mn)m/2x(m/2)1(1+mxn)(m+n)/2.

template<class RealType = double>
  class fisher_f_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit fisher_f_distribution(RealType m = 1, RealType n = 1);
    explicit fisher_f_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType m() const;
    RealType n() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit fisher_f_distribution(RealType m = 1, RealType n = 1);

Requires: 0<m и 0<n.

Effects: Строит fisher_­f_­distribution объект; m и n соответствуют соответствующим параметрам распределения.

RealType m() const;

Returns: Значение m параметра, с которым был построен объект.

RealType n() const;

Returns: Значение n параметра, с которым был построен объект.

29.6.8.5.6 Class template student_­t_­distribution [rand.dist.norm.t]

student_­t_­distribution Случайное распределение числа производит случайные числа , x распределенные в соответствии с функцией плотности вероятности

p(x|n)=1nπΓ((n+1)/2)Γ(n/2)(1+x2n)(n+1)/2.

template<class RealType = double>
  class student_t_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    explicit student_t_distribution(RealType n = 1);
    explicit student_t_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    RealType n() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

explicit student_t_distribution(RealType n = 1);

Requires: 0<n.

Effects: Строит student_­t_­distribution объект; n соответствует параметру распределения.

RealType n() const;

Returns: Значение n параметра, с которым был построен объект.

29.6.8.6 Sampling distributions [rand.dist.samp]

29.6.8.6.1 Class template discrete_­distribution [rand.dist.samp.discrete]

discrete_­distribution Случайное распределение числа производит случайные целые числа i, 0i<n, распределенных в соответствии с дискретной вероятностной функции

P(i|p0,,pn1)=pi.

Если не указано иное, параметры распределения рассчитываются как:, pk=wk/S for k=0,,n1 в котором значения wk, обычно известные как , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, соотношение должно занимать: . weights 0<S=w0++wn1

template<class IntType = int>
  class discrete_distribution {
  public:
    // types
    using result_type = IntType;
    using param_type  = unspecified;

    // constructor and reset functions
    discrete_distribution();
    template<class InputIterator>
      discrete_distribution(InputIterator firstW, InputIterator lastW);
    discrete_distribution(initializer_list<double> wl);
    template<class UnaryOperation>
      discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw);
    explicit discrete_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    vector<double> probabilities() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

discrete_distribution();

Effects: Создает discrete_­distribution объект с помощью n=1 и p0=1. [ Note: Такой объект всегда будет иметь ценность 0. ] end note

template<class InputIterator> discrete_distribution(InputIterator firstW, InputIterator lastW);

Requires: InputIterator должны удовлетворять требованиям input iterator. Кроме того, iterator_­traits<InputIterator>​::​value_­type будет обозначать тип, в который можно преобразовать double. Если firstW == lastW, пусть n=1 и w0=1. В противном случае [firstW,lastW) формируется последовательность w длины n>0.

Effects: Создает discrete_­distribution объект с вероятностями, заданными формулой выше.

discrete_distribution(initializer_list<double> wl);

Effects: То же, что и discrete_­distribution(wl.begin(), wl.end()).

template<class UnaryOperation> discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmaxxmin)/n должно сохраняться.

Effects: Создает discrete_­distribution объект с вероятностями, заданными формулой выше, используя следующие значения: Если nw=0, пусть w0=1. В противном случае пусть wk=fw(xmin+kδ+δ/2) для k=0,,n1.

Complexity: Количество обращений fw не должно превышать n.

vector<double> probabilities() const;

Returns: Объект vector<double> , size член которого возвращается n и operator[] член которого возвращается pk при вызове с аргументом k for k=0,,n1.

29.6.8.6.2 Class template piecewise_­constant_­distribution [rand.dist.samp.pconst]

piecewise_­constant_­distribution Случайное распределение числа производит случайные числа x, b0x<bnравномерно распределяется по каждому подинтервалу в [bi,bi+1) соответствии с функцией плотности вероятности

p(x|b0,,bn,ρ0,,ρn1)=ρi, for bix<bi+1.

Параметры n+1 распределения bi, также известные как это распределение , должны удовлетворять соотношению для . Если не указано иное, остальные параметры распределения рассчитываются как: interval boundaries bi<bi+1 i=0,,n1 n

ρk=wkS(bk+1bk) for k=0,,n1,

в котором значения wk, обычно известные как the , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, соотношение должно занимать: . weights 0<S=w0++wn1

template<class RealType = double>
  class piecewise_constant_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    piecewise_constant_distribution();
    template<class InputIteratorB, class InputIteratorW>
      piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB,
                                      InputIteratorW firstW);
    template<class UnaryOperation>
      piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);
    template<class UnaryOperation>
      piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax,
                                      UnaryOperation fw);
    explicit piecewise_constant_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    vector<result_type> intervals() const;
    vector<result_type> densities() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

piecewise_constant_distribution();

Effects: Создает piecewise_­constant_­distribution объект с n=1, ρ0=1, b0=0и b1=1.

template<class InputIteratorB, class InputIteratorW> piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB, InputIteratorW firstW);

Requires: InputIteratorB и InputIteratorW каждый должен удовлетворять требованиям своего input iterator типа. Кроме того, каждый iterator_­traits<InputIteratorB>​::​value_­type и iterator_­traits<InputIteratorW>​::​value_­typeдолжен обозначать тип, в который можно преобразовать double. Если firstB == lastB или ++firstB == lastB, пусть n=1, w0=1, b0=0и b1=1. В противном случае [firstB,lastB) должен формировать последовательность b длины n+1, длина последовательности, w начиная с, firstW должна быть не менее n, и любое значение wk for kn должно игнорироваться распределением.

Effects: Создает piecewise_­constant_­distribution объект с параметрами, указанными выше.

template<class UnaryOperation> piecewise_constant_distribution(initializer_list<RealType> bl, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра.

Effects: Создает piecewise_­constant_­distribution объект с параметрами , принятых или вычисленных из следующих значений: Если bl.size()<2, пусть n=1, w0=1, b0=0и b1=1. В противном случае позвольте [bl.begin(),bl.end()) сформировать последовательность b0,,bnи позвольте wk=fw((bk+1+bk)/2) для k=0,,n1.

Complexity: Количество обращений fw не должно превышать n.

template<class UnaryOperation> piecewise_constant_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmaxxmin)/n должно сохраняться.

Effects: Создает piecewise_­constant_­distribution объект с параметрами, взятыми или вычисленными из следующих значений: Let bk=xmin+kδ for k=0,,nи wk=fw(bk+δ/2) for k=0,,n1.

Complexity: Количество обращений fw не должно превышать n.

vector<result_type> intervals() const;

Returns: Объект vector<result_­type> , size член которого возвращается n+1 и operator[] член которого возвращается bk при вызове с аргументом k for k=0,,n.

vector<result_type> densities() const;

Returns: Объект vector<result_­type> , size член которого возвращается n и operator[] член которого возвращается ρk при вызове с аргументом k for k=0,,n1.

29.6.8.6.3 Class template piecewise_­linear_­distribution [rand.dist.samp.plinear]

piecewise_­linear_­distribution Случайное распределение числа производит случайные числа x, b0x<bn, распределяется по каждому подинтервалу в [bi,bi+1) соответствии с функцией плотности вероятности

p(x|b0,,bn,ρ0,,ρn)=ρibi+1xbi+1bi+ρi+1xbibi+1bi, for bix<bi+1.

Параметры n+1 распределения bi, также известные как это распределение , должны удовлетворять соотношению для . Если не указано иное, остальные параметры распределения вычисляются как , в котором значения , обычно известные как , должны быть неотрицательными, отличными от NaN и бесконечными. Кроме того, должно выполняться следующее соотношение: interval boundaries bi<bi+1 i=0,,n1 n+1 ρk=wk/S for k=0,,n wk weights at boundaries

0<S=12n1k=0(wk+wk+1)(bk+1bk).

template<class RealType = double>
  class piecewise_linear_distribution {
  public:
    // types
    using result_type = RealType;
    using param_type  = unspecified;

    // constructor and reset functions
    piecewise_linear_distribution();
    template<class InputIteratorB, class InputIteratorW>
      piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB,
                                    InputIteratorW firstW);
    template<class UnaryOperation>
      piecewise_linear_distribution(initializer_list<RealType> bl, UnaryOperation fw);
    template<class UnaryOperation>
      piecewise_linear_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);
    explicit piecewise_linear_distribution(const param_type& parm);
    void reset();

    // generating functions
    template<class URBG>
      result_type operator()(URBG& g);
    template<class URBG>
      result_type operator()(URBG& g, const param_type& parm);

    // property functions
    vector<result_type> intervals() const;
    vector<result_type> densities() const;
    param_type param() const;
    void param(const param_type& parm);
    result_type min() const;
    result_type max() const;
  };

piecewise_linear_distribution();

Effects: Создает piecewise_­linear_­distribution объект с n=1, ρ0=ρ1=1, b0=0и b1=1.

template<class InputIteratorB, class InputIteratorW> piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB, InputIteratorW firstW);

Requires: InputIteratorB и InputIteratorW каждый должен удовлетворять требованиям своего input iterator типа. Кроме того, каждый iterator_­traits<InputIteratorB>​::​value_­type и iterator_­traits<InputIteratorW>​::​value_­typeдолжен обозначать тип, в который можно преобразовать double. Если firstB == lastB или ++firstB == lastB, пусть n=1, ρ0=ρ1=1, b0=0и b1=1. В противном случае [firstB,lastB) должен формировать последовательность b длины n+1, длина последовательности, w начиная с, firstW должна быть не менее n+1, и любое значение wk for kn+1 должно игнорироваться распределением.

Effects: Создает piecewise_­linear_­distribution объект с параметрами, указанными выше.

template<class UnaryOperation> piecewise_linear_distribution(initializer_list<RealType> bl, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра.

Effects: Создает piecewise_­linear_­distribution объект с параметрами , принятых или вычисленных из следующих значений: Если bl.size()<2, пусть n=1, ρ0=ρ1=1, b0=0и b1=1. В противном случае позвольте [bl.begin(),bl.end()) сформировать последовательность b0,,bnи позвольте wk=fw(bk) для k=0,,n.

Complexity: Количество обращений fw не должно превышать n+1.

template<class UnaryOperation> piecewise_linear_distribution(size_t nw, RealType xmin, RealType xmax, UnaryOperation fw);

Requires: Каждый экземпляр типа UnaryOperation должен быть function object типом возвращаемого значения, в который можно преобразовать double. Более того, double должен быть преобразован в тип UnaryOperationединственного параметра. Если nw=0, пусть n=1, иначе пусть n=nw. Отношение 0<δ=(xmaxxmin)/n должно сохраняться.

Effects: Создает piecewise_­linear_­distribution объект с параметрами, взятыми или вычисленными из следующих значений: Let bk=xmin+kδ for k=0,,nи wk=fw(bk) for k=0,,n.

Complexity: Количество обращений fw не должно превышать n+1.

vector<result_type> intervals() const;

Returns: Объект vector<result_­type> , size член которого возвращается n+1 и operator[] член которого возвращается bk при вызове с аргументом k for k=0,,n.

vector<result_type> densities() const;

Returns: Объект vector<result_­type> , size член которого возвращается n и operator[] член которого возвращается ρk при вызове с аргументом k for k=0,,n.

29.6.9 Low-quality random number generation [c.math.rand]

[ Note: Заголовок <cstdlib> объявляет функции, описанные в этом подпункте. ]end note

int rand(); void srand(unsigned int seed);

Effects: rand И srand функции имеют семантику , указанную в стандартной библиотеке C.

Remarks: Реализация может указывать, что могут вызывать определенные библиотечные функции rand. Это определяется реализацией, rand может ли функция вводить данные races ( [res.on.data.races]). [ Другие средства генерации случайных чисел в этом международном стандарте ( ) часто предпочтительнее , потому что лежащий в основе алгоритм не определен. Поэтому использование по- прежнему непереносимо, с непредсказуемым и часто сомнительным качеством и производительностью. ] Note: [rand] rand rand rand end note

См. Также: ISO C 7.22.2

29.7 Numeric arrays [numarray]

29.7.1 Header <valarray> synopsis [valarray.syn]

#include <initializer_list>

namespace std {
  template<class T> class valarray;         // An array of type T
  class slice;                              // a BLAS-like slice out of an array
  template<class T> class slice_array;
  class gslice;                             // a generalized slice out of an array
  template<class T> class gslice_array;
  template<class T> class mask_array;       // a masked array
  template<class T> class indirect_array;   // an indirected array

  template<class T> void swap(valarray<T>&, valarray<T>&) noexcept;

  template<class T> valarray<T> operator* (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator* (const valarray<T>&, const T&);
  template<class T> valarray<T> operator* (const T&, const valarray<T>&);

  template<class T> valarray<T> operator/ (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator/ (const valarray<T>&, const T&);
  template<class T> valarray<T> operator/ (const T&, const valarray<T>&);

  template<class T> valarray<T> operator% (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator% (const valarray<T>&, const T&);
  template<class T> valarray<T> operator% (const T&, const valarray<T>&);

  template<class T> valarray<T> operator+ (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator+ (const valarray<T>&, const T&);
  template<class T> valarray<T> operator+ (const T&, const valarray<T>&);

  template<class T> valarray<T> operator- (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator- (const valarray<T>&, const T&);
  template<class T> valarray<T> operator- (const T&, const valarray<T>&);

  template<class T> valarray<T> operator^ (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator^ (const valarray<T>&, const T&);
  template<class T> valarray<T> operator^ (const T&, const valarray<T>&);

  template<class T> valarray<T> operator& (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator& (const valarray<T>&, const T&);
  template<class T> valarray<T> operator& (const T&, const valarray<T>&);

  template<class T> valarray<T> operator| (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator| (const valarray<T>&, const T&);
  template<class T> valarray<T> operator| (const T&, const valarray<T>&);

  template<class T> valarray<T> operator<<(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator<<(const valarray<T>&, const T&);
  template<class T> valarray<T> operator<<(const T&, const valarray<T>&);

  template<class T> valarray<T> operator>>(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> operator>>(const valarray<T>&, const T&);
  template<class T> valarray<T> operator>>(const T&, const valarray<T>&);

  template<class T> valarray<bool> operator&&(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<bool> operator&&(const valarray<T>&, const T&);
  template<class T> valarray<bool> operator&&(const T&, const valarray<T>&);

  template<class T> valarray<bool> operator||(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<bool> operator||(const valarray<T>&, const T&);
  template<class T> valarray<bool> operator||(const T&, const valarray<T>&);

  template<class T>
    valarray<bool> operator==(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<bool> operator==(const valarray<T>&, const T&);
  template<class T> valarray<bool> operator==(const T&, const valarray<T>&);
  template<class T>
    valarray<bool> operator!=(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<bool> operator!=(const valarray<T>&, const T&);
  template<class T> valarray<bool> operator!=(const T&, const valarray<T>&);

  template<class T>
    valarray<bool> operator< (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<bool> operator< (const valarray<T>&, const T&);
  template<class T> valarray<bool> operator< (const T&, const valarray<T>&);
  template<class T>
    valarray<bool> operator> (const valarray<T>&, const valarray<T>&);
  template<class T> valarray<bool> operator> (const valarray<T>&, const T&);
  template<class T> valarray<bool> operator> (const T&, const valarray<T>&);
  template<class T>
    valarray<bool> operator<=(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<bool> operator<=(const valarray<T>&, const T&);
  template<class T> valarray<bool> operator<=(const T&, const valarray<T>&);
  template<class T>
    valarray<bool> operator>=(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<bool> operator>=(const valarray<T>&, const T&);
  template<class T> valarray<bool> operator>=(const T&, const valarray<T>&);

  template<class T> valarray<T> abs  (const valarray<T>&);
  template<class T> valarray<T> acos (const valarray<T>&);
  template<class T> valarray<T> asin (const valarray<T>&);
  template<class T> valarray<T> atan (const valarray<T>&);

  template<class T> valarray<T> atan2(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> atan2(const valarray<T>&, const T&);
  template<class T> valarray<T> atan2(const T&, const valarray<T>&);

  template<class T> valarray<T> cos  (const valarray<T>&);
  template<class T> valarray<T> cosh (const valarray<T>&);
  template<class T> valarray<T> exp  (const valarray<T>&);
  template<class T> valarray<T> log  (const valarray<T>&);
  template<class T> valarray<T> log10(const valarray<T>&);

  template<class T> valarray<T> pow(const valarray<T>&, const valarray<T>&);
  template<class T> valarray<T> pow(const valarray<T>&, const T&);
  template<class T> valarray<T> pow(const T&, const valarray<T>&);

  template<class T> valarray<T> sin  (const valarray<T>&);
  template<class T> valarray<T> sinh (const valarray<T>&);
  template<class T> valarray<T> sqrt (const valarray<T>&);
  template<class T> valarray<T> tan  (const valarray<T>&);
  template<class T> valarray<T> tanh (const valarray<T>&);

  template <class T> unspecified1 begin(valarray<T>& v);
  template <class T> unspecified2 begin(const valarray<T>& v);
  template <class T> unspecified1 end(valarray<T>& v);
  template <class T> unspecified2 end(const valarray<T>& v);
}

Заголовка <valarray> определяет пять шаблонов классов ( valarray, slice_­array, gslice_­array, mask_­array, и indirect_­array), два класса ( slice и gslice), а также ряд связанных шаблонов функций для представления и манипулирования массивов значений.

Эти valarray классы массива определяется так, чтобы быть свободными от определенных форм наложения спектров, таким образом позволяя операции на этих классах должны быть оптимизированы.

Любая функция, возвращающая a, valarray<T> может возвращать объект другого типа при условии, что все константные функции-члены valarray<T> также применимы к этому типу. Этот возвращаемый тип не должен добавлять более двух уровней вложенности шаблона по наиболее глубоко вложенному типу аргумента.275

Реализации, вводящие такие типы замены, должны предоставлять следующие дополнительные функции и операторы:

  • для каждой функции, принимающей const valarray<T>& отличные от begin и end, должны быть добавлены идентичные функции, принимающие типы замены;

  • для каждой функции, принимающей два const valarray<T>& аргумента, const valarray<T>& должны быть добавлены идентичные функции, принимающие все комбинации и типы замены.

В частности, реализация должна позволить valarray<T> быть построена из таких типов замены и должен допускать назначения и сложных задания таких типов в valarray<T>, slice_­array<T>, gslice_­array<T>, mask_­array<T> и indirect_­array<T> объектах.

Этим библиотечным функциям разрешено генерировать bad_­alloc исключение, если для выполнения операции недостаточно ресурсов. Обратите внимание, что исключение не является обязательным.

Приложение [implimits] рекомендует минимальное количество рекурсивно вложенных экземпляров шаблона. Таким образом, это требование косвенно предполагает минимально допустимую сложность для выражений valarray.

29.7.2 Class template valarray [template.valarray]

29.7.2.1 Class template valarray overview [template.valarray.overview]

namespace std {
  template<class T> class valarray {
  public:
    using value_type = T;

    // [valarray.cons], construct/destroy
    valarray();
    explicit valarray(size_t);
    valarray(const T&, size_t);
    valarray(const T*, size_t);
    valarray(const valarray&);
    valarray(valarray&&) noexcept;
    valarray(const slice_array<T>&);
    valarray(const gslice_array<T>&);
    valarray(const mask_array<T>&);
    valarray(const indirect_array<T>&);
    valarray(initializer_list<T>);
    ~valarray();

    // [valarray.assign], assignment
    valarray& operator=(const valarray&);
    valarray& operator=(valarray&&) noexcept;
    valarray& operator=(initializer_list<T>);
    valarray& operator=(const T&);
    valarray& operator=(const slice_array<T>&);
    valarray& operator=(const gslice_array<T>&);
    valarray& operator=(const mask_array<T>&);
    valarray& operator=(const indirect_array<T>&);

    // [valarray.access], element access
    const T&          operator[](size_t) const;
    T&                operator[](size_t);

    // [valarray.sub], subset operations
    valarray          operator[](slice) const;
    slice_array<T>    operator[](slice);
    valarray          operator[](const gslice&) const;
    gslice_array<T>   operator[](const gslice&);
    valarray          operator[](const valarray<bool>&) const;
    mask_array<T>     operator[](const valarray<bool>&);
    valarray          operator[](const valarray<size_t>&) const;
    indirect_array<T> operator[](const valarray<size_t>&);

    // [valarray.unary], unary operators
    valarray operator+() const;
    valarray operator-() const;
    valarray operator~() const;
    valarray<bool> operator!() const;

    // [valarray.cassign], compound assignment
    valarray& operator*= (const T&);
    valarray& operator/= (const T&);
    valarray& operator%= (const T&);
    valarray& operator+= (const T&);
    valarray& operator-= (const T&);
    valarray& operator^= (const T&);
    valarray& operator&= (const T&);
    valarray& operator|= (const T&);
    valarray& operator<<=(const T&);
    valarray& operator>>=(const T&);

    valarray& operator*= (const valarray&);
    valarray& operator/= (const valarray&);
    valarray& operator%= (const valarray&);
    valarray& operator+= (const valarray&);
    valarray& operator-= (const valarray&);
    valarray& operator^= (const valarray&);
    valarray& operator|= (const valarray&);
    valarray& operator&= (const valarray&);
    valarray& operator<<=(const valarray&);
    valarray& operator>>=(const valarray&);

    // [valarray.members], member functions
    void swap(valarray&) noexcept;

    size_t size() const;

    T sum() const;
    T min() const;
    T max() const;

    valarray shift (int) const;
    valarray cshift(int) const;
    valarray apply(T func(T)) const;
    valarray apply(T func(const T&)) const;
    void resize(size_t sz, T c = T());
  };

  template<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;
}

Шаблон класса valarray<T> представляет собой одномерный интеллектуальный массив, элементы которого нумеруются последовательно с нуля. Это представление математической концепции упорядоченного набора значений. Для удобства объект типа valarray<T> в остальной части называется «массивом» [numarray]. Иллюзия более высокой размерности может быть создана знакомой идиомой вычисляемых индексов вместе с мощными возможностями подмножества, обеспечиваемыми операторами обобщенных индексов.276

Реализации разрешено квалифицировать любую из функций, объявленных <valarray> как inline.

Намерение состоит в том, чтобы указать шаблон массива, который имеет минимальную функциональность, необходимую для устранения неоднозначности псевдонимов и увеличения количества временных файлов. Таким образом, valarray шаблон не является ни классом матрицы, ни классом поля. Однако это очень полезный строительный блок для разработки таких классов.

29.7.2.2 valarray constructors [valarray.cons]

valarray();

Effects: Создает объект valarray нулевой длины.277

explicit valarray(size_t n);

Effects: Создает a valarray , имеющий длину n. Каждый элемент массива равен value-initialized.

valarray(const T& v, size_t n);

Effects: Создает a valarray , имеющий длину n. Каждый элемент массива инициализируется с помощью v.

valarray(const T* p, size_t n);

Requires: p указывает на array ( [dcl.array]) как минимум из n элементов.

Effects: Создает a valarray , имеющий длину n. Значения элементов массива инициализируются первыми n значениями, на которые указывает первый аргумент.278

valarray(const valarray& v);

Effects: Создает a valarray , имеющий ту же длину, что и v. Элементы инициализируются значениями соответствующих элементов v.279

valarray(valarray&& v) noexcept;

Effects: Создает a valarray , имеющий ту же длину, что и v. Элементы инициализируются значениями соответствующих элементов v.

Complexity: Постоянный.

valarray(initializer_list<T> il);

Effects: Эквивалентно valarray(il.begin(), il.size()).

valarray(const slice_array<T>&); valarray(const gslice_array<T>&); valarray(const mask_array<T>&); valarray(const indirect_array<T>&);

Эти конструкторы преобразования преобразуют один из четырех эталонных шаблонов в файл valarray.

~valarray();

Effects: Деструктор применяется к каждому элементу *this; реализация может вернуть всю выделенную память.

Этот конструктор по умолчанию важен, поскольку valarray могут быть полезны массивы . После инициализации длину пустого массива можно увеличить с помощью resize функции-члена.

Этот конструктор является предпочтительным методом преобразования массива C в valarray объект.

Этот конструктор копирования создает отдельный массив, а не псевдоним. Реализации, в которых массивы совместно используют хранилище, разрешены, но они должны реализовывать механизм копирования по ссылке, чтобы гарантировать, что массивы концептуально различны.

29.7.2.3 valarray assignment [valarray.assign]

valarray& operator=(const valarray& v);

Effects: Каждому элементу *this массива присваивается значение соответствующего элемента v. Если длина v не равна длине , перед выполнением присваивания *thisизменяется размер , *this чтобы сделать два массива одинаковой длины, как при вызове resize(v.size()).

Postconditions: size() == v.size().

Returns: *this.

valarray& operator=(valarray&& v) noexcept;

Effects: *this получает значение v. Значение v после присваивания не указано.

Returns: *this.

Complexity: Линейный.

valarray& operator=(initializer_list<T> il);

Effects: Эквивалентен: return *this = valarray(il);

valarray& operator=(const T& v);

Effects: Присваивается v каждому элементу *this.

Returns: *this.

valarray& operator=(const slice_array<T>&); valarray& operator=(const gslice_array<T>&); valarray& operator=(const mask_array<T>&); valarray& operator=(const indirect_array<T>&);

Requires: Длина массива, на который ссылается аргумент, равна size(). Значение элемента в левой части valarray оператора присваивания не зависит от значения другого элемента в этой левой части.

Эти операторы позволяют назначать результаты обобщенной операции индексации непосредственно объекту valarray.

29.7.2.4 valarray element access [valarray.access]

const T& operator[](size_t n) const; T& operator[](size_t n);

Requires: n < size().

Returns: Ссылка на соответствующий элемент массива. [ Note: Выражение (a[i] = q, a[i]) == q оценивается true как любое непостоянное valarray<T> a, любое T qили size_­t i такое, что значение i меньше длины a. ]end note

Remarks: Выражение &a[i+j] == &a[i] + j оценивается true для всех size_­t i и size_­t j таких, что i+j < a.size().

Выражение &a[i] != &b[j] принимает значение true для любых двух массивов , a а b и для любого size_­t i и size_­t j таким образом, что i < a.size() и j < b.size(). [ Note: Это свойство указывает на отсутствие псевдонимов и может быть использовано для оптимизации компиляторов. Компиляторы могут использовать встраивание, распространение констант, слияние циклов, отслеживание указателей, полученных из operator new, и другие методы для генерации эффективных valarrays. ]end note

Ссылка, возвращаемая оператором индекса для массива, должна быть действительной до тех пор, пока для этого массива не будет resize(size_­t, T) вызвана функция-член или пока не закончится время жизни этого массива, в зависимости от того, что произойдет раньше.

29.7.2.5 valarray subset operations [valarray.sub]

Член operator[] перегружен, чтобы предоставить несколько способов выбора последовательностей элементов из тех, которые контролируются *this. Каждая из этих операций возвращает подмножество массива. Версии с квалификацией const возвращают это подмножество как новый valarray объект. Неконстантные версии возвращают объект шаблона класса, который имеет ссылочную семантику на исходный массив, работая в сочетании с различными перегрузками operator= и другими операторами присваивания, чтобы обеспечить выборочную замену (нарезку) контролируемой последовательности. В каждом случае выбранные элементы должны существовать.

valarray operator[](slice slicearr) const;

Returns: A, valarray содержащий те элементы управляемой последовательности, которые обозначены slicearr. [Example:

const valarray<char> v0("abcdefghijklmnop", 16);
// v0[slice(2, 5, 3)] returns valarray<char>("cfilo", 5)

end example]

slice_array<T> operator[](slice slicearr);

Returns: Объект, содержащий ссылки на элементы контролируемой последовательности, выбранные с помощью slicearr. [Example:

valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABCDE", 5);
v0[slice(2, 5, 3)] = v1;
// v0 == valarray<char>("abAdeBghCjkDmnEp", 16);

end example]

valarray operator[](const gslice& gslicearr) const;

Returns: A, valarray содержащий те элементы управляемой последовательности, которые обозначены gslicearr. [Example:

const valarray<char> v0("abcdefghijklmnop", 16);
const size_t lv[] = { 2, 3 };
const size_t dv[] = { 7, 2 };
const valarray<size_t> len(lv, 2), str(dv, 2);
// v0[gslice(3, len, str)] returns
// valarray<char>("dfhkmo", 6)

end example]

gslice_array<T> operator[](const gslice& gslicearr);

Returns: Объект, содержащий ссылки на элементы контролируемой последовательности, выбранные с помощью gslicearr. [Example:

valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABCDEF", 6);
const size_t lv[] = { 2, 3 };
const size_t dv[] = { 7, 2 };
const valarray<size_t> len(lv, 2), str(dv, 2);
v0[gslice(3, len, str)] = v1;
// v0 == valarray<char>("abcAeBgCijDlEnFp", 16)

end example]

valarray operator[](const valarray<bool>& boolarr) const;

Returns: A, valarray содержащий те элементы управляемой последовательности, которые обозначены boolarr. [Example:

const valarray<char> v0("abcdefghijklmnop", 16);
const bool vb[] = { false, false, true, true, false, true };
// v0[valarray<bool>(vb, 6)] returns
// valarray<char>("cdf", 3)

end example]

mask_array<T> operator[](const valarray<bool>& boolarr);

Returns: Объект, содержащий ссылки на элементы контролируемой последовательности, выбранные с помощью boolarr. [Example:

valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABC", 3);
const bool vb[] = { false, false, true, true, false, true };
v0[valarray<bool>(vb, 6)] = v1;
// v0 == valarray<char>("abABeCghijklmnop", 16)

end example]

valarray operator[](const valarray<size_t>& indarr) const;

Returns: A, valarray содержащий те элементы управляемой последовательности, которые обозначены indarr. [Example:

const valarray<char> v0("abcdefghijklmnop", 16);
const size_t vi[] = { 7, 5, 2, 3, 8 };
// v0[valarray<size_­t>(vi, 5)] returns
// valarray<char>("hfcdi", 5)

end example]

indirect_array<T> operator[](const valarray<size_t>& indarr);

Returns: Объект, содержащий ссылки на элементы контролируемой последовательности, выбранные с помощью indarr. [Example:

valarray<char> v0("abcdefghijklmnop", 16);
valarray<char> v1("ABCDE", 5);
const size_t vi[] = { 7, 5, 2, 3, 8 };
v0[valarray<size_t>(vi, 5)] = v1;
// v0 == valarray<char>("abCDeBgAEjklmnop", 16)

end example]

29.7.2.6 valarray unary operators [valarray.unary]

valarray operator+() const; valarray operator-() const; valarray operator~() const; valarray<bool> operator!() const;

Requires: Каждый из этих операторов может быть создан только для типа, T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типа T ( bool для operator!) или которое может быть однозначно неявно преобразовано в тип T ( bool для operator!).

Returns: A valarray , длина которого равна size(). Каждый элемент возвращаемого массива инициализируется результатом применения указанного оператора к соответствующему элементу массива.

29.7.2.7 valarray compound assignment [valarray.cassign]

valarray& operator*= (const valarray& v); valarray& operator/= (const valarray& v); valarray& operator%= (const valarray& v); valarray& operator+= (const valarray& v); valarray& operator-= (const valarray& v); valarray& operator^= (const valarray& v); valarray& operator&= (const valarray& v); valarray& operator|= (const valarray& v); valarray& operator<<=(const valarray& v); valarray& operator>>=(const valarray& v);

Requires: size() == v.size(). Каждый из этих операторов может быть создан для типа только в том T случае, если указанный оператор может применяться к двум операндам типа T. Значение элемента в левой части составного оператора присваивания valarray не зависит от значения другого элемента в этой левой части.

Effects: Каждый из этих операторов выполняет указанную операцию над каждым из элементов *this и соответствующим элементом v.

Returns: *this.

Remarks: Появление массива в левой части составного присваивания не делает недействительными ссылки или указатели.

valarray& operator*= (const T& v); valarray& operator/= (const T& v); valarray& operator%= (const T& v); valarray& operator+= (const T& v); valarray& operator-= (const T& v); valarray& operator^= (const T& v); valarray& operator&= (const T& v); valarray& operator|= (const T& v); valarray& operator<<=(const T& v); valarray& operator>>=(const T& v);

Requires: Каждый из этих операторов может быть создан для типа только в том T случае, если указанный оператор может применяться к двум операндам типа T.

Effects: Каждый из этих операторов применяет указанную операцию к каждому элементу *this и v.

Returns: *this

Remarks: Появление массива в левой части составного присваивания не делает недействительными ссылки или указатели на элементы массива.

29.7.2.8 valarray member functions [valarray.members]

void swap(valarray& v) noexcept;

Effects: *this получает значение v. v получает значение *this.

Complexity: Постоянный.

size_t size() const;

Returns: Количество элементов в массиве.

Complexity: Постоянное время.

T sum() const;

Requires: size() > 0. Эта функция может быть создана только для типа, T к которому operator+= может применяться.

Returns: Сумма всех элементов массива. Если массив имеет длину 1, возвращает значение элемента 0. В противном случае возвращаемое значение вычисляется путем применения operator+= к копии элемента массива и всех других элементов массива в неопределенном порядке.

T min() const;

Requires: size() > 0

Returns: Минимальное значение, содержащееся в *this. Для массива длиной 1 возвращается значение элемента 0. Для всех остальных длин массивов определение производится с использованием operator<.

T max() const;

Requires: size() > 0.

Returns: Максимальное значение, содержащееся в *this. Для массива длиной 1 возвращается значение элемента 0. Для всех остальных длин массивов определение производится с использованием operator<.

valarray shift(int n) const;

Returns: A valarray длины size(), каждый из элементов которого I равен (*this)[I + n] if I + n , неотрицателен и меньше size(), в противном случае T(). [ Note: Если нулевой элемент выбран как крайний левый элемент, положительное значение n сдвигает элементы влево n с нулевым заполнением. ]end note

[ Example: Если аргумент имеет значение -2, первые два элемента результата будут value-initialized; третьему элементу результата будет присвоено значение первого элемента аргумента; и т. д. ] end example

valarray cshift(int n) const;

Returns: A valarray длины, size() которая представляет собой круговое смещение на *this. Если нулевой элемент выбран как крайний левый элемент, неотрицательное значение n сдвигает элементы по кругу влево, n а отрицательное значение n сдвигает элементы по кругу вправо n .

valarray apply(T func(T)) const; valarray apply(T func(const T&)) const;

Returns: A valarray , длина которого равна size(). Каждому элементу возвращенного массива присваивается значение, возвращаемое путем применения функции аргумента к соответствующему элементу *this.

void resize(size_t sz, T c = T());

Effects: Изменяет длину *this массива на sz и затем присваивает каждому элементу значение второго аргумента. Изменение размера делает недействительными все указатели и ссылки на элементы в массиве.

29.7.3 valarray non-member operations [valarray.nonmembers]

29.7.3.1 valarray binary operators [valarray.binary]

template<class T> valarray<T> operator* (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator/ (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator% (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator+ (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator- (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator^ (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator& (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator| (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator<< (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> operator>> (const valarray<T>&, const valarray<T>&);

Requires: Каждый из этих операторов может быть создан только для типа, T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типа T или которое может быть однозначно неявно преобразовано в тип T. Массивы аргументов имеют одинаковую длину.

Returns: A valarray , длина которого равна длинам массивов аргументов. Каждый элемент возвращаемого массива инициализируется результатом применения указанного оператора к соответствующим элементам массивов аргументов.

template<class T> valarray<T> operator* (const valarray<T>&, const T&); template<class T> valarray<T> operator* (const T&, const valarray<T>&); template<class T> valarray<T> operator/ (const valarray<T>&, const T&); template<class T> valarray<T> operator/ (const T&, const valarray<T>&); template<class T> valarray<T> operator% (const valarray<T>&, const T&); template<class T> valarray<T> operator% (const T&, const valarray<T>&); template<class T> valarray<T> operator+ (const valarray<T>&, const T&); template<class T> valarray<T> operator+ (const T&, const valarray<T>&); template<class T> valarray<T> operator- (const valarray<T>&, const T&); template<class T> valarray<T> operator- (const T&, const valarray<T>&); template<class T> valarray<T> operator^ (const valarray<T>&, const T&); template<class T> valarray<T> operator^ (const T&, const valarray<T>&); template<class T> valarray<T> operator& (const valarray<T>&, const T&); template<class T> valarray<T> operator& (const T&, const valarray<T>&); template<class T> valarray<T> operator| (const valarray<T>&, const T&); template<class T> valarray<T> operator| (const T&, const valarray<T>&); template<class T> valarray<T> operator<<(const valarray<T>&, const T&); template<class T> valarray<T> operator<<(const T&, const valarray<T>&); template<class T> valarray<T> operator>>(const valarray<T>&, const T&); template<class T> valarray<T> operator>>(const T&, const valarray<T>&);

Requires: Каждый из этих операторов может быть создан только для типа, T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типа T или которое может быть однозначно неявно преобразовано в тип T.

Returns: A valarray , длина которого равна длине аргумента массива. Каждый элемент возвращенного массива инициализируется результатом применения указанного оператора к соответствующему элементу аргумента массива и аргументу, не являющемуся массивом.

29.7.3.2 valarray logical operators [valarray.comparison]

template<class T> valarray<bool> operator== (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator!= (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator< (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator> (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator<= (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator>= (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator&& (const valarray<T>&, const valarray<T>&); template<class T> valarray<bool> operator|| (const valarray<T>&, const valarray<T>&);

Requires: Каждый из этих операторов может быть создан только для типа, T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типа bool или которое может быть однозначно неявно преобразовано в тип bool. Два аргумента массива имеют одинаковую длину.

Returns: A valarray<bool> , длина которого равна длине аргументов массива. Каждый элемент возвращаемого массива инициализируется результатом применения указанного оператора к соответствующим элементам массивов аргументов.

template<class T> valarray<bool> operator==(const valarray<T>&, const T&); template<class T> valarray<bool> operator==(const T&, const valarray<T>&); template<class T> valarray<bool> operator!=(const valarray<T>&, const T&); template<class T> valarray<bool> operator!=(const T&, const valarray<T>&); template<class T> valarray<bool> operator< (const valarray<T>&, const T&); template<class T> valarray<bool> operator< (const T&, const valarray<T>&); template<class T> valarray<bool> operator> (const valarray<T>&, const T&); template<class T> valarray<bool> operator> (const T&, const valarray<T>&); template<class T> valarray<bool> operator<=(const valarray<T>&, const T&); template<class T> valarray<bool> operator<=(const T&, const valarray<T>&); template<class T> valarray<bool> operator>=(const valarray<T>&, const T&); template<class T> valarray<bool> operator>=(const T&, const valarray<T>&); template<class T> valarray<bool> operator&&(const valarray<T>&, const T&); template<class T> valarray<bool> operator&&(const T&, const valarray<T>&); template<class T> valarray<bool> operator||(const valarray<T>&, const T&); template<class T> valarray<bool> operator||(const T&, const valarray<T>&);

Requires: Каждый из этих операторов может быть создан только для типа, T к которому может применяться указанный оператор и для которого указанный оператор возвращает значение типа bool или которое может быть однозначно неявно преобразовано в тип bool.

Returns: A valarray<bool> , длина которого равна длине аргумента массива. Каждый элемент возвращенного массива инициализируется результатом применения указанного оператора к соответствующему элементу массива и аргументу, не являющемуся массивом.

29.7.3.3 valarray transcendentals [valarray.transcend]

template<class T> valarray<T> abs (const valarray<T>&); template<class T> valarray<T> acos (const valarray<T>&); template<class T> valarray<T> asin (const valarray<T>&); template<class T> valarray<T> atan (const valarray<T>&); template<class T> valarray<T> atan2 (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> atan2(const valarray<T>&, const T&); template<class T> valarray<T> atan2(const T&, const valarray<T>&); template<class T> valarray<T> cos (const valarray<T>&); template<class T> valarray<T> cosh (const valarray<T>&); template<class T> valarray<T> exp (const valarray<T>&); template<class T> valarray<T> log (const valarray<T>&); template<class T> valarray<T> log10(const valarray<T>&); template<class T> valarray<T> pow (const valarray<T>&, const valarray<T>&); template<class T> valarray<T> pow (const valarray<T>&, const T&); template<class T> valarray<T> pow (const T&, const valarray<T>&); template<class T> valarray<T> sin (const valarray<T>&); template<class T> valarray<T> sinh (const valarray<T>&); template<class T> valarray<T> sqrt (const valarray<T>&); template<class T> valarray<T> tan (const valarray<T>&); template<class T> valarray<T> tanh (const valarray<T>&);

Requires: Каждая из этих функций может быть создана только для типа, T к которому может применяться уникальная функция с указанным именем (неквалифицированная). Эта функция должна возвращать значение типа T или которое может быть однозначно неявно преобразовано в тип T.

29.7.3.4 valarray specialized algorithms [valarray.special]

template <class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;

Effects: Эквивалентно x.swap(y).

29.7.4 Class slice [class.slice]

29.7.4.1 Class slice overview [class.slice.overview]

namespace std {
  class slice {
  public:
    slice();
    slice(size_t, size_t, size_t);

    size_t start() const;
    size_t size() const;
    size_t stride() const;
  };
}

slice Класс представляет BLAS-подобный фрагмент из массива. Такой фрагмент определяется начальным индексом, длиной и шагом.280

BLAS означает, что программы на Basic Linear Algebra Subprograms. C ++ могут создавать экземпляры этого класса. Смотрите, например, Dongarra, Du Кроза, Дафф и Hammerling: A set of Level 3 Basic Linear Algebra Subprograms; Технический отчет MCS-P1-0888, Аргоннская национальная лаборатория (США), Отдел математики и информатики, август 1988 г.

29.7.4.2 slice constructors [cons.slice]

slice(); slice(size_t start, size_t length, size_t stride); slice(const slice&);

Конструктор по умолчанию эквивалентен slice(0, 0, 0). Конструктор по умолчанию предоставляется только для того, чтобы разрешить объявление массивов срезов. Конструктор с аргументами для среза принимает параметры начала, длины и шага.

[ Example: slice(3, 8, 2) создает срез, который выбирает элементы 3, 5, 7, ... 17 из массива. ] end example

29.7.4.3 slice access functions [slice.access]

size_t start() const; size_t size() const; size_t stride() const;

Returns: Начало, длина или шаг, указанные slice объектом.

Complexity: Постоянное время.

29.7.5 Class template slice_­array [template.slice.array]

29.7.5.1 Class template slice_­array overview [template.slice.array.overview]

namespace std {
  template <class T> class slice_array {
  public:
    using value_type = T;

    void operator=  (const valarray<T>&) const;
    void operator*= (const valarray<T>&) const;
    void operator/= (const valarray<T>&) const;
    void operator%= (const valarray<T>&) const;
    void operator+= (const valarray<T>&) const;
    void operator-= (const valarray<T>&) const;
    void operator^= (const valarray<T>&) const;
    void operator&= (const valarray<T>&) const;
    void operator|= (const valarray<T>&) const;
    void operator<<=(const valarray<T>&) const;
    void operator>>=(const valarray<T>&) const;

    slice_array(const slice_array&);
    ~slice_array();
    const slice_array& operator=(const slice_array&) const;
    void operator=(const T&) const;

    slice_array() = delete;       // as implied by declaring copy constructor above
  };
}

slice_­array Шаблон представляет собой шаблон помощника , используемый slice индекс оператора

slice_array<T> valarray<T>::operator[](slice);

Он имеет ссылочную семантику на подмножество массива, указанного slice объектом.

[ Example: Выражение a[slice(1, 5, 3)] = b; имеет эффект присвоения элементов части b из элементов в a. Для показанного фрагмента выбраны элементы a 1, 4, ..., 13. ]end example

29.7.5.2 slice_­array assignment [slice.arr.assign]

void operator=(const valarray<T>&) const; const slice_array& operator=(const slice_array&) const;

Эти операторы присваивания имеют ссылочную семантику, присваивая значения элементов массива аргументов выбранным элементам valarray<T> объекта, на который slice_­array ссылается объект.

29.7.5.3 slice_­array compound assignment [slice.arr.comp.assign]

void operator*= (const valarray<T>&) const; void operator/= (const valarray<T>&) const; void operator%= (const valarray<T>&) const; void operator+= (const valarray<T>&) const; void operator-= (const valarray<T>&) const; void operator^= (const valarray<T>&) const; void operator&= (const valarray<T>&) const; void operator|= (const valarray<T>&) const; void operator<<=(const valarray<T>&) const; void operator>>=(const valarray<T>&) const;

Эти составные присваивания имеют ссылочную семантику, применяя указанную операцию к элементам массива аргументов и выбранным элементам valarray<T> объекта, на который slice_­array ссылается объект.

29.7.5.4 slice_­array fill function [slice.arr.fill]

void operator=(const T&) const;

Эта функция имеет ссылочную семантику, присваивая значение своего аргумента элементам valarray<T> объекта, на который slice_­array ссылается объект.

29.7.6 The gslice class [class.gslice]

29.7.6.1 The gslice class overview [class.gslice.overview]

namespace std {
  class gslice {
  public:
    gslice();
    gslice(size_t s, const valarray<size_t>& l, const valarray<size_t>& d);

    size_t           start() const;
    valarray<size_t> size() const;
    valarray<size_t> stride() const;
  };
}

Этот класс представляет собой обобщенный фрагмент массива. A gslice определяется начальным смещением ( s), набором длин ( lj) и набором шагов ( dj). Количество длин должно быть равно количеству шагов.

A gslice представляет собой отображение набора индексов ( ij), количество которых равно количеству шагов, в один индекс k. Это полезно для построения классов многомерных массивов с использованием valarray одномерного шаблона. Набор значений одномерных индексов, заданных a gslice :

k=s+jijdj

где многомерные индексы ij имеют значения от 0 до lij1.

[ Спецификация Example: gslice

start  = 3
length = {2, 4, 3}
stride = {19, 4, 1}

дает последовательность одномерных индексов

k=3+(0,1)×19+(0,1,2,3)×4+(0,1,2)×1

которые упорядочены, как показано в следующей таблице:

	(i0,i1,i2,k)=
		(0,0,0, 3),    
		(0,0,1, 4),    
		(0,0,2, 5),    
		(0,1,0, 7),    
		(0,1,1, 8),    
		(0,1,2, 9),    
		(0,2,0,11), 
		(0,2,1,12), 
		(0,2,2,13), 
		(0,3,0,15), 
		(0,3,1,16), 
		(0,3,2,17), 
		(1,0,0,22), 
		(1,0,1,23), 
		      
		(1,3,2,36)

То есть индекс с самым высоким порядком получается быстрее всего. ]end example

Возможны вырожденные обобщенные срезы, в которых адрес повторяется.

[ Example: Если параметры шага в предыдущем примере изменить на {1, 1, 1}, первые несколько элементов результирующей последовательности индексов будут

	(0,0,0, 3),  
	(0,0,1, 4),  
	(0,0,2, 5),  
	(0,1,0, 4),  
	(0,1,1, 5),  
	(0,1,2, 6),  
	

end example]

Если вырожденный фрагмент используется в качестве аргумента для не- const версии operator[](const gslice&), поведение не определено.

29.7.6.2 gslice constructors [gslice.cons]

gslice(); gslice(size_t start, const valarray<size_t>& lengths, const valarray<size_t>& strides); gslice(const gslice&);

Конструктор по умолчанию эквивалентен gslice(0, valarray<size_­t>(), valarray<size_­t>()). Конструктор с аргументами строит на gslice основе спецификации начала, длины и шагов, как объяснено в предыдущем разделе.

29.7.6.3 gslice access functions [gslice.access]

size_t start() const; valarray<size_t> size() const; valarray<size_t> stride() const;

Returns: Представление начала, длины или шагов, указанных для gslice.

Complexity: start() постоянное время. size() и stride() линейны по количеству шагов.

29.7.7 Class template gslice_­array [template.gslice.array]

29.7.7.1 Class template gslice_­array overview [template.gslice.array.overview]

namespace std {
  template <class T> class gslice_array {
  public:
    using value_type = T;

    void operator=  (const valarray<T>&) const;
    void operator*= (const valarray<T>&) const;
    void operator/= (const valarray<T>&) const;
    void operator%= (const valarray<T>&) const;
    void operator+= (const valarray<T>&) const;
    void operator-= (const valarray<T>&) const;
    void operator^= (const valarray<T>&) const;
    void operator&= (const valarray<T>&) const;
    void operator|= (const valarray<T>&) const;
    void operator<<=(const valarray<T>&) const;
    void operator>>=(const valarray<T>&) const;

    gslice_array(const gslice_array&);
    ~gslice_array();
    const gslice_array& operator=(const gslice_array&) const;
    void operator=(const T&) const;

    gslice_array() = delete;      // as implied by declaring copy constructor above
  };
}

Этот шаблон является вспомогательным шаблоном, используемым slice оператором индекса

gslice_array<T> valarray<T>::operator[](const gslice&);

Он имеет ссылочную семантику на подмножество массива, указанного gslice объектом.

Таким образом, выражение a[gslice(1, length, stride)] = b имеет эффект присвоения элементов b обобщенной части элементов в a.

29.7.7.2 gslice_­array assignment [gslice.array.assign]

void operator=(const valarray<T>&) const; const gslice_array& operator=(const gslice_array&) const;

Эти операторы присваивания имеют ссылочную семантику, присваивая значения элементов массива аргументов выбранным элементам valarray<T> объекта, на который gslice_­array ссылается.

29.7.7.3 gslice_­array compound assignment [gslice.array.comp.assign]

void operator*= (const valarray<T>&) const; void operator/= (const valarray<T>&) const; void operator%= (const valarray<T>&) const; void operator+= (const valarray<T>&) const; void operator-= (const valarray<T>&) const; void operator^= (const valarray<T>&) const; void operator&= (const valarray<T>&) const; void operator|= (const valarray<T>&) const; void operator<<=(const valarray<T>&) const; void operator>>=(const valarray<T>&) const;

Эти составные присваивания имеют ссылочную семантику, применяя указанную операцию к элементам массива аргументов и выбранным элементам valarray<T> объекта, на который gslice_­array ссылается объект.

29.7.7.4 gslice_­array fill function [gslice.array.fill]

void operator=(const T&) const;

Эта функция имеет ссылочную семантику, присваивая значение своего аргумента элементам valarray<T> объекта, на который gslice_­array ссылается объект.

29.7.8 Class template mask_­array [template.mask.array]

29.7.8.1 Class template mask_­array overview [template.mask.array.overview]

namespace std {
  template <class T> class mask_array {
  public:
    using value_type = T;

    void operator=  (const valarray<T>&) const;
    void operator*= (const valarray<T>&) const;
    void operator/= (const valarray<T>&) const;
    void operator%= (const valarray<T>&) const;
    void operator+= (const valarray<T>&) const;
    void operator-= (const valarray<T>&) const;
    void operator^= (const valarray<T>&) const;
    void operator&= (const valarray<T>&) const;
    void operator|= (const valarray<T>&) const;
    void operator<<=(const valarray<T>&) const;
    void operator>>=(const valarray<T>&) const;

    mask_array(const mask_array&);
    ~mask_array();
    const mask_array& operator=(const mask_array&) const;
    void operator=(const T&) const;

    mask_array() = delete;        // as implied by declaring copy constructor above
  };
}

Этот шаблон является вспомогательным шаблоном, используемым оператором индекса маски:

mask_array<T> valarray<T>::operator[](const valarray<bool>&).

Он имеет ссылочную семантику на подмножество массива, заданного логической маской. Таким образом, выражение a[mask] = b; имеет эффект присвоения элементов b к замаскированным элементам a (те , для которых соответствующего элемент mask находится true.)

29.7.8.2 mask_­array assignment [mask.array.assign]

void operator=(const valarray<T>&) const; const mask_array& operator=(const mask_array&) const;

Эти операторы присваивания имеют ссылочную семантику, присваивая значения элементов массива аргументов выбранным элементам valarray<T> объекта, на который они ссылаются.

29.7.8.3 mask_­array compound assignment [mask.array.comp.assign]

void operator*= (const valarray<T>&) const; void operator/= (const valarray<T>&) const; void operator%= (const valarray<T>&) const; void operator+= (const valarray<T>&) const; void operator-= (const valarray<T>&) const; void operator^= (const valarray<T>&) const; void operator&= (const valarray<T>&) const; void operator|= (const valarray<T>&) const; void operator<<=(const valarray<T>&) const; void operator>>=(const valarray<T>&) const;

Эти составные присваивания имеют ссылочную семантику, применяя указанную операцию к элементам массива аргументов и выбранным элементам valarray<T> объекта, на который ссылается объект маски.

29.7.8.4 mask_­array fill function [mask.array.fill]

void operator=(const T&) const;

Эта функция имеет ссылочную семантику, присваивая значение своего аргумента элементам valarray<T> объекта, на который mask_­array ссылается объект.

29.7.9 Class template indirect_­array [template.indirect.array]

29.7.9.1 Class template indirect_­array overview [template.indirect.array.overview]

namespace std {
  template <class T> class indirect_array {
  public:
    using value_type = T;

    void operator=  (const valarray<T>&) const;
    void operator*= (const valarray<T>&) const;
    void operator/= (const valarray<T>&) const;
    void operator%= (const valarray<T>&) const;
    void operator+= (const valarray<T>&) const;
    void operator-= (const valarray<T>&) const;
    void operator^= (const valarray<T>&) const;
    void operator&= (const valarray<T>&) const;
    void operator|= (const valarray<T>&) const;
    void operator<<=(const valarray<T>&) const;
    void operator>>=(const valarray<T>&) const;

    indirect_array(const indirect_array&);
    ~indirect_array();
    const indirect_array& operator=(const indirect_array&) const;
    void operator=(const T&) const;

    indirect_array() = delete;        // as implied by declaring copy constructor above
  };
}

Этот шаблон является вспомогательным шаблоном, используемым косвенным оператором индекса.

indirect_array<T> valarray<T>::operator[](const valarray<size_t>&).

Он имеет ссылочную семантику на подмножество массива, указанного в indirect_­array. Таким образом, выражение a[​indirect] = b; имеет эффект присвоения элементов b элементам a , индексы которых присутствуют в indirect.

29.7.9.2 indirect_­array assignment [indirect.array.assign]

void operator=(const valarray<T>&) const; const indirect_array& operator=(const indirect_array&) const;

Эти операторы присваивания имеют ссылочную семантику, присваивая значения элементов массива аргументов выбранным элементам valarray<T> объекта, на который они ссылаются.

Если indirect_­array указывает элемент в valarray<T> объекте, на который он ссылается более одного раза, поведение не определено.

[Example:

int addr[] = {2, 3, 1, 4, 4};
valarray<size_t> indirect(addr, 5);
valarray<double> a(0., 10), b(1., 5);
a[indirect] = b;

приводит к неопределенному поведению, поскольку элемент 4 указывается дважды в косвенном указании. ] end example

29.7.9.3 indirect_­array compound assignment [indirect.array.comp.assign]

void operator*= (const valarray<T>&) const; void operator/= (const valarray<T>&) const; void operator%= (const valarray<T>&) const; void operator+= (const valarray<T>&) const; void operator-= (const valarray<T>&) const; void operator^= (const valarray<T>&) const; void operator&= (const valarray<T>&) const; void operator|= (const valarray<T>&) const; void operator<<=(const valarray<T>&) const; void operator>>=(const valarray<T>&) const;

Эти составные присваивания имеют ссылочную семантику, применяя указанную операцию к элементам массива аргументов и выбранным элементам valarray<T> объекта, на который indirect_­array ссылается объект.

Если indirect_­array указывает элемент в valarray<T> объекте, на который он ссылается более одного раза, поведение не определено.

29.7.9.4 indirect_­array fill function [indirect.array.fill]

void operator=(const T&) const;

Эта функция имеет ссылочную семантику, присваивая значение своего аргумента элементам valarray<T> объекта, на который indirect_­array ссылается объект.

29.7.10 valarray range access [valarray.range]

В следующих шаблонах функций begin и 1 - это тип, который соответствует требованиям изменяемого объекта , а тип - параметр шаблона . 2 - это тип, который удовлетворяет требованиям константы и, чей параметр является параметром шаблона, а тип - . end unspecified random access iterator contiguous iterator value_­type T reference T& unspecified random access iterator contiguous iterator value_­type T reference const T&

Итераторы, возвращаемые массивом begin и end для массива, гарантированно действительны до тех пор, пока функция-член не resize(size_­t, T) будет вызвана для этого массива или пока не закончится время жизни этого массива, в зависимости от того, что произойдет раньше.

template <class T> unspecified1 begin(valarray<T>& v); template <class T> unspecified2 begin(const valarray<T>& v);

Returns: Итератор, ссылающийся на первое значение в массиве.

template <class T> unspecified1 end(valarray<T>& v); template <class T> unspecified2 end(const valarray<T>& v);

Returns: Итератор, ссылающийся на одно после последнего значения в массиве.

29.8 Generalized numeric operations [numeric.ops]

29.8.1 Header <numeric> synopsis [numeric.ops.overview]

namespace std {
  // [accumulate], accumulate
  template <class InputIterator, class T>
    T accumulate(InputIterator first, InputIterator last, T init);
  template <class InputIterator, class T, class BinaryOperation>
    T accumulate(InputIterator first, InputIterator last, T init,
                 BinaryOperation binary_op);

  // [reduce], reduce
  template<class InputIterator>
    typename iterator_traits<InputIterator>::value_type
      reduce(InputIterator first, InputIterator last);
  template<class InputIterator, class T>
    T reduce(InputIterator first, InputIterator last, T init);
  template<class InputIterator, class T, class BinaryOperation>
    T reduce(InputIterator first, InputIterator last, T init,
             BinaryOperation binary_op);
  template<class ExecutionPolicy, class ForwardIterator>
    typename iterator_traits<ForwardIterator>::value_type
      reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
             ForwardIterator first, ForwardIterator last);
  template<class ExecutionPolicy, class ForwardIterator, class T>
    T reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
             ForwardIterator first, ForwardIterator last, T init);
  template<class ExecutionPolicy, class ForwardIterator, class T, class BinaryOperation>
    T reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
             ForwardIterator first, ForwardIterator last, T init,
             BinaryOperation binary_op);

  // [inner.product], inner product
  template <class InputIterator1, class InputIterator2, class T>
    T inner_product(InputIterator1 first1, InputIterator1 last1,
                    InputIterator2 first2, T init);
  template <class InputIterator1, class InputIterator2, class T,
            class BinaryOperation1, class BinaryOperation2>
    T inner_product(InputIterator1 first1, InputIterator1 last1,
                    InputIterator2 first2, T init,
                    BinaryOperation1 binary_op1,
                    BinaryOperation2 binary_op2);

  // [transform.reduce], transform reduce
  template<class InputIterator1, class InputIterator2, class T>
    T transform_reduce(InputIterator1 first1, InputIterator1 last1,
                       InputIterator2 first2,
                       T init);
  template<class InputIterator1, class InputIterator2, class T,
           class BinaryOperation1, class BinaryOperation2>
    T transform_reduce(InputIterator1 first1, InputIterator1 last1,
                       InputIterator2 first2,
                       T init,
                       BinaryOperation1 binary_op1,
                       BinaryOperation2 binary_op2);
  template<class InputIterator, class T,
           class BinaryOperation, class UnaryOperation>
    T transform_reduce(InputIterator first, InputIterator last,
                       T init,
                       BinaryOperation binary_op, UnaryOperation unary_op);
  template<class ExecutionPolicy,
           class ForwardIterator1, class ForwardIterator2, class T>
    T transform_reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                       ForwardIterator1 first1, ForwardIterator1 last1,
                       ForwardIterator2 first2,
                       T init);
  template<class ExecutionPolicy,
           class ForwardIterator1, class ForwardIterator2, class T,
           class BinaryOperation1, class BinaryOperation2>
    T transform_reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                       ForwardIterator1 first1, ForwardIterator1 last1,
                       ForwardIterator2 first2,
                       T init,
                       BinaryOperation1 binary_op1,
                       BinaryOperation2 binary_op2);
  template<class ExecutionPolicy,
           class ForwardIterator, class T,
           class BinaryOperation, class UnaryOperation>
    T transform_reduce(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                       ForwardIterator first, ForwardIterator last,
                       T init,
                       BinaryOperation binary_op, UnaryOperation unary_op);

  // [partial.sum], partial sum
  template <class InputIterator, class OutputIterator>
    OutputIterator partial_sum(InputIterator first,
                               InputIterator last,
                               OutputIterator result);
  template <class InputIterator, class OutputIterator, class BinaryOperation>
    OutputIterator partial_sum(InputIterator first,
                               InputIterator last,
                               OutputIterator result,
                               BinaryOperation binary_op);

  // [exclusive.scan], exclusive scan
  template<class InputIterator, class OutputIterator, class T>
    OutputIterator exclusive_scan(InputIterator first, InputIterator last,
                                  OutputIterator result,
                                  T init);
  template<class InputIterator, class OutputIterator, class T, class BinaryOperation>
    OutputIterator exclusive_scan(InputIterator first, InputIterator last,
                                  OutputIterator result,
                                  T init, BinaryOperation binary_op);
  template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T>
    ForwardIterator2 exclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                    ForwardIterator1 first, ForwardIterator1 last,
                                    ForwardIterator2 result,
                                    T init);
  template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T,
           class BinaryOperation>
    ForwardIterator2 exclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                    ForwardIterator1 first, ForwardIterator1 last,
                                    ForwardIterator2 result,
                                    T init, BinaryOperation binary_op);

  // [inclusive.scan], inclusive scan
  template<class InputIterator, class OutputIterator>
    OutputIterator inclusive_scan(InputIterator first, InputIterator last,
                                  OutputIterator result);
  template<class InputIterator, class OutputIterator, class BinaryOperation>
    OutputIterator inclusive_scan(InputIterator first, InputIterator last,
                                  OutputIterator result,
                                  BinaryOperation binary_op);
  template<class InputIterator, class OutputIterator, class BinaryOperation, class T>
    OutputIterator inclusive_scan(InputIterator first, InputIterator last,
                                  OutputIterator result,
                                  BinaryOperation binary_op, T init);
  template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
    ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                    ForwardIterator1 first, ForwardIterator1 last,
                                    ForwardIterator2 result);
  template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
           class BinaryOperation>
    ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                    ForwardIterator1 first, ForwardIterator1 last,
                                    ForwardIterator2 result,
                                    BinaryOperation binary_op);
  template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
           class BinaryOperation, class T>
    ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                    ForwardIterator1 first, ForwardIterator1 last,
                                    ForwardIterator2 result,
                                    BinaryOperation binary_op, T init);

  // [transform.exclusive.scan], transform exclusive scan
  template<class InputIterator, class OutputIterator, class T,
           class BinaryOperation, class UnaryOperation>
    OutputIterator transform_exclusive_scan(InputIterator first, InputIterator last,
                                            OutputIterator result,
                                            T init,
                                            BinaryOperation binary_op,
                                            UnaryOperation unary_op);
  template<class ExecutionPolicy,
           class ForwardIterator1, class ForwardIterator2, class T,
           class BinaryOperation, class UnaryOperation>
    ForwardIterator2 transform_exclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                              ForwardIterator1 first, ForwardIterator1 last,
                                              ForwardIterator2 result,
                                              T init,
                                              BinaryOperation binary_op,
                                              UnaryOperation unary_op);

  // [transform.inclusive.scan], transform inclusive scan
  template<class InputIterator, class OutputIterator,
           class BinaryOperation, class UnaryOperation>
    OutputIterator transform_inclusive_scan(InputIterator first, InputIterator last,
                                            OutputIterator result,
                                            BinaryOperation binary_op,
                                            UnaryOperation unary_op);
  template<class InputIterator, class OutputIterator,
           class BinaryOperation, class UnaryOperation, class T>
    OutputIterator transform_inclusive_scan(InputIterator first, InputIterator last,
                                            OutputIterator result,
                                            BinaryOperation binary_op,
                                            UnaryOperation unary_op,
                                            T init);
  template<class ExecutionPolicy,
           class ForwardIterator1, class ForwardIterator2,
           class BinaryOperation, class UnaryOperation>
    ForwardIterator2 transform_inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                              ForwardIterator1 first, ForwardIterator1 last,
                                              ForwardIterator2 result,
                                              BinaryOperation binary_op,
                                              UnaryOperation unary_op);
  template<class ExecutionPolicy,
           class ForwardIterator1, class ForwardIterator2,
           class BinaryOperation, class UnaryOperation, class T>
    ForwardIterator2 transform_inclusive_scan(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                              ForwardIterator1 first, ForwardIterator1 last,
                                              ForwardIterator2 result,
                                              BinaryOperation binary_op,
                                              UnaryOperation unary_op,
                                              T init);

  // [adjacent.difference], adjacent difference
  template <class InputIterator, class OutputIterator>
    OutputIterator adjacent_difference(InputIterator first,
                                       InputIterator last,
                                       OutputIterator result);
  template <class InputIterator, class OutputIterator, class BinaryOperation>
    OutputIterator adjacent_difference(InputIterator first,
                                       InputIterator last,
                                       OutputIterator result,
                                       BinaryOperation binary_op);
  template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
    ForwardIterator2 adjacent_difference(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                         ForwardIterator1 first,
                                         ForwardIterator1 last,
                                         ForwardIterator2 result);
  template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
            class BinaryOperation>
    ForwardIterator2 adjacent_difference(ExecutionPolicy&& exec, // see [algorithms.parallel.overloads]
                                         ForwardIterator1 first,
                                         ForwardIterator1 last,
                                         ForwardIterator2 result,
                                         BinaryOperation binary_op);

  // [numeric.iota], iota
  template <class ForwardIterator, class T>
    void iota(ForwardIterator first, ForwardIterator last, T value);

  // [numeric.ops.gcd], greatest common divisor
  template <class M, class N>
    constexpr common_type_t<M,N> gcd(M m, N n);

  // [numeric.ops.lcm], least common multiple
  template <class M, class N>
    constexpr common_type_t<M,N> lcm(M m, N n);
}

Требования к типам аргументов алгоритмов, которые описаны во введении к пункту, [algorithms] также применимы к следующим алгоритмам.

На протяжении всего этого подпункта, параметры UnaryOperation, BinaryOperation, BinaryOperation1, и BinaryOperation2 используются всякий раз , когда алгоритм ожидает функциональный объект ( [function.objects]).

[ Note: Использование закрытых диапазонов, а также полуоткрытых диапазонов для определения требований в этом подпункте является преднамеренным. ]end note

29.8.2 Accumulate [accumulate]

template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init); template <class InputIterator, class T, class BinaryOperation> T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);

Requires: T должны соответствовать требованиям CopyConstructible и CopyAssignable типам. В пределах [first, last], binary_­op не должны ни изменять элементы , ни к аннулированию итератора или поддиапазоны.281

Effects: Вычисляет свой результат, инициализируя аккумулятор acc начальным значением, init а затем изменяет его с помощью acc = acc + *i или acc = binary_­op(acc, *i) для каждого итератора i в диапазоне [first, last) по порядку.282

Использование полностью замкнутых диапазонов является преднамеренным.

accumulate аналогичен оператору сокращения APL и функции сокращения Common Lisp, но позволяет избежать трудности определения результата сокращения для пустой последовательности, всегда требуя начального значения.

29.8.3 Reduce [reduce]

template<class InputIterator> typename iterator_traits<InputIterator>::value_type reduce(InputIterator first, InputIterator last);

Effects: Эквивалентен:

return reduce(first, last,
              typename iterator_traits<InputIterator>::value_type{});

template<class ExecutionPolicy, class ForwardIterator> typename iterator_traits<ForwardIterator>::value_type reduce(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last);

Effects: Эквивалентен:

return reduce(std::forward<ExecutionPolicy>(exec), first, last,
              typename iterator_traits<ForwardIterator>::value_type{});

template<class InputIterator, class T> T reduce(InputIterator first, InputIterator last, T init);

Effects: Эквивалентен:

return reduce(first, last, init, plus<>());

template<class ExecutionPolicy, class ForwardIterator, class T> T reduce(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, T init);

Effects: Эквивалентен:

return reduce(std::forward<ExecutionPolicy>(exec), first, last, init, plus<>());

template<class InputIterator, class T, class BinaryOperation> T reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); template<class ExecutionPolicy, class ForwardIterator, class T, class BinaryOperation> T reduce(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, T init, BinaryOperation binary_op);

Requires:

  • T будет MoveConstructible (таблица 23).

  • Все binary_­op(init, *first), binary_­op(*first, init), binary_­op(init, init)и binary_­op(*first, *first) должны быть конвертированы в T.

  • binary_­op не должен ни аннулировать итераторы или поддиапазоны, ни изменять элементы в диапазоне [first, last].

Returns: GENERALIZED_­SUM(binary_­op, init, *i, ...) за каждый i ин [first, last).

Complexity: O(last - first) приложения binary_­op.

[ Note: Разница между reduce и accumulate заключается в том, что reduce применяется binary_­op в неопределенном порядке, что дает недетерминированный результат для неассоциативных или некоммутативных, binary_­op таких как сложение с плавающей запятой. ] end note

29.8.4 Inner product [inner.product]

template <class InputIterator1, class InputIterator2, class T> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); template <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);

Requires: T должны соответствовать требованиям CopyConstructible и CopyAssignable типам. В диапазонах [first1, last1] и [first2, first2 + (last1 - first1)] binary_­op1 и binary_­op2 не должны изменять элементы или делать недействительными итераторы или поддиапазоны.283

Effects: Вычисляет свой результат, инициализируя аккумулятор acc начальным значением, init а затем изменяя его с помощью acc = acc + (*i1) * (*i2) или acc = binary_­op1(acc, binary_­op2(*i1, *i2)) для каждого итератора i1 в диапазоне [first1, last1) и итератора i2 в диапазоне [first2, first2 + (last1 - first1)) по порядку.

Использование полностью замкнутых диапазонов является преднамеренным.

29.8.5 Transform reduce [transform.reduce]

template <class InputIterator1, class InputIterator2, class T> T transform_reduce(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T> T transform_reduce(ExecutionPolicy&& exec, ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, T init);

Effects: Эквивалентен:

return transform_reduce(first1, last1, first2, init, plus<>(), multiplies<>());

template <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> T transform_reduce(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T, class BinaryOperation1, class BinaryOperation2> T transform_reduce(ExecutionPolicy&& exec, ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);

Requires:

  • T будет MoveConstructible (таблица 23).

  • Все

    • binary_­op1(init, init),

    • binary_­op1(init, binary_­op2(*first1, *first2)),

    • binary_­op1(binary_­op2(*first1, *first2), init), а также

    • binary_­op1(binary_­op2(*first1, *first2), binary_­op2(*first1, *first2))

    конвертируется в T.

  • Ни и binary_­op1 не binary_­op2 должны аннулировать поддиапазоны или изменять элементы в диапазонах [first1, last1] и [first2, first2 + (last1 - first1)].

Returns:

GENERALIZED_SUM(binary_op1, init, binary_op2(*i, *(first2 + (i - first1))), ...)

для каждого итератора i в [first1, last1).

Complexity: O(last1 - first1) приложения каждый из binary_­op1 и binary_­op2.

template<class InputIterator, class T, class BinaryOperation, class UnaryOperation> T transform_reduce(InputIterator first, InputIterator last, T init, BinaryOperation binary_op, UnaryOperation unary_op); template<class ExecutionPolicy, class ForwardIterator, class T, class BinaryOperation, class UnaryOperation> T transform_reduce(ExecutionPolicy&& exec, ForwardIterator first, ForwardIterator last, T init, BinaryOperation binary_op, UnaryOperation unary_op);

Requires:

  • T будет MoveConstructible (таблица 23).

  • Все

    • binary_­op(init, init),

    • binary_­op(init, unary_­op(*first)),

    • binary_­op(unary_­op(*first), init), а также

    • binary_­op(unary_­op(*first), unary_­op(*first))

    конвертируется в T.

  • Ни и unary_­op не binary_­op должно аннулировать поддиапазоны или изменять элементы в диапазоне [first, last].

Returns:

GENERALIZED_SUM(binary_op, init, unary_op(*i), ...)

для каждого итератора i в [first, last).

Complexity: O(last - first) приложения каждый из unary_­op и binary_­op.

[ Note: transform_­reduce не относится unary_­op к init. ] end note

29.8.6 Partial sum [partial.sum]

template <class InputIterator, class OutputIterator> OutputIterator partial_sum( InputIterator first, InputIterator last, OutputIterator result); template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator partial_sum( InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);

Requires: InputIteratorТип значения должен быть сконструирован из типа *first. Результат выражения acc + *i или binary_­op(acc, *i) должен быть неявно преобразован в InputIteratorтип значения. acc должен быть writable к result итератору вывода. В диапазонах [first, last] и [result, result + (last - first)] binary_­op не должен изменять элементы или делать недействительными итераторы или поддиапазоны.284

Effects: Для непустого диапазона функция создает аккумулятор acc , тип которого является InputIteratorтипом значения, инициализирует его *firstи присваивает результат *result. Для каждого итератора i по [first + 1, last) порядку acc затем модифицируется с помощью acc = acc + *i или, acc = binary_­op(acc, *i) а результат присваивается *(result + (i - first)).

Returns: result + (last - first).

Complexity: Собственно (last - first) - 1 применения бинарной операции.

Remarks: result может быть равно first.

Использование полностью замкнутых диапазонов является преднамеренным.

29.8.7 Exclusive scan [exclusive.scan]

template<class InputIterator, class OutputIterator, class T> OutputIterator exclusive_scan(InputIterator first, InputIterator last, OutputIterator result, T init);

Effects: Эквивалентен:

return exclusive_scan(first, last, result, init, plus<>());

template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T> ForwardIterator2 exclusive_scan(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, T init);

Effects: Эквивалентен:

return exclusive_scan(std::forward<ExecutionPolicy>(exec),
                      first, last, result, init, plus<>());

template<class InputIterator, class OutputIterator, class T, class BinaryOperation> OutputIterator exclusive_scan(InputIterator first, InputIterator last, OutputIterator result, T init, BinaryOperation binary_op); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T, class BinaryOperation> ForwardIterator2 exclusive_scan(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, T init, BinaryOperation binary_op);

Requires:

  • T будет MoveConstructible (таблица 23).

  • Все binary_­op(init, init), binary_­op(init, *first)и binary_­op(*first, *first) должны быть конвертированы в T.

  • binary_­op не должен ни аннулировать итераторы или поддиапазоны, ни изменять элементы в диапазонах [first, last] или [result, result + (last - first)].

Effects: Каждому целому числу K в [0, last - first) присваивается result + K значение:

GENERALIZED_NONCOMMUTATIVE_SUM(
    binary_op, init, *(first + 0), *(first + 1), ..., *(first + K - 1))

Returns: Конец результирующего диапазона, начинающийся с result.

Complexity: O(last - first) приложения binary_­op.

Remarks: result может быть равно first.

[ Note: Разница между exclusive_­scan и в inclusive_­scan том, что exclusive_­scan исключает ith входной элемент из ith суммы. Если binary_­op не является математически ассоциативным, поведение exclusive_­scan может быть недетерминированным. ] end note

29.8.8 Inclusive scan [inclusive.scan]

template<class InputIterator, class OutputIterator> OutputIterator inclusive_scan(InputIterator first, InputIterator last, OutputIterator result);

Effects: Эквивалентен:

return inclusive_scan(first, last, result, plus<>());

template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2> ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result);

Effects: Эквивалентен:

return inclusive_scan(std::forward<ExecutionPolicy>(exec), first, last, result, plus<>());

template<class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator inclusive_scan(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation> ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op); template<class InputIterator, class OutputIterator, class BinaryOperation, class T> OutputIterator inclusive_scan(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op, T init); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation, class T> ForwardIterator2 inclusive_scan(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op, T init);

Requires:

  • Если init предусмотрено, T должно быть MoveConstructible (Таблица 23); в противном случае ForwardIterator1тип значения должен быть MoveConstructible.

  • Если init предусмотрено, все binary_­op(init, init), binary_­op(init, *first)и binary_­op(*first, *first) должны быть конвертированы в T; в противном случае binary_­op(*first, *first) должен быть преобразован в ForwardIterator1тип значения.

  • binary_­op не должен ни аннулировать итераторы или поддиапазоны, ни изменять элементы в диапазонах [first, last] или [result, result + (last - first)].

Effects: Каждому целому числу K в [0, last - first) присваивается result + K значение

  • GENERALIZED_­NONCOMMUTATIVE_­SUM(
        binary_­op, init, *(first + 0), *(first + 1), ..., *(first + K))

    если init предоставляется, или

  • GENERALIZED_­NONCOMMUTATIVE_­SUM(
        binary_­op, *(first + 0), *(first + 1), ..., *(first + K))

    иначе.

Returns: Конец результирующего диапазона, начинающийся с result.

Complexity: O(last - first) приложения binary_­op.

Remarks: result может быть равно first.

[ Note: Разница между exclusive_­scan и inclusive_­scan состоит в том, что inclusive_­scan включает i-й входной элемент в i-ую сумму. Если binary_­op не является математически ассоциативным, поведение inclusive_­scan может быть недетерминированным. ] end note

29.8.9 Transform exclusive scan [transform.exclusive.scan]

template<class InputIterator, class OutputIterator, class T, class BinaryOperation, class UnaryOperation> OutputIterator transform_exclusive_scan(InputIterator first, InputIterator last, OutputIterator result, T init, BinaryOperation binary_op, UnaryOperation unary_op); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class T, class BinaryOperation, class UnaryOperation> ForwardIterator2 transform_exclusive_scan(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, T init, BinaryOperation binary_op, UnaryOperation unary_op);

Requires:

  • T будет MoveConstructible (таблица 23).

  • Все

    • binary_­op(init, init),

    • binary_­op(init, unary_­op(*first)), а также

    • binary_­op(unary_­op(*first), unary_­op(*first))

    конвертируется в T.

  • Ни и unary_­op не binary_­op должны аннулировать итераторы или поддиапазоны, или изменять элементы в диапазонах [first, last] или [result, result + (last - first)].

Effects: Каждому целому числу K в [0, last - first) присваивается result + K значение:

GENERALIZED_NONCOMMUTATIVE_SUM(
    binary_op, init,
    unary_op(*(first + 0)), unary_op(*(first + 1)), ..., unary_op(*(first + K - 1)))

Returns: Конец результирующего диапазона, начинающийся с result.

Complexity: O(last - first) приложения каждый из unary_­op и binary_­op.

Remarks: result может быть равно first.

[ Note: Разница между transform_­exclusive_­scan и transform_­inclusive_­scan заключается в том, transform_­exclusive_­scan что ith элемент ввода исключается из ith суммы. Если binary_­op не является математически ассоциативным, поведение transform_­exclusive_­scan может быть недетерминированным. transform_­exclusive_­scan не относится unary_­op к init. ] end note

29.8.10 Transform inclusive scan [transform.inclusive.scan]

template<class InputIterator, class OutputIterator, class BinaryOperation, class UnaryOperation> OutputIterator transform_inclusive_scan(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op, UnaryOperation unary_op); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation, class UnaryOperation> ForwardIterator2 transform_inclusive_scan(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op, UnaryOperation unary_op); template<class InputIterator, class OutputIterator, class BinaryOperation, class UnaryOperation, class T> OutputIterator transform_inclusive_scan(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op, UnaryOperation unary_op, T init); template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation, class UnaryOperation, class T> ForwardIterator2 transform_inclusive_scan(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op, UnaryOperation unary_op, T init);

Requires:

  • Если init предусмотрено, T должно быть MoveConstructible (Таблица 23); в противном случае ForwardIterator1тип значения должен быть MoveConstructible.

  • Если init предоставляется, все

    • binary_­op(init, init),

    • binary_­op(init, unary_­op(*first)), а также

    • binary_­op(unary_­op(*first), unary_­op(*first))

    может быть конвертирован в T; в противном случае binary_­op(unary_­op(*first), unary_­op(*first)) должен быть преобразован в ForwardIterator1тип значения.

  • Ни и unary_­op не binary_­op должны аннулировать итераторы или поддиапазоны, а также изменять элементы в диапазонах [first, last] или [result, result + (last - first)].

Effects: Каждому целому числу K в [0, last - first) присваивается result + K значение

  • GENERALIZED_­NONCOMMUTATIVE_­SUM(
        binary_­op, init,
        unary_­op(*(first + 0)), unary_­op(*(first + 1)), ..., unary_­op(*(first + K)))

    если init предоставляется, или

  • GENERALIZED_­NONCOMMUTATIVE_­SUM(
        binary_­op,
        unary_­op(*(first + 0)), unary_­op(*(first + 1)), ..., unary_­op(*(first + K)))

    иначе.

Returns: Конец результирующего диапазона, начинающийся с result.

Complexity: O(last - first) приложения каждый из unary_­op и binary_­op.

Remarks: result может быть равно first.

[ Note: Разница между transform_­exclusive_­scan и transform_­inclusive_­scan заключается в том, transform_­inclusive_­scan что ith в ith сумму входит входной элемент . Если binary_­op не является математически ассоциативным, поведение transform_­inclusive_­scan может быть недетерминированным. transform_­inclusive_­scan не относится unary_­op к init. ] end note

29.8.11 Adjacent difference [adjacent.difference]

template <class InputIterator, class OutputIterator> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result); template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2> ForwardIterator2 adjacent_difference(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result); template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); template <class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class BinaryOperation> ForwardIterator2 adjacent_difference(ExecutionPolicy&& exec, ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 result, BinaryOperation binary_op);

Requires:

  • Для перегрузки без каких - либо ExecutionPolicy, InputIterator«с типом значение должно быть MoveAssignable (таблица 25) и должны быть конструктивны от типа *first. acc (определенный ниже) должен быть доступен для записи ( [iterator.requirements.general]) result итератору вывода. Результат выражения val - acc или binary_­op(val, acc) должен быть доступен для записи в result итератор вывода.

  • Для перегрузок с a ExecutionPolicyтип значения ForwardIterator1 должен быть CopyConstructible (Таблица 24), конструируемым из выражения *first - *first или binary_­op(*first, *first)и присваиваемым типу значения ForwardIterator2.

  • Для всех перегрузок, в диапазонах [first, last] и [result, result + (last - first)], binary_­op не должен ни изменять элементы , ни к аннулированию итератора или поддиапазонов.285

Effects: Для перегрузок без ExecutionPolicy и с непустым диапазоном функция создает аккумулятор acc , тип которого является InputIteratorтипом значения, инициализирует его *firstи присваивает результат *result. Для каждого итератора i по [first + 1, last) порядку создает объект val , тип которого является типом InputIteratorзначения, инициализирует его *i, вычисляет val - acc или binary_­op(val, acc), присваивает результат *(result + (i - first))и перемещает присваивает из val в acc.

Для перегрузок с ExecutionPolicy диапазоном и непустым диапазоном сначала функция создает объект, тип которого является ForwardIterator1типом значения, инициализирует его *firstи присваивает результат *result. Затем для каждого d in [1, last - first - 1]создает объект val , тип которого является типом ForwardIterator1значения, инициализирует его с помощью *(first + d) - *(first + d - 1) или binary_­op(*(first + d), *(first + d - 1))и присваивает результат *(result + d).

Returns: result + (last - first).

Complexity: Собственно (last - first) - 1 применения бинарной операции.

Remarks: Для перегрузок без ExecutionPolicy, result может быть равно first. Для перегрузок с ExecutionPolicyдиапазоны [first, last) и [result, result + (last - first)) не должны перекрываться.

Использование полностью замкнутых диапазонов является преднамеренным.

29.8.12 Iota [numeric.iota]

template <class ForwardIterator, class T> void iota(ForwardIterator first, ForwardIterator last, T value);

Requires: T должен быть преобразован в ForwardIteratorтип значения. Выражение ++val, где val имеет тип T, должно быть правильно сформировано.

Effects: Для каждого элемента, на который ссылается итератор i в диапазоне [first, last), присваивает *i = value и увеличивает, value как если бы ++value.

Complexity: Ровно last - first прибавки и присваивания.

29.8.13 Greatest common divisor [numeric.ops.gcd]

template <class M, class N> constexpr common_type_t<M,N> gcd(M m, N n);

Requires: |m| и |n| должен быть представлен как значение common_­type_­t<M, N>. [ Note: Эти требования гарантируют, например, что gcd(m, m) = |m| это может быть представлено как значение типа M. ] end note

Remarks: Если один из типов M или N не является целочисленным типом, либо один из них cv bool, программа имеет неправильный формат .

Returns: Ноль, когда m и n оба равны нулю. В противном случае возвращает наибольший общий делитель |m| и |n|.

Throws: Ничего такого.

29.8.14 Least common multiple [numeric.ops.lcm]

template <class M, class N> constexpr common_type_t<M,N> lcm(M m, N n);

Requires: |m| и |n| должен быть представлен как значение common_­type_­t<M, N>. Наименьшее общее кратное для |m| и |n| должно быть представлено как значение типа common_­type_­t<M,N>.

Remarks: Если один из типов M или N не является целочисленным, или если один cv bool из них, программа имеет неверный формат .

Returns: Ноль, когда либо m либо n равно нулю. В противном случае возвращает наименьшее общее кратное для |m| и |n|.

Throws: Ничего такого.

29.9 Mathematical functions for floating-point types [c.math]

29.9.1 Header <cmath> synopsis [cmath.syn]

namespace std {
  using float_t = see below;
  using double_t = see below;
}

#define HUGE_VAL see below
#define HUGE_VALF see below
#define HUGE_VALL see below
#define INFINITY see below
#define NAN see below
#define FP_INFINITE see below
#define FP_NAN see below
#define FP_NORMAL see below
#define FP_SUBNORMAL see below
#define FP_ZERO see below
#define FP_FAST_FMA see below
#define FP_FAST_FMAF see below
#define FP_FAST_FMAL see below
#define FP_ILOGB0 see below
#define FP_ILOGBNAN see below
#define MATH_ERRNO see below
#define MATH_ERREXCEPT see below

#define math_errhandling see below

namespace std {
  float acos(float x);  // see [library.c]
  double acos(double x);
  long double acos(long double x);  // see [library.c]
  float acosf(float x);
  long double acosl(long double x);

  float asin(float x);  // see [library.c]
  double asin(double x);
  long double asin(long double x);  // see [library.c]
  float asinf(float x);
  long double asinl(long double x);

  float atan(float x);  // see [library.c]
  double atan(double x);
  long double atan(long double x);  // see [library.c]
  float atanf(float x);
  long double atanl(long double x);

  float atan2(float y, float x);  // see [library.c]
  double atan2(double y, double x);
  long double atan2(long double y, long double x);  // see [library.c]
  float atan2f(float y, float x);
  long double atan2l(long double y, long double x);

  float cos(float x);  // see [library.c]
  double cos(double x);
  long double cos(long double x);  // see [library.c]
  float cosf(float x);
  long double cosl(long double x);

  float sin(float x);  // see [library.c]
  double sin(double x);
  long double sin(long double x);  // see [library.c]
  float sinf(float x);
  long double sinl(long double x);

  float tan(float x);  // see [library.c]
  double tan(double x);
  long double tan(long double x);  // see [library.c]
  float tanf(float x);
  long double tanl(long double x);

  float acosh(float x);  // see [library.c]
  double acosh(double x);
  long double acosh(long double x);  // see [library.c]
  float acoshf(float x);
  long double acoshl(long double x);

  float asinh(float x);  // see [library.c]
  double asinh(double x);
  long double asinh(long double x);  // see [library.c]
  float asinhf(float x);
  long double asinhl(long double x);

  float atanh(float x);  // see [library.c]
  double atanh(double x);
  long double atanh(long double x);  // see [library.c]
  float atanhf(float x);
  long double atanhl(long double x);

  float cosh(float x);  // see [library.c]
  double cosh(double x);
  long double cosh(long double x);  // see [library.c]
  float coshf(float x);
  long double coshl(long double x);

  float sinh(float x);  // see [library.c]
  double sinh(double x);
  long double sinh(long double x);  // see [library.c]
  float sinhf(float x);
  long double sinhl(long double x);

  float tanh(float x);  // see [library.c]
  double tanh(double x);
  long double tanh(long double x);  // see [library.c]
  float tanhf(float x);
  long double tanhl(long double x);

  float exp(float x);  // see [library.c]
  double exp(double x);
  long double exp(long double x);  // see [library.c]
  float expf(float x);
  long double expl(long double x);

  float exp2(float x);  // see [library.c]
  double exp2(double x);
  long double exp2(long double x);  // see [library.c]
  float exp2f(float x);
  long double exp2l(long double x);

  float expm1(float x);  // see [library.c]
  double expm1(double x);
  long double expm1(long double x);  // see [library.c]
  float expm1f(float x);
  long double expm1l(long double x);

  float frexp(float value, int* exp);  // see [library.c]
  double frexp(double value, int* exp);
  long double frexp(long double value, int* exp);  // see [library.c]
  float frexpf(float value, int* exp);
  long double frexpl(long double value, int* exp);

  int ilogb(float x);  // see [library.c]
  int ilogb(double x);
  int ilogb(long double x);  // see [library.c]
  int ilogbf(float x);
  int ilogbl(long double x);

  float ldexp(float x, int exp);  // see [library.c]
  double ldexp(double x, int exp);
  long double ldexp(long double x, int exp);  // see [library.c]
  float ldexpf(float x, int exp);
  long double ldexpl(long double x, int exp);

  float log(float x);  // see [library.c]
  double log(double x);
  long double log(long double x);  // see [library.c]
  float logf(float x);
  long double logl(long double x);

  float log10(float x);  // see [library.c]
  double log10(double x);
  long double log10(long double x);  // see [library.c]
  float log10f(float x);
  long double log10l(long double x);

  float log1p(float x);  // see [library.c]
  double log1p(double x);
  long double log1p(long double x);  // see [library.c]
  float log1pf(float x);
  long double log1pl(long double x);

  float log2(float x);  // see [library.c]
  double log2(double x);
  long double log2(long double x);  // see [library.c]
  float log2f(float x);
  long double log2l(long double x);

  float logb(float x);  // see [library.c]
  double logb(double x);
  long double logb(long double x);  // see [library.c]
  float logbf(float x);
  long double logbl(long double x);

  float modf(float value, float* iptr);  // see [library.c]
  double modf(double value, double* iptr);
  long double modf(long double value, long double* iptr);  // see [library.c]
  float modff(float value, float* iptr);
  long double modfl(long double value, long double* iptr);

  float scalbn(float x, int n);  // see [library.c]
  double scalbn(double x, int n);
  long double scalbn(long double x, int n);  // see [library.c]
  float scalbnf(float x, int n);
  long double scalbnl(long double x, int n);

  float scalbln(float x, long int n);  // see [library.c]
  double scalbln(double x, long int n);
  long double scalbln(long double x, long int n);  // see [library.c]
  float scalblnf(float x, long int n);
  long double scalblnl(long double x, long int n);

  float cbrt(float x);  // see [library.c]
  double cbrt(double x);
  long double cbrt(long double x);  // see [library.c]
  float cbrtf(float x);
  long double cbrtl(long double x);

  // [c.math.abs], absolute values
  int abs(int j);
  long int abs(long int j);
  long long int abs(long long int j);
  float abs(float j);
  double abs(double j);
  long double abs(long double j);

  float fabs(float x);  // see [library.c]
  double fabs(double x);
  long double fabs(long double x);  // see [library.c]
  float fabsf(float x);
  long double fabsl(long double x);

  float hypot(float x, float y);  // see [library.c]
  double hypot(double x, double y);
  long double hypot(double x, double y);  // see [library.c]
  float hypotf(float x, float y);
  long double hypotl(long double x, long double y);

  // [c.math.hypot3], three-dimensional hypotenuse
  float hypot(float x, float y, float z);
  double hypot(double x, double y, double z);
  long double hypot(long double x, long double y, long double z);

  float pow(float x, float y);  // see [library.c]
  double pow(double x, double y);
  long double pow(long double x, long double y);  // see [library.c]
  float powf(float x, float y);
  long double powl(long double x, long double y);

  float sqrt(float x);  // see [library.c]
  double sqrt(double x);
  long double sqrt(long double x);  // see [library.c]
  float sqrtf(float x);
  long double sqrtl(long double x);

  float erf(float x);  // see [library.c]
  double erf(double x);
  long double erf(long double x);  // see [library.c]
  float erff(float x);
  long double erfl(long double x);

  float erfc(float x);  // see [library.c]
  double erfc(double x);
  long double erfc(long double x);  // see [library.c]
  float erfcf(float x);
  long double erfcl(long double x);

  float lgamma(float x);  // see [library.c]
  double lgamma(double x);
  long double lgamma(long double x);  // see [library.c]
  float lgammaf(float x);
  long double lgammal(long double x);

  float tgamma(float x);  // see [library.c]
  double tgamma(double x);
  long double tgamma(long double x);  // see [library.c]
  float tgammaf(float x);
  long double tgammal(long double x);

  float ceil(float x);  // see [library.c]
  double ceil(double x);
  long double ceil(long double x);  // see [library.c]
  float ceilf(float x);
  long double ceill(long double x);

  float floor(float x);  // see [library.c]
  double floor(double x);
  long double floor(long double x);  // see [library.c]
  float floorf(float x);
  long double floorl(long double x);

  float nearbyint(float x);  // see [library.c]
  double nearbyint(double x);
  long double nearbyint(long double x);  // see [library.c]
  float nearbyintf(float x);
  long double nearbyintl(long double x);

  float rint(float x);  // see [library.c]
  double rint(double x);
  long double rint(long double x);  // see [library.c]
  float rintf(float x);
  long double rintl(long double x);

  long int lrint(float x);  // see [library.c]
  long int lrint(double x);
  long int lrint(long double x);  // see [library.c]
  long int lrintf(float x);
  long int lrintl(long double x);

  long long int llrint(float x);  // see [library.c]
  long long int llrint(double x);
  long long int llrint(long double x);  // see [library.c]
  long long int llrintf(float x);
  long long int llrintl(long double x);

  float round(float x);  // see [library.c]
  double round(double x);
  long double round(long double x);  // see [library.c]
  float roundf(float x);
  long double roundl(long double x);

  long int lround(float x);  // see [library.c]
  long int lround(double x);
  long int lround(long double x);  // see [library.c]
  long int lroundf(float x);
  long int lroundl(long double x);

  long long int llround(float x);  // see [library.c]
  long long int llround(double x);
  long long int llround(long double x);  // see [library.c]
  long long int llroundf(float x);
  long long int llroundl(long double x);

  float trunc(float x);  // see [library.c]
  double trunc(double x);
  long double trunc(long double x);  // see [library.c]
  float truncf(float x);
  long double truncl(long double x);

  float fmod(float x, float y);  // see [library.c]
  double fmod(double x, double y);
  long double fmod(long double x, long double y);  // see [library.c]
  float fmodf(float x, float y);
  long double fmodl(long double x, long double y);

  float remainder(float x, float y);  // see [library.c]
  double remainder(double x, double y);
  long double remainder(long double x, long double y);  // see [library.c]
  float remainderf(float x, float y);
  long double remainderl(long double x, long double y);

  float remquo(float x, float y, int* quo);  // see [library.c]
  double remquo(double x, double y, int* quo);
  long double remquo(long double x, long double y, int* quo);  // see [library.c]
  float remquof(float x, float y, int* quo);
  long double remquol(long double x, long double y, int* quo);

  float copysign(float x, float y);  // see [library.c]
  double copysign(double x, double y);
  long double copysign(long double x, long double y);  // see [library.c]
  float copysignf(float x, float y);
  long double copysignl(long double x, long double y);

  double nan(const char* tagp);
  float nanf(const char* tagp);
  long double nanl(const char* tagp);

  float nextafter(float x, float y);  // see [library.c]
  double nextafter(double x, double y);
  long double nextafter(long double x, long double y);  // see [library.c]
  float nextafterf(float x, float y);
  long double nextafterl(long double x, long double y);

  float nexttoward(float x, long double y);  // see [library.c]
  double nexttoward(double x, long double y);
  long double nexttoward(long double x, long double y);  // see [library.c]
  float nexttowardf(float x, long double y);
  long double nexttowardl(long double x, long double y);

  float fdim(float x, float y);  // see [library.c]
  double fdim(double x, double y);
  long double fdim(long double x, long double y);  // see [library.c]
  float fdimf(float x, float y);
  long double fdiml(long double x, long double y);

  float fmax(float x, float y);  // see [library.c]
  double fmax(double x, double y);
  long double fmax(long double x, long double y);  // see [library.c]
  float fmaxf(float x, float y);
  long double fmaxl(long double x, long double y);

  float fmin(float x, float y);  // see [library.c]
  double fmin(double x, double y);
  long double fmin(long double x, long double y);  // see [library.c]
  float fminf(float x, float y);
  long double fminl(long double x, long double y);

  float fma(float x, float y, float z);  // see [library.c]
  double fma(double x, double y, double z);
  long double fma(long double x, long double y, long double z);  // see [library.c]
  float fmaf(float x, float y, float z);
  long double fmal(long double x, long double y, long double z);

  // [c.math.fpclass], classification / comparison functions
  int fpclassify(float x);
  int fpclassify(double x);
  int fpclassify(long double x);

  int isfinite(float x);
  int isfinite(double x);
  int isfinite(long double x);

  int isinf(float x);
  int isinf(double x);
  int isinf(long double x);

  int isnan(float x);
  int isnan(double x);
  int isnan(long double x);

  int isnormal(float x);
  int isnormal(double x);
  int isnormal(long double x);

  int signbit(float x);
  int signbit(double x);
  int signbit(long double x);

  int isgreater(float x, float y);
  int isgreater(double x, double y);
  int isgreater(long double x, long double y);

  int isgreaterequal(float x, float y);
  int isgreaterequal(double x, double y);
  int isgreaterequal(long double x, long double y);

  int isless(float x, float y);
  int isless(double x, double y);
  int isless(long double x, long double y);

  int islessequal(float x, float y);
  int islessequal(double x, double y);
  int islessequal(long double x, long double y);

  int islessgreater(float x, float y);
  int islessgreater(double x, double y);
  int islessgreater(long double x, long double y);

  int isunordered(float x, float y);
  int isunordered(double x, double y);
  int isunordered(long double x, long double y);

  // [sf.cmath], mathematical special functions

  // [sf.cmath.assoc_laguerre], associated Laguerre polynomials
  double       assoc_laguerre(unsigned n, unsigned m, double x);
  float        assoc_laguerref(unsigned n, unsigned m, float x);
  long double  assoc_laguerrel(unsigned n, unsigned m, long double x);

  // [sf.cmath.assoc_legendre], associated Legendre functions
  double       assoc_legendre(unsigned l, unsigned m, double x);
  float        assoc_legendref(unsigned l, unsigned m, float x);
  long double  assoc_legendrel(unsigned l, unsigned m, long double x);

  // [sf.cmath.beta], beta function
  double       beta(double x, double y);
  float        betaf(float x, float y);
  long double  betal(long double x, long double y);

  // [sf.cmath.comp_ellint_1], complete elliptic integral of the first kind
  double       comp_ellint_1(double k);
  float        comp_ellint_1f(float k);
  long double  comp_ellint_1l(long double k);

  // [sf.cmath.comp_ellint_2], complete elliptic integral of the second kind
  double       comp_ellint_2(double k);
  float        comp_ellint_2f(float k);
  long double  comp_ellint_2l(long double k);

  // [sf.cmath.comp_ellint_3], complete elliptic integral of the third kind
  double       comp_ellint_3(double k, double nu);
  float        comp_ellint_3f(float k, float nu);
  long double  comp_ellint_3l(long double k, long double nu);

  // [sf.cmath.cyl_bessel_i], regular modified cylindrical Bessel functions
  double       cyl_bessel_i(double nu, double x);
  float        cyl_bessel_if(float nu, float x);
  long double  cyl_bessel_il(long double nu, long double x);

  // [sf.cmath.cyl_bessel_j], cylindrical Bessel functions of the first kind
  double       cyl_bessel_j(double nu, double x);
  float        cyl_bessel_jf(float nu, float x);
  long double  cyl_bessel_jl(long double nu, long double x);

  // [sf.cmath.cyl_bessel_k], irregular modified cylindrical Bessel functions
  double       cyl_bessel_k(double nu, double x);
  float        cyl_bessel_kf(float nu, float x);
  long double  cyl_bessel_kl(long double nu, long double x);

  // [sf.cmath.cyl_neumann], cylindrical Neumann functions;
  // cylindrical Bessel functions of the second kind
  double       cyl_neumann(double nu, double x);
  float        cyl_neumannf(float nu, float x);
  long double  cyl_neumannl(long double nu, long double x);

  // [sf.cmath.ellint_1], incomplete elliptic integral of the first kind
  double       ellint_1(double k, double phi);
  float        ellint_1f(float k, float phi);
  long double  ellint_1l(long double k, long double phi);

  // [sf.cmath.ellint_2], incomplete elliptic integral of the second kind
  double       ellint_2(double k, double phi);
  float        ellint_2f(float k, float phi);
  long double  ellint_2l(long double k, long double phi);

  // [sf.cmath.ellint_3], incomplete elliptic integral of the third kind
  double       ellint_3(double k, double nu, double phi);
  float        ellint_3f(float k, float nu, float phi);
  long double  ellint_3l(long double k, long double nu, long double phi);

  // [sf.cmath.expint], exponential integral
  double       expint(double x);
  float        expintf(float x);
  long double  expintl(long double x);

  // [sf.cmath.hermite], Hermite polynomials
  double       hermite(unsigned n, double x);
  float        hermitef(unsigned n, float x);
  long double  hermitel(unsigned n, long double x);

  // [sf.cmath.laguerre], Laguerre polynomials
  double       laguerre(unsigned n, double x);
  float        laguerref(unsigned n, float x);
  long double  laguerrel(unsigned n, long double x);

  // [sf.cmath.legendre], Legendre polynomials
  double       legendre(unsigned l, double x);
  float        legendref(unsigned l, float x);
  long double  legendrel(unsigned l, long double x);

  // [sf.cmath.riemann_zeta], Riemann zeta function
  double       riemann_zeta(double x);
  float        riemann_zetaf(float x);
  long double  riemann_zetal(long double x);

  // [sf.cmath.sph_bessel], spherical Bessel functions of the first kind
  double       sph_bessel(unsigned n, double x);
  float        sph_besself(unsigned n, float x);
  long double  sph_bessell(unsigned n, long double x);

  // [sf.cmath.sph_legendre], spherical associated Legendre functions
  double       sph_legendre(unsigned l, unsigned m, double theta);
  float        sph_legendref(unsigned l, unsigned m, float theta);
  long double  sph_legendrel(unsigned l, unsigned m, long double theta);

  // [sf.cmath.sph_neumann], spherical Neumann functions;
  // spherical Bessel functions of the second kind:
  double       sph_neumann(unsigned n, double x);
  float        sph_neumannf(unsigned n, float x);
  long double  sph_neumannl(unsigned n, long double x);
}

Содержание и значение заголовка <cmath> такие же, как и у заголовка стандартной библиотеки C <math.h>, с добавлением three-dimensional hypotenuse функции и математических специальных функций, описанных в [sf.cmath]. [ Note: Некоторые функции имеют дополнительные перегрузки в этом международном стандарте, но их поведение такое же, как и в C standard library. ]end note

Для каждого набора перегруженных функций внутри <cmath>, за исключением abs, должны быть дополнительные перегрузки, достаточные для обеспечения:

  1. 1.Если какой-либо аргумент арифметического типа, соответствующий double параметру, имеет тип long double, то все аргументы, arithmetic type соответствующие double параметрам, эффективно приводятся к long double.

  2. 2.В противном случае, если какой-либо аргумент арифметического типа, соответствующий double параметру, имеет тип double или целочисленный тип, то все аргументы арифметического типа, соответствующие double параметрам, эффективно приводятся к double.

  3. 3.В противном случае все аргументы арифметического типа, соответствующие double параметрам, имеют тип float.

[ Note: abs исключен из этих правил, чтобы оставаться совместимым с C. ]end note

См. Также: ISO C 7.12.

29.9.2 Absolute values [c.math.abs]

[ Note: Заголовки <cstdlib> и <cmath> объявляют функции, описанные в этом подпункте. ]end note

int abs(int j); long int abs(long int j); long long int abs(long long int j); float abs(float j); double abs(double j); long double abs(long double j);

Effects: Эти abs функции имеют семантику , указанную в стандартной библиотеке C для функций abs, labs, llabs, fabsf, fabs, и fabsl.

Remarks: Если abs() вызывается с аргументом типа, X для которого is_­unsigned_­v<X> is true и if X не может быть преобразован в int by integral promotion, программа имеет неправильный формат. [ Note: Аргументы, которые могут быть повышены int , разрешены для совместимости с C. ] end note

См. Также: ISO C 7.12.7.2, 7.22.6.1.

29.9.3 Three-dimensional hypotenuse [c.math.hypot3]

float hypot(float x, float y, float z); double hypot(double x, double y, double z); long double hypot(long double x, long double y, long double z);

Returns: x2+y2+z2.

29.9.4 Classification / comparison functions [c.math.fpclass]

Функции классификации / сравнения ведут себя так же, как макросы C с соответствующими именами, определенными в стандартной библиотеке C. Каждая функция перегружена для трех типов с плавающей запятой.

См. Также: ISO C 7.12.3, 7.12.4.

29.9.5 Mathematical special functions [sf.cmath]

Если какое-либо значение аргумента для любой из функций, указанных в этом подпункте, является NaN (не числом), функция должна возвращать NaN, но не должна сообщать об ошибке домена. В противном случае функция должна сообщать об ошибке домена только для тех значений аргументов, для которых:

  • предложение описания функции Returns: явно указывает домен, и значения этих аргументов выходят за пределы указанного домена, или

  • соответствующее значение математической функции имеет ненулевую мнимую составляющую, или

  • соответствующая математическая функция математически не определена.286

Если не указано иное, каждая функция определена для всех конечных значений, для отрицательной бесконечности и для положительной бесконечности.

Математическая функция определяется математически для данного набора значений аргумента (a), если она явно определена для этого набора значений аргумента, или (b), если ее предельное значение существует и не зависит от направления подхода.

29.9.5.1 Associated Laguerre polynomials [sf.cmath.assoc_laguerre]

double assoc_laguerre(unsigned n, unsigned m, double x); float assoc_laguerref(unsigned n, unsigned m, float x); long double assoc_laguerrel(unsigned n, unsigned m, long double x);

Effects: Эти функции вычисления , связанные Лагерра многочлены своих аргументов n, mи x.

Returns:

Lmn(x)=(1)mdmdxmLn+m(x),for x0

где n есть n, m есть mи x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if n >= 128 или if m >= 128.

29.9.5.2 Associated Legendre functions [sf.cmath.assoc_legendre]

double assoc_legendre(unsigned l, unsigned m, double x); float assoc_legendref(unsigned l, unsigned m, float x); long double assoc_legendrel(unsigned l, unsigned m, long double x);

Effects: Эти функции вычисляются соответствующие функции Лежандра своих аргументов l, mи x.

Returns:

Pm(x)=(1x2)m/2dmdxmP(x),for |x|1

где l есть l, m есть mи x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if l >= 128.

29.9.5.3 Beta function [sf.cmath.beta]

double beta(double x, double y); float betaf(float x, float y); long double betal(long double x, long double y);

Effects: Эти функции вычисляют бета-функцию своих соответствующих аргументов x и y.

Returns:

B(x,y)=Γ(x)Γ(y)Γ(x+y),for x>0,y>0

где x есть x и y есть y.

29.9.5.4 Complete elliptic integral of the first kind [sf.cmath.comp_ellint_1]

double comp_ellint_1(double k); float comp_ellint_1f(float k); long double comp_ellint_1l(long double k);

Effects: Эти функции вычисляют полный эллиптический интеграл первого рода своих соответствующих аргументов k.

Returns:

K(k)=F(k,π/2),for |k|1

где k есть k.

См. Также [sf.cmath.ellint_1].

29.9.5.5 Complete elliptic integral of the second kind [sf.cmath.comp_ellint_2]

double comp_ellint_2(double k); float comp_ellint_2f(float k); long double comp_ellint_2l(long double k);

Effects: Эти функции вычисляют полный эллиптический интеграл второго рода своих соответствующих аргументов k.

Returns:

E(k)=E(k,π/2),for |k|1

где k есть k.

См. Также [sf.cmath.ellint_2].

29.9.5.6 Complete elliptic integral of the third kind [sf.cmath.comp_ellint_3]

double comp_ellint_3(double k, double nu); float comp_ellint_3f(float k, float nu); long double comp_ellint_3l(long double k, long double nu);

Effects: Эти функции вычисляют полный эллиптический интеграл третьего рода от своих соответствующих аргументов k и nu.

Returns:

Π(ν,k)=Π(ν,k,π/2),for |k|1

где k есть k и ν есть nu.

См. Также [sf.cmath.ellint_3].

29.9.5.7 Regular modified cylindrical Bessel functions [sf.cmath.cyl_bessel_i]

double cyl_bessel_i(double nu, double x); float cyl_bessel_if(float nu, float x); long double cyl_bessel_il(long double nu, long double x);

Effects: Эти функции вычисляют обычные модифицированные цилиндрические функции Бесселя своих соответствующих аргументов nu и x.

Returns:

Iν(x)=iνJν(ix)=k=0(x/2)ν+2kk!Γ(ν+k+1),for x0

где ν есть nu и x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if nu >= 128.

См. Также [sf.cmath.cyl_bessel_j].

29.9.5.8 Cylindrical Bessel functions of the first kind [sf.cmath.cyl_bessel_j]

double cyl_bessel_j(double nu, double x); float cyl_bessel_jf(float nu, float x); long double cyl_bessel_jl(long double nu, long double x);

Effects: Эти функции вычисляют цилиндрические функции Бесселя первого рода с соответствующими аргументами nu и x.

Returns:

Jν(x)=k=0(1)k(x/2)ν+2kk!Γ(ν+k+1),for x0

где ν есть nu и x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if nu >= 128.

29.9.5.9 Irregular modified cylindrical Bessel functions [sf.cmath.cyl_bessel_k]

double cyl_bessel_k(double nu, double x); float cyl_bessel_kf(float nu, float x); long double cyl_bessel_kl(long double nu, long double x);

Effects: Эти функции вычисляют нерегулярные модифицированные цилиндрические функции Бесселя своих соответствующих аргументов nu и x.

Returns:

Kν(x)=(π/2)iν+1(Jν(ix)+iNν(ix))=⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪π2Iν(x)Iν(x)sinνπ,for x0 and non-integral νπ2limμνIμ(x)Iμ(x)sinμπ,for x0 and integral ν

где ν есть nu и x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if nu >= 128.

29.9.5.10 Cylindrical Neumann functions [sf.cmath.cyl_neumann]

double cyl_neumann(double nu, double x); float cyl_neumannf(float nu, float x); long double cyl_neumannl(long double nu, long double x);

Effects: Эти функции вычисляют цилиндрические функции Неймана, также известные как цилиндрические функции Бесселя второго рода, их соответствующих аргументов nu и x.

Returns:

Nν(x)=⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪Jν(x)cosνπJν(x)sinνπ,for x0 and non-integral νlimμνJμ(x)cosμπJμ(x)sinμπ,for x0 and integral ν

где ν есть nu и x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if nu >= 128.

См. Также [sf.cmath.cyl_bessel_j].

29.9.5.11 Incomplete elliptic integral of the first kind [sf.cmath.ellint_1]

double ellint_1(double k, double phi); float ellint_1f(float k, float phi); long double ellint_1l(long double k, long double phi);

Effects: Эти функции вычисляют неполный эллиптический интеграл первого типа своих соответствующих аргументов k и phi ( phi измеряется в радианах).

Returns:

F(k,ϕ)=ϕ0dθ1k2sin2θ,for |k|1

где k есть k и φ есть phi.

29.9.5.12 Incomplete elliptic integral of the second kind [sf.cmath.ellint_2]

double ellint_2(double k, double phi); float ellint_2f(float k, float phi); long double ellint_2l(long double k, long double phi);

Effects: Эти функции вычисляют неполный эллиптический интеграл второго рода своих соответствующих аргументов k и phi ( phi измеряется в радианах).

Returns:

E(k,ϕ)=ϕ01k2sin2θdθ,for |k|1

где k есть k и φ есть phi.

29.9.5.13 Incomplete elliptic integral of the third kind [sf.cmath.ellint_3]

double ellint_3(double k, double nu, double phi); float ellint_3f(float k, float nu, float phi); long double ellint_3l(long double k, long double nu, long double phi);

Effects: Эти функции вычислить неполный эллиптический интеграл третьего рода их соответствующих аргументов k, nuи phi ( phi измеренный в радианах).

Returns:

Π(ν,k,ϕ)=ϕ0dθ(1νsin2θ)1k2sin2θ,for |k|1

где ν есть nu, k есть kи φ есть phi.

29.9.5.14 Exponential integral [sf.cmath.expint]

double expint(double x); float expintf(float x); long double expintl(long double x);

Effects: Эти функции вычисляют экспоненциальный интеграл своих соответствующих аргументов x.

Returns:

Ei(x)=xettdt

где x есть x.

29.9.5.15 Hermite polynomials [sf.cmath.hermite]

double hermite(unsigned n, double x); float hermitef(unsigned n, float x); long double hermitel(unsigned n, long double x);

Effects: Эти функции вычисляют полиномы Эрмита своих аргументов n и x.

Returns:

Hn(x)=(1)nex2dndxnex2

где n есть n и x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if n >= 128.

29.9.5.16 Laguerre polynomials [sf.cmath.laguerre]

double laguerre(unsigned n, double x); float laguerref(unsigned n, float x); long double laguerrel(unsigned n, long double x);

Effects: Эти функции вычисляют полиномы Лагерра своих аргументов n и x.

Returns:

Ln(x)=exn!dndxn(xnex),for x0

где n есть n и x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if n >= 128.

29.9.5.17 Legendre polynomials [sf.cmath.legendre]

double legendre(unsigned l, double x); float legendref(unsigned l, float x); long double legendrel(unsigned l, long double x);

Effects: Эти функции вычисляют полиномы Лежандра своих аргументов l и x.

Returns:

P(x)=12!ddx(x21),for |x|1

где l есть l и x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if l >= 128.

29.9.5.18 Riemann zeta function [sf.cmath.riemann_zeta]

double riemann_zeta(double x); float riemann_zetaf(float x); long double riemann_zetal(long double x);

Effects: Эти функции вычисляют дзета-функцию Римана своих соответствующих аргументов x.

Returns:

ζ(x)=⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪k=1kx,for x>11121xk=1(1)k1kx,for 0x12xπx1sin(πx2)Γ(1x)ζ(1x),for x<0

где x есть x.

29.9.5.19 Spherical Bessel functions of the first kind [sf.cmath.sph_bessel]

double sph_bessel(unsigned n, double x); float sph_besself(unsigned n, float x); long double sph_bessell(unsigned n, long double x);

Effects: Эти функции вычисляют сферические функции Бесселя первого рода их соответствующих аргументов n и x.

Returns:

jn(x)=(π/2x)1/2Jn+1/2(x),for x0

где n есть n и x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if n >= 128.

См. Также [sf.cmath.cyl_bessel_j].

29.9.5.20 Spherical associated Legendre functions [sf.cmath.sph_legendre]

double sph_legendre(unsigned l, unsigned m, double theta); float sph_legendref(unsigned l, unsigned m, float theta); long double sph_legendrel(unsigned l, unsigned m, long double theta);

Effects: Эти функции вычислить сферические функции Лежандра связанные с их соответствующих аргументов l, mи theta ( theta в радианах).

Returns:

Ym(θ,0)

куда

Ym(θ,ϕ)=(1)m[(2+1)4π(m)!(+m)!]1/2Pm(cosθ)eimϕ,for |m|

и l есть l, m есть mи θ есть theta.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if l >= 128.

См. Также [sf.cmath.assoc_legendre].

29.9.5.21 Spherical Neumann functions [sf.cmath.sph_neumann]

double sph_neumann(unsigned n, double x); float sph_neumannf(unsigned n, float x); long double sph_neumannl(unsigned n, long double x);

Effects: Эти функции вычисляют сферические функции Неймана, также известные как сферические функции Бесселя второго рода, их соответствующих аргументов n и x.

Returns:

nn(x)=(π/2x)1/2Nn+1/2(x),for x0

где n есть n и x есть x.

Remarks: Эффект от вызова каждой из этих функций определяется реализацией if n >= 128.

См. Также [sf.cmath.cyl_neumann].