Тип данных complex стандартной библиотеки языка C++

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

сла.

В стандартную библиотеку С++ включены также три специализированные версии класса complex для типов float, double и long double:

Листинг 2-специализированные классы

namespace std {

template;

template;

template;

}

Определения этих типов позволяют выполнять некоторые виды оптимизации и безопасное преобразование от одного комплексного типа к другому.

.2 Примеры использования класса complex

Следующая программа демонстрирует возможности класса complex по созданию комплексных чисел, их выводу в разных представлениях и выполнению некоторых типовых операций с комплексными числами.

Листинг 3-Типовые операции класса complex

// num/complex1.cpp

#include

#include namespace std; main()

{

/* Комплексное число с вещественной и мнимой частями

* - Вещественная часть: 4.0

* - Мнимая часть: 3.0

complex c1(4.0.3.0);

/* Создание комплексного числа в системе полярных координат

* - Амплитуда: 5.0

* - Фазовый угол: 0.75

*/

complex c2(polar(5.0.0.75));

// Вывод комплексного числа с вещественной и мнимой частями

cout "c1: " c1 endl: "c2: " c2 endl;

// Вывод комплексного числа в полярных координатах

cout "c1: magnitude: " abs(cl)

" (squared magnitude: " norm(c1) ") "

" phase angle: " arg(c1) endl; cout "c2: magnitude: " abs(c2)

" (squared magnitude: " norm(c2) ") " " phase angle: " arg(c2) endl;

// Вывод сопряжений комплексных чисел

cout "c1 conjugated: " conj(c1) endl; "c2 conjugated: " conj(c2) endl;

// Вывод результата вычисления

cout "4.4 + c1 * 1.8: " 4.4 + c1 * 1.8 endl:

/* Вывод суммы c1 и с2: * - внимание: разные типы!

cout "c1 + с2:

c1+ complex(c2.real(),c2.imag()) endl;

// Прибавление к c1 квадратного корня из c1 и вывод результата

cout "c1 += sqrt(c1): ' (c1 += sqrt(c1)) endl;

}

Примерный результат выполнения программы выглядит так (точный результат зависит от реализации некоторых свойств типа double):

c1: (4.3): (3.65844.3.40819): magnitude: 5 (squared magnitude: 25) phase angle: 0.643501: magnitude: 5 (squared magnitude: 25) phase angle: 0.75: conjugated: (4.-3): conjugated: (3.65844.-3.40819)

.4 + c1 * 1.8: (11.6.5.4)1 + c2: (7.65844.6.40819)

c1 += sqrt(c1): (6.12132.3.70711)

Вторая программа в цикле читает два комплексных числа и вычисляет результат возведения первого числа в степень второго:

Листинг 4-цикл возведения первого числа во второе

// num/complex2.cpp

include

#include

#include

#include namespace std;main()

{ c1. c2; (cin.peek() != EOF)

{

// Ввод первого комплексного числа

cout "complex number c1: ";

cin c1; (!cin)

{ "input error" endl;EXIT_FAILURE;

// Ввод второго комплексного числа cout "complex number c2: "; с2; if (!cin)

{

сout "input error" endl;EXIT_FAILURE:

)(c1 == c2)

{ "c1 and c2 are equal !" endl;

} "c1 raised to the c2: " pow(c1.c2) endl endl;

// Пропуск оставшейся части строки .ignore(numeric_limits::max().'\n');

}

}

В таблице 1 приведены примеры входных данных и полученных результатов.

Таблица 1- Примеры входных данных.

c1C2Результат22c1 raised to c2: (4,0)(16)0.5c1 raised to C2: (4,0)(8,0)0.333333333c1 raised to c2: (2,0)0.99(5)c1 raised to C2: (0.95099,0)(0,2)2c1 raised to c2: (-4,4.8984e-16)(1.7,0.3)0c1 raised to c2: (1,0)(3,4)(-4,3)c1 raised to c2: (4.32424e-05,8.91396e-05)(1.7,0.3)(4.3,2.8)c1 raised to c2: (-4.17622,4.86871)

Обратите внимание: при вводе комплексного числа указывается либо только вещественная часть в виде отдельного значения (в круглых скобках или без), либо вещественная и мнимая части в круглых скобках, разделенные запятыми.

.3 Операции с комплексными числами

Далее описаны операции с комплексными числами, поддерживаемые классом complex.

В таблице 2 перечислены конструкторы и операции присваивания для типа complex. Конструкторам могут передаваться исходные значения вещественной и мнимой частей. Если значения не заданы, они инициализируются конструктором по умолчанию для соответствующего типа.

Таблица 2 - Конструкторы и операции присваивания для типа complex.

ВыражениеЭффектcomplex с Создает комплексное число с нулевой вещественной и мнимой частями (0+0i)complex с(1.3) Создает комплексное число с вещественной частью 1.3 и нулевой мнимой частью (1.3+0i) complex с(1.3, 2.4) Создает комплексное число с вещественной частью 1.3 и мнимой частью 4.2 (1.3+4.2i) complex c1(c2) Создает комплексное число c1 как копию с2polar(4.2)Создает временное комплексное число по полярным координатам (амплитуда р = 4.2, фазовый угол ? = 0) polar(4.2, 0.75) Создает временное комплексное число по полярным координатам (амплитуда р = 4.2, фазовый угол ? = 0.75)conj(c)Создает временное комплексное число, сопряженное iислом с (то есть комплексное число с противоположным знаком мнимой части)c1 = с2Присваивает c1 вещественную и мнимую части с2c1 += с2Прибавляет с2 к c1c1 -= с2Вычитает с2 из c1c1*=c2 Умножает с1 на с2с1/=с2 Делит с1 на с2

Значение существующего комплексного числа может быть изменено только при помощи операторов присваивания. Комбинированные операторы присваивания +=, -=, *= и /= осуществляют суммирование, вычитание, умножение и деление значений двух комплексных операндов.

Вспомогательная функция polar() позволяет создать комплексное число, инициализируемое в полярных координатах (через амплитуду и фазовый угол, указанный в радианах):

// Создание комплексного числа с инициализацией в полярных координатах std::complex

c2(std::polar(4.2.0.75));

Если в создании комплексного числа задействовано неявное преобразование типа, возникает проблема. Например, следующее решение работает нормально: std::complex

c2(std::polar(4.2,0.75)); // OK<