Namespaces
Variants

std:: complex

From cppreference.net
Определено в заголовке <complex>
template < class T >
class complex ;
(1)
template <> class complex < float > ;
(2) (до C++23)
template <> class complex < double > ;
(3) (до C++23)
template <> class complex < long double > ;
(4) (до C++23)

Специализации std::complex для cv-неквалифицированных стандартных (до C++23) типов с плавающей точкой являются TriviallyCopyable (начиная с C++23) LiteralType s для представления и манипуляции комплексными числами .

Содержание

Параметры шаблона

T - тип действительной и мнимой частей. Поведение не определено (и может не компилироваться), если T не является cv-неквалифицированным стандартным (до C++23) типом с плавающей запятой и не определено, если T не является NumericType .

Типы членов

Тип члена Определение
value_type T

Функции-члены

создает комплексное число
(public member function)
присваивает содержимое
(public member function)
получает доступ к действительной части комплексного числа
(public member function)
получает доступ к мнимой части комплексного числа
(public member function)
составное присваивание двух комплексных чисел или комплексного числа и скаляра
(public member function)

Функции, не являющиеся членами класса

применяет унарные операторы к комплексным числам
(шаблон функции)
выполняет арифметические операции с комплексными числами для двух комплексных значений или комплексного числа и скаляра
(шаблон функции)
(удалено в C++20)
сравнивает два комплексных числа или комплексное число и скаляр
(шаблон функции)
сериализует и десериализует комплексное число
(шаблон функции)
получает ссылку на действительную или мнимую часть из std::complex
(шаблон функции)
возвращает вещественную часть
(шаблон функции)
возвращает мнимую часть
(шаблон функции)
возвращает модуль комплексного числа
(шаблон функции)
возвращает фазовый угол
(шаблон функции)
возвращает квадрат модуля
(шаблон функции)
возвращает комплексно сопряжённое число
(шаблон функции)
(C++11)
возвращает проекцию на сферу Римана
(шаблон функции)
создаёт комплексное число из модуля и фазового угла
(шаблон функции)
Экспоненциальные функции
экспонента с основанием e для комплексных чисел
(шаблон функции)
комплексный натуральный логарифм с разрезом ветви вдоль отрицательной вещественной оси
(шаблон функции)
комплексный десятичный логарифм с разрезом ветви вдоль отрицательной вещественной оси
(шаблон функции)
Степенные функции
комплексное возведение в степень, один или оба аргумента могут быть комплексными числами
(шаблон функции)
комплексный квадратный корень в области правой полуплоскости
(шаблон функции)
Тригонометрические функции
вычисляет синус комплексного числа ( sin(z) )
(шаблон функции)
вычисляет косинус комплексного числа ( cos(z) )
(шаблон функции)
вычисляет тангенс комплексного числа ( tan(z) )
(шаблон функции)
вычисляет арксинус комплексного числа ( arcsin(z) )
(шаблон функции)
вычисляет арккосинус комплексного числа ( arccos(z) )
(шаблон функции)
вычисляет арктангенс комплексного числа ( arctan(z) )
(шаблон функции)
Гиперболические функции
вычисляет гиперболический синус комплексного числа ( sinh(z) )
(шаблон функции)
вычисляет гиперболический косинус комплексного числа ( cosh(z) )
(шаблон функции)
вычисляет гиперболический тангенс комплексного числа ( tanh(z) )
(шаблон функции)
вычисляет гиперболический арксинус комплексного числа ( arsinh(z) )
(шаблон функции)
вычисляет гиперболический арккосинус комплексного числа ( arcosh(z) )
(шаблон функции)
вычисляет гиперболический арктангенс комплексного числа ( artanh(z) )
(шаблон функции)

Вспомогательные типы

получает размер std::complex
(специализация шаблона класса)
получает базовый тип действительного и мнимого числа для std::complex
(специализация шаблона класса)

Доступ, ориентированный на массивы

Для любого объекта z типа std::complex<T> , reinterpret_cast < T ( & ) [ 2 ] > ( z ) [ 0 ] представляет вещественную часть z , а reinterpret_cast < T ( & ) [ 2 ] > ( z ) [ 1 ] представляет мнимую часть z .

