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) LiteralTypes для представления и манипулирования комплексными числами.
Параметры шаблона
| 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) | получает количество компонентов комплексного числа (специализация шаблона класса) |
|
(C++26) | получает базовый тип вещественного и мнимого чисел комплексного числа (специализация шаблона класса) |
Операции с массивами
Для любого объекта 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 (типы комплексных чисел языка 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 | Функция |
|---|---|---|---|
__cpp_lib_constexpr_complex | 201711L | (C++20) | Константные выражения для простых комплексных математических функций в <complex> |
| 202306L | (C++26) | Ещё больше константных выражений для <complex> |
Пример
#include <cmath>
#include <complex>
#include <iomanip>
#include <iostream>
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';
}Вывод:
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)
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 387 | C++98 |
std::complex не гарантировало совместимость с complex языка C | гарантированная совместимость |
См. также
| Документация по C для арифметики комплексных чисел |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/complex