Spec-Zone.ru › C++

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

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

(конструктор)
создаёт комплексное число
(открытая функция-член)
operator=
присваивает содержимое
(открытая функция-член)
real
возвращает доступ к действительной части комплексного числа
(открытая функция-член)
imag
возвращает доступ к мнимой части комплексного числа
(открытая функция-член)
operator+=operator-=operator*=operator/=
составное присваивание для двух комплексных чисел или комплексного числа и скаляра
(открытая функция-член)

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

operator+operator-
применяет унарные операторы к комплексным числам
(шаблон функции)
operator+operator-operator*operator/
выполняет арифметические операции над двумя комплексными числами или комплексным числом и скаляром
(шаблон функции)
operator==operator!=
(удалены в C++20)
сравнивает два комплексных числа или комплексное число и скаляр
(шаблон функции)
operator<<operator>>
сериализует и десериализует комплексное число
(шаблон функции)
get(std::complex)
(C++26)
получает ссылку на действительную или мнимую часть объекта std::complex
(шаблон функции)
real
возвращает действительную часть
(шаблон функции)
imag
возвращает мнимую часть
(шаблон функции)
abs(std::complex)
возвращает модуль комплексного числа
(шаблон функции)
arg
возвращает фазовый угол
(шаблон функции)
norm
возвращает квадрат модуля
(шаблон функции)
conj
возвращает комплексно-сопряжённое число
(шаблон функции)
proj
(C++11)
возвращает проекцию на сферу Римана
(шаблон функции)
polar
создаёт комплексное число по модулю и фазовому углу
(шаблон функции)
Показательные функции
exp(std::complex)
комплексная экспонента с основанием e
(шаблон функции)
log(std::complex)
комплексный натуральный логарифм с разрезом ветви вдоль отрицательной действительной оси
(шаблон функции)
log10(std::complex)
комплексный десятичный логарифм с разрезом ветви вдоль отрицательной действительной оси
(шаблон функции)
Степенные функции
pow(std::complex)
комплексная степень; один или оба аргумента могут быть комплексными числами
(шаблон функции)
sqrt(std::complex)
комплексный квадратный корень со значениями в правой полуплоскости
(шаблон функции)
Тригонометрические функции
sin(std::complex)
вычисляет синус комплексного числа (\({\small\sin{z}}\)sin(z))
(шаблон функции)
cos(std::complex)
вычисляет косинус комплексного числа (\({\small\cos{z}}\)cos(z))
(шаблон функции)
tan(std::complex)
вычисляет тангенс комплексного числа (\({\small\tan{z}}\)tan(z))
(шаблон функции)
asin(std::complex)
(C++11)
вычисляет арксинус комплексного числа (\({\small\arcsin{z}}\)arcsin(z))
(шаблон функции)
acos(std::complex)
(C++11)
вычисляет арккосинус комплексного числа (\({\small\arccos{z}}\)arccos(z))
(шаблон функции)
atan(std::complex)
(C++11)
вычисляет арктангенс комплексного числа (\({\small\arctan{z}}\)arctan(z))
(шаблон функции)
Гиперболические функции
sinh(std::complex)
вычисляет гиперболический синус комплексного числа (\({\small\sinh{z}}\)sinh(z))
(шаблон функции)
cosh(std::complex)
вычисляет гиперболический косинус комплексного числа (\({\small\cosh{z}}\)cosh(z))
(шаблон функции)
tanh(std::complex)
вычисляет гиперболический тангенс комплексного числа (\({\small\tanh{z}}\)tanh(z))
(шаблон функции)
asinh(std::complex)
(C++11)
вычисляет обратный гиперболический синус комплексного числа (\({\small\operatorname{arsinh}{z}}\)arsinh(z))
(шаблон функции)
acosh(std::complex)
(C++11)
вычисляет обратный гиперболический косинус комплексного числа (\({\small\operatorname{arcosh}{z}}\)arcosh(z))
(шаблон функции)
atanh(std::complex)
(C++11)
вычисляет обратный гиперболический тангенс комплексного числа (\({\small\operatorname{artanh}{z}}\)artanh(z))
(шаблон функции)

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

std::tuple_size<std::complex>
(C++26)
получает размер std::complex
(специализация шаблона класса)
std::tuple_element<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
operator""ifoperator""ioperator""il
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API