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) LiteralTypes для представления и манипулирования комплексными числами.

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

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::tuple_element<std::complex>
(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
operator""ifoperator""ioperator""il
(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

Spec-Zone.ru

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