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