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) литеральными типами, предназначенными для представления и обработки комплексных чисел.
Параметры шаблона
| T | - | тип действительной и мнимой частей. Поведение не определено (и компиляция может завершиться ошибкой), если T не является типом с плавающей точкой без cv-квалификаторов стандартным(до C++23), и является неопределённым, если T не удовлетворяет требованиям NumericType. |
Типы-члены
| Тип-член | Определение |
|---|---|
value_type |
T |
Функции-члены
| создаёт комплексное число (открытая функция-член) |
|
| присваивает содержимое (открытая функция-член) |
|
| возвращает доступ к действительной части комплексного числа (открытая функция-член) |
|
| возвращает доступ к мнимой части комплексного числа (открытая функция-член) |
|
| составное присваивание для двух комплексных чисел или комплексного числа и скаляра (открытая функция-член) |
Функции, не являющиеся членами
| применяет унарные операторы к комплексным числам (шаблон функции) |
|
| выполняет арифметические операции над двумя комплексными числами или комплексным числом и скаляром (шаблон функции) |
|
|
(удалены в C++20) | сравнивает два комплексных числа или комплексное число и скаляр (шаблон функции) |
| сериализует и десериализует комплексное число (шаблон функции) |
|
|
(C++26) | получает ссылку на действительную или мнимую часть объекта std::complex (шаблон функции) |
| возвращает действительную часть (шаблон функции) |
|
| возвращает мнимую часть (шаблон функции) |
|
| возвращает модуль комплексного числа (шаблон функции) |
|
| возвращает фазовый угол (шаблон функции) |
|
| возвращает квадрат модуля (шаблон функции) |
|
| возвращает комплексно-сопряжённое число (шаблон функции) |
|
|
(C++11) | возвращает проекцию на сферу Римана (шаблон функции) |
| создаёт комплексное число по модулю и фазовому углу (шаблон функции) |
|
Показательные функции |
|
| комплексная экспонента с основанием e (шаблон функции) |
|
| комплексный натуральный логарифм с разрезом ветви вдоль отрицательной действительной оси (шаблон функции) |
|
| комплексный десятичный логарифм с разрезом ветви вдоль отрицательной действительной оси (шаблон функции) |
|
Степенные функции |
|
| комплексная степень; один или оба аргумента могут быть комплексными числами (шаблон функции) |
|
| комплексный квадратный корень со значениями в правой полуплоскости (шаблон функции) |
|
Тригонометрические функции |
|
| вычисляет синус комплексного числа (\({\small\sin{z}}\)sin(z)) (шаблон функции) |
|
| вычисляет косинус комплексного числа (\({\small\cos{z}}\)cos(z)) (шаблон функции) |
|
| вычисляет тангенс комплексного числа (\({\small\tan{z}}\)tan(z)) (шаблон функции) |
|
|
(C++11) | вычисляет арксинус комплексного числа (\({\small\arcsin{z}}\)arcsin(z)) (шаблон функции) |
|
(C++11) | вычисляет арккосинус комплексного числа (\({\small\arccos{z}}\)arccos(z)) (шаблон функции) |
|
(C++11) | вычисляет арктангенс комплексного числа (\({\small\arctan{z}}\)arctan(z)) (шаблон функции) |
Гиперболические функции |
|
| вычисляет гиперболический синус комплексного числа (\({\small\sinh{z}}\)sinh(z)) (шаблон функции) |
|
| вычисляет гиперболический косинус комплексного числа (\({\small\cosh{z}}\)cosh(z)) (шаблон функции) |
|
| вычисляет гиперболический тангенс комплексного числа (\({\small\tanh{z}}\)tanh(z)) (шаблон функции) |
|
|
(C++11) | вычисляет обратный гиперболический синус комплексного числа (\({\small\operatorname{arsinh}{z}}\)arsinh(z)) (шаблон функции) |
|
(C++11) | вычисляет обратный гиперболический косинус комплексного числа (\({\small\operatorname{arcosh}{z}}\)arcosh(z)) (шаблон функции) |
|
(C++11) | вычисляет обратный гиперболический тангенс комплексного числа (\({\small\operatorname{artanh}{z}}\)artanh(z)) (шаблон функции) |
Вспомогательные типы
|
(C++26) | получает размер std::complex (специализация шаблона класса) |
|
(C++26) | получает базовый тип действительной и мнимой частей числа для 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 |
|
|---|---|
|
(C++14) | литерал std::complex, представляющий чисто мнимое число (функция) |
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_constexpr_complex | 201711L | (C++20) |
Простые математические функции для комплексных чисел в <complex> с поддержкой constexpr |
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; // imaginary unit squared
std::cout << "i * i = " << z1 << '\n';
std::complex<double> z2 = std::pow(1i, 2); // imaginary unit squared
std::cout << "pow(i, 2) = " << z2 << '\n';
const double PI = std::acos(-1); // or std::numbers::pi in C++20
std::complex<double> z3 = std::exp(1i * PI); // Euler's formula
std::cout << "exp(i * pi) = " << z3 << '\n';
std::complex<double> z4 = 1.0 + 2i, z5 = 1.0 - 2i; // conjugates
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++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Исправленное поведение |
|---|---|---|---|
| LWG 387 | C++98 |
Совместимость std::complex с C complex не гарантировалась | совместимость гарантирована |
См. также
| Документация по C для арифметики комплексных чисел |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/complex