Для любого указателя на элемент массива std::complex<T> с именем p и любого допустимого индекса массива i , reinterpret_cast < T * > ( p ) [ 2 * i ] представляет вещественную часть комплексного числа p [ i ] , а reinterpret_cast < T * > ( p ) [ 2 * i + 1 ] представляет мнимую часть комплексного числа p [ i ] .

Цель данного требования — сохранить бинарную совместимость между типами комплексных чисел библиотеки C++ и типами комплексных чисел языка C (и их массивами), которые имеют идентичные требования к объектному представлению.

Примечания к реализации

Для удовлетворения требований доступа по массивам реализация обязана хранить действительную и мнимую части специализации std::complex в раздельных и смежных областях памяти. Возможные объявления для её нестатических членов данных включают:

  • массив типа value_type[2] , где первый элемент содержит действительную часть, а второй элемент содержит мнимую часть (например, Microsoft Visual Studio);
  • один элемент типа value_type _Complex (инкапсулирующий соответствующий тип комплексных чисел языка C ) (например, GNU libstdc++);
  • два элемента типа value_type , с одинаковым доступом к элементам, содержащие действительную и мнимую части соответственно (например, LLVM libc++).

Реализация не может объявлять дополнительные нестатические члены данных, которые занимали бы память отдельно от действительной и мнимой частей, и должна гарантировать, что специализация шаблона класса не содержит никаких битов заполнения . Реализация также должна гарантировать, что оптимизации доступа к массиву учитывают возможность того, что указатель на value_type может быть псевдонимом для специализации std::complex или массива таких специализаций.

Литералы

Определено во встроенном пространстве имен std::literals::complex_literals
литерал std::complex представляющий чисто мнимое число
(функция)

Примечания

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_constexpr_complex 201711L (C++20) constexpr простые математические функции для комплексных чисел в <complex>
202306L (C++26) Больше constexpr для <complex>
__cpp_lib_tuple_like 202311L (C++26) Добавление кортежного протокола к std::complex

Пример

#include <cmath>
#include <complex>
#include <iomanip>
#include <iostream>
#include <ranges>
int main()
{
    using namespace std::complex_literals;
    std::cout << std::fixed << std::setprecision(1);
    std::complex<double> z1 = 1i * 1i; // квадрат мнимой единицы
    std::cout << "i * i = " << z1 << '\n';
    std::complex<double> z2 = std::pow(1i, 2); // квадрат мнимой единицы
    std::cout << "pow(i, 2) = " << z2 << '\n';
    const double PI = std::acos(-1); // или std::numbers::pi в C++20
    std::complex<double> z3 = std::exp(1i * PI); // формула Эйлера
    std::cout << "exp(i * pi) = " << z3 << '\n';
    std::complex<double> z4 = 1.0 + 2i, z5 = 1.0 - 2i; // комплексно-сопряженные числа
    std::cout << "(1 + 2i) * (1 - 2i) = " << z4 * z5 << '\n';
    const auto zz = {0.0 + 1i, 2.0 + 3i, 4.0 + 5i};
#if __cpp_lib_tuple_like >= 202311L
    for (double re : zz | std::views::keys)
        std::cout << re << ' ';
    std::cout << '\n';
    for (double im : zz | std::views::values)
        std::cout << im << ' ';
    std::cout << '\n';
#else
    for (double re : zz | std::views::transform([](auto z){ return z.real(); }))
        std::cout << re << ' ';
    std::cout << '\n';
    for (double im : zz | std::views::transform([](auto z){ return z.imag(); }))
        std::cout << im << ' ';
    std::cout << '\n';
#endif
}

Вывод:

i * i = (-1.0,0.0)
pow(i, 2) = (-1.0,0.0)
exp(i * pi) = (-1.0,0.0)
(1 + 2i) * (1 - 2i) = (5.0,0.0)
0.0 2.0 4.0
1.0 3.0 5.0

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, являющиеся дефектами, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 387 C++98 std::complex не гарантировал совместимость с C complex гарантирована совместимость

Смотрите также

Документация C для Арифметики комплексных чисел