Тип данных complex стандартной библиотеки языка C++
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
/p>
Однако похожая запись со знаком равенства ошибочна:
std::complex
с2 = std::polar(4.2.0.75); // ОШИБКА
Эта проблема рассматривается далее.
Вспомогательная функция conj() позволяет создать комплексное число, инициализированное значением, сопряженным с другим комплексным числом (то есть комплексным числом с противоположным знаком мнимой части):
std: :complex c2(conj(c1));
// c2 инициализируется как
// complex(1.1.-5.5)
2.4 Неявные преобразования типов
Конструкторы специализированных версий для типов float double и long double спроектированы так, чтобы безопасные преобразования типов (например, complex) были:
std::complex cd1 =cf: // OK: безопасное преобразование
std::complex cd2 = сld: // ОШИБКА: нет неявного преобразования
std::complex cd3(cld); // OK: явное преобразование
He существует конструкторов, создающих комплексное число по другим комплексным типам. В частности, нельзя преобразовать complex iелым типом в complex с типом float, double или long double. Впрочем, преобразования можно выполнять при передаче вещественной и мнимой частей в отдельных аргументах:
std::complex cd6(ci.real () .ci .imag()); // OK
К сожалению, операторы присваивания позволяют выполнять небезопасные преобразования. Они определены в виде шаблонов для всех типов, поэтому присваивание допустимо для любых комплексных типов (при возможности пре-образования типа значения):
std: :complex ci;
Эта проблема также относится к функциям polar() и conj(). Например, следующая запись работает нормально:
std::complex c2(std::polar(4.2.0.75)); // OK
С другой стороны, запись со знаком = не работает:
std::complex с2 = std::polar(4.2.0.75); // ОШИБКА
Дело в том, что выражение std::polar(4.2,0.75) создает временный объект complex не определено.
.5 Доступ к данным
В таблице 3 перечислены функции получения атрибутов комплексных чисел.
Таблица 3- Функции получения атрибутов.
Выражение Описаниеc.real()Возвращает значение вещественной части (функция класса)real(c)Возвращает значение вещественной части (глобальная функция)c.lmag()Возвращает значение мнимой части (функция класса)imag(c)Возвращает значение мнимой части (глобальная функция)abs(c)Возвращает модуль с ()norm(c)Возвращает квадрат модуля с(c.real()2+c.imag()2)arg(c)Возвращает фазовый угол в полярном представлении c(?); эквивалент atan2(c.imag(),c.real())
Функции real() и imag() позволяют только прочитать значения вещественной и мнимой частей. Чтобы изменить любую из частей комплексного числа, необходимо присвоить ему новое значение. Например, следующая команда присваивает мнимой части с значение 3.7: std::complex с;
... с = std::complex(c.real().3.7);
2.6 Операции сравнения
Из всех операций сравнения для комплексных чисел определены только проверки на равенство и на неравенство. Операторы == и != определены как глобальные функции, поэтому один из операндов может быть скалярной величиной. В этом случае операнд интерпретируется как вещественная часть, а мнимой части комплексного числа присваивается значение по умолчанию для данного типа (обычно 0).
Другие операции сравнения (например, с оператором < и т. д.) для класса complex не определены. Хотя в принципе для комплексных чисел можно определить порядок сортировки, результат получается недостаточно интуитивным и не приносит особой практической пользы. Например, сравнивать комплексные числа на основании модулей бессмысленно, поскольку два разных комплексных числа (например, 1 и -1) могут иметь одинаковые модули. Конечно, можно изобрести специальный критерий сортировки, например, для двух комплексных чисел c1 и с2 iитать, что c1<c2 при выполнении условия |c1|<|c2|, а в случае совпадения модулей - при выполнении условия arg(c1)<arg(c2). Тем не менее такие искусственные критерии не обладают математическим смыслом.
Таблица 4- Операции сравнения для класса complex<>.
Выражение Описаниеc1 == c2Проверка на равенство c1 и с2 (c1.real()==c2.real() && c1.imag()==c2.imag())с== 1.7Проверка на равенство c1 и 1.7 (c1.real()==1.7 &&c1.imag()==0.0)1.7 == сПроверка на равенство 1.7 и с (c1.real0==1.7 && c1.imag()==0.0)с1 != с2Проверка на неравенство c1 и с2 (c1.real()!=c2.real() || c1.imag()!=c2.imag())с != 1.7Проверка на неравенство c1 и 1.7 (c1.real()!=1.7 || c1.imag()!=0.0)1.7 != сПроверка на неравенство 1.7 и с (c1.real()!=1.7 || c1.imag()!=0.0)
Из этого следует, что тип complex не может быть типом элементов ассоциативных контейнеров (без определения пользовательского критерия сортировки). Дело в том, что для сортировки элементов по умолчанию ассоциативные контейнеры используют объект функции less<>, который вызывает оператор <
Определение пользовательского оператора < позволяет сортировать комплексные числа и использовать их в ассоциативных контейнерах. Нельзя нарушать стандартное пространство имен. Пример:
Листинг 5-правильное пространство имен
template
bool operator& c1.
const std::complex& c2)
{std::abs(cl)<std;;abs(c2) ||
(std::abs(cl)==std::abs(c2) &&
std: :arg(cl)<std::arg(c2));
}
.7 Арифметические операции
Для комплексных чисел определены четыре базовые арифметические операции, а также операции изменения знака.
Таблица 5- Ариф