Тип данных 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